karek314: napisałeś na forum, tak jak Tobie radzilem na PW, ale źle sprecyzowales. Ty coś z injekcją dllki kombinujesz,
a ja nie mam pojęcia jak wstrzyknąć kod z TMemoryStreama, bo o ile chodzi o samo użycie dllki pobranej z Internetu z
www przez Synapse, a nie z dysku to już przykladowy kod Tobie podesłalem i on działa, bo korzysta z tego modułu pod
wskazanym tu linkiem, tylko że znowu Twoj kod zacytowany przez Ciebie jest jakiś dziwny. Bo ja się dosyć slabo znam
na tych funkcjach co podałeś. Niektorych z nich nigdy nie używałem poza chyba XxxxxxProcesMemory. Teraz dopiero
zauważyłem, że używasz w jakiś dziwny, jak dla mnie, sposob funkcji LoadLibrary. Nie wiem dlaczego akurat tak, a
nie po prostu LoadLibrary... a i jak widzialeś w moim przykładowym kodzie dllloader nie laduje dllki przez LoadLibrary,
bo ta funkcja ładuje z dysku. Popatrz jeszcze raz na poniższy kod. Do pozostałych czytających, o ile potraficie mu jakoś
pomóc to dopasujcie Jego kod z wycinka do tego poniżej. Tylko ja użyłem, wiadomej funkcji DLL.FindExport z tej klasy
TDllLoader. Natomiast w Twoim wycinku, nie widzę, abyś w ogóle ładowal jakąś funkcję z dllki. Nie znam się na takim
sposobie ładowania dll, a poniżej podaję kod jaki mu wysłałem. Link do dllki jest nadal aktualny, więc kod oczywiście
działa, tylko że pytający chce metodą, ktorej nie rozumiem coś zrobić z pobraną już dllką z TMemoryStream Document
Moja przykładowa dllka
library dll_from_net;
uses
Windows;
procedure TestFunc; stdcall;
begin
MessageBox(GetActiveWindow,
PChar('Jeżeli widzisz ten komunikat, to wszystko działa prawidłowo.'),
PChar('Komunikat z dll'), MB_ICONINFORMATION + MB_OK);
end;
exports
TestFunc;
begin
end.
Kod programu:
//...
uses
dllloader, httpsend;
procedure TMainForm.FormCreate(Sender: TObject);
begin
Application.Title := Caption;
end;
procedure TMainForm.GetBtnClick(Sender : TObject);
const
Dll_Url = 'http://swos-gg.cba.pl/a/dll_from_net.dll';
Opera_UserAgent = 'Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.6.30';
var
DLL : TDllLoader;
SynHttp : THttpSend;
TestFunc : procedure;
begin
DLL := TDllLoader.Create;
SynHttp := THttpSend.Create;
SynHttp.KeepAlive := True;
SynHttp.Protocol := '1.1';
SynHttp.UserAgent := Opera_UserAgent;
SynHttp.HTTPMethod('GET', Dll_Url);
if (SynHttp.ResultCode <> 404) and (SynHttp.Document.Size > 0) then
begin
DLL.Load(SynHttp.Document);
TestFunc := DLL.FindExport('TestFunc');
if @TestFunc <> nil then
begin
TestFunc;
end;
end;
DLL.Free;
SynHttp.Free;
end;