Dynamiczne ładowanie funkcji o nieznanej ilości parametrów oraz ich typie z DLL

0

Mam pytanie:
Powiedzmy że piszę aplikację i chcę w niej zaimplementować możliwość dodatków pisanych osobno jako DLLe w których znajdują się funkcje.
Wiem że aby dynamicznie zaimportować jakąś funkcję\procedurę z parametrami muszę zrobić coś takiego:

 
procedure WywolajFunkcje;
type func = procedure(HWND:Integer;text: String;caption:String;flags:Integer);
var
DLL: THandle;
funkcja: func;
begin
	try
	DLL := LoadLibrary('User32.dll');
	funkcja := GetProcAddress(DLL,'MessageBox');
	funkcja(0,'Hello World','Message',MB_OK + MB_ICONWARNING);
	if @funkcja = nil then raise Exception.Create('Błąd podczas ładowania funkcji');
	finally
	FreeLibrary(DLL);
end;
end;

Ale jak załadować dużą liczbę funkcji\procedur z dll oraz jak je wykorzystać nie znając ich parametrów?
Tak mnie to zaciekawiło, próbowałem ale bez skutku więc postanowiłem zapytać.
Można byłoby zrobić funkcje eksportującą liczbę funkcji ale potem trzeba by to było jakoś 'obrobić'

0

Rzeczywiście bez sensu, ale zapomniałem tę linijkę przenieść niżej

0

Aby wywoływać funkcje posiadające parametry z dllki należy znać konstrukcje tej funkcji. Dlatego wszelkie poważne dllki posiadają dokumentacje i przykłady. Jak choćby bass.dll. A i w przypadku dllek, nie wolno używać typów string - tylko przynajmnniej PChar. Zauważ też, że nawet programy oferujące system pluginów też mają do nich dokumentacje. Także na pewno nic nie robic się na ślepo. Pozostaje często jedynie kwestia tłumaczenia plików nagłówkowych z jakiegoś innego języka jak C++, przykładowo na Delphi.

2

Bez odpowiednich nagłówków lub dokumentacji nie zdziałasz nic. No powiedzmy...

Możesz również przeanalizować bibliotekę np. w IDA, która odbuduje większość funkcji i zobaczysz ile parametrów jest wykorzystywanych, a dzięki statycznej analizie kodu, ale prędzej debuggowaniu tej funkcji - dowiesz się mniej więcej jakie to parametry. Problemem nie są parametry typu int, string, char, ale np. bardziej złożone struktury (przekazywane w formie wskaźnika), wtedy czeka Cię dłuższa sesja przy analizie tego kodu.

0

@olesio - dzięki mi bardziej chodzi o to, że użytkownik pisze swój dodatek, a program ładuje automatycznie z niego funkcje (jako dodatku) i dodaje jako nowe opcje

@Bartosz Wójcik - można nakazać programistom stworzyć jednolitą funkcję o jednolitej nazwie która by te funkcje odczytywała

0

Właśnie wtyczki tylko w postaci DLL

0

Zacznij pisac w C# to sie bedzie dalo. Wszystkie opisy funkcji beda w metadanych. W kodzie natywnym bez dekompilowania albo implementacji metadanych bedzie ciezko. (Przy ladowaniu kodu natywnego z .NETa oczywiscie dalej ten sam problem)

0

Pozostaje chyba to o czym wspomniałem wcześniej: funkcja która MUSI być w każdym DLLu i która przekazuje informacje o funkcjach wraz z ich parametrami

i przy ładowaniu modułu program ją wykonuje

1 użytkowników online, w tym zalogowanych: 0, gości: 1