ďťż

Ładny brzuch

Witam Was.
Przygotowuję sobie w programie małą obsługą pluginów.
Napotkałem problem, nie mogę przypisać procedury, kóra ma zostać wykonana do zdarzenia kliknięcia na pozycje TMainMenu.

procedure LoadLibraries; procedure UnLoadLibraries; var DllsTable : Array of THandle; //tablica uchwytów DLLi w programie implementation uses Unit1; procedure UnLoadLibraries; //zwolnienie bibliotek var i:integer; begin for i:=0 to High(DllsTable) do FreeLibrary(DLLsTable[i]); end; procedure LoadLibraries; //załadowanie bibliotek var GetInfoFunc : function:WEPluginInfo; stdcall; Path: String; SR : TSearchRec; Found : Integer; RekordInfo: WePluginInfo; MenuItem: TMenuItem; begin Path:=ExtractFilePath(ParamStr(0))+'Plugins\'; Found := FindFirst(path+'*.*', faAnyFile, SR); while (Found = 0) do begin if ExtractFileExt(path+SR.Name) = '.dll' then begin SetLength(DllsTable, High(DllsTable)+2); DLLsTable[High(DllsTable)] := LoadLibrary(PChar(path+SR.Name)); try @GetInfoFunc := GetProcAddress(DLLsTable[High(DllsTable)], 'WePluginGetInfo'); if @GetInfoFunc=nil then Application.MessageBox(Pchar('Procedura WePluginGetInfo nie została odnaleziona w bibliotece '+SR.Name+' Biblioteka nie zostanie załadowana.'), PChar(Application.Title),MB_SYSTEMMODAL or MB_OK or MB_IConstop) else begin RekordInfo:=GetInfoFunc; if RekordInfo.PlugType = 1 then begin Menuitem := TMenuItem.Create(nil); MenuItem.Caption := RekordInfo.ShortName; MenuItem.Hint:=IntToStr(High(DllsTable)); MenuItem.Tag:=5; MenuItem.onclick:=GetProcAddress(DLLsTable[High(DllsTable)], 'OnWePluginExecute'); //tutaj //dostaje bład: Incompatible types TNotifyEvent and Pointer... tylko, że w kilku innych unitach wg. tej samej zasady wszystko działało if RekordInfo.PlugMenuPos.SubMenuBarItem = -1 then glowna.MainMenu1.Items[RekordInfo.PlugMenuPos.MenuBarItem].Insert(Glowna.MainMenu1.Items[ RekordInfo.PlugMenuPos.MenuBarItem].Count,Menuitem) else glowna.MainMenu1.Items[RekordInfo.PlugMenuPos.MenuBarItem][RekordInfo.PlugMenuPos.SubMenuBarItem] .Insert(0,Menuitem); end else if RekordInfo.PlugType = 2 then begin //panel end; //include plugin end; except Application.MessageBox('Wystąpił błąd podczas wszczepiania bibliotek do programu!', PChar(Application.Title), MB_OK or MB_SYSTEMMODAl or MB_IConerror) end; end; Found := FindNext(SR); end; FindClose(SR); end;

Tam gdzie jest błąd dałem komentarz i opisałem.

(DLLsTable[High(DllsTable)]) - to jest oczywiście uchwyt DLLki wzięty z tablicy.
Użytkownik DJ Mentos edytował ten post 02 kwiecień 2008, 16:16



Witam Was.
Przygotowuję sobie w programie małą obsługą pluginów.
Napotkałem problem, nie mogę przypisać procedury, kóra ma zostać wykonana do zdarzenia kliknięcia na pozycje TMainMenu.
(...)
Tam gdzie jest błąd dałem komentarz i opisałem.

(DLLsTable[High(DllsTable)]) - to jest oczywiście uchwyt DLLki wzięty z tablicy.


Tak na moje oko, to GetProcAddress zwraca wskaźnik (Pointer) na funkcję. Tego wprost nie możesz przypisać do zdarzenia TNotifyEvent, musisz dokonać rzutowania na funkcję.

Tak dla przykładu:
procedure TFirstForm.LoadPlug; var DLLHandle : THandle; func : procedure; begin DLLHandle := LoadLibrary('MyDLL.dll'); try @func:= GetProcAddress(DLLHandle, 'func'); func; //wykonanie finally FreeLibrary(DLL); end; end;

To oczywiście tylko przykład, ale może Ci się przydać bo z małymi przeróbkami przejdzie także u Ciebie.

A jakbyś jeszcze gdzieś się zagubił to looknij na http://4programmers....ozdzia%C5%82_10

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •