![]() |
LoadLibrary in Thread?
n'abend,
eigentlich wollte ich "nur" eine DLL innerhalb eines Threads laden (wenn sie noch nicht geladen ist), aber gerade da knallt es etwas geräuchlos. Also ![]() ![]() und notfalls wieder über ![]() Aber sobald LoadLibrary aufgerufen wird, endet es in einer ausgegrauten Anwendung und Zitat:
Ich dachte ich hätte mal irgendwo was über LoadLibrary und Threads gelesen, aber ich finde es nicht mehr. :? TThread, Synchronize und Co. fallen allerdings weg, da NonVCL und kein direkter Zugriff auf den Hauptthread. OK, einen etwas umständlichen Weg über den Hauptthread gibt es vielleicht noch (muß ich noch ausprobieren), aber vielleicht kennt ja jemand noch einen "direkten" Weg? Da es aber FreeLibraryAndExitThread gibt, liegt ja die Vermutung nahe, daß es doch irgendwie gehn muß. :gruebel: |
AW: LoadLibrary in Thread?
Wird wohl weniger der Thread/LoadLibrary sein, sondern eher die DLL die da mist macht.
Lad sie doch einfach im Hauptthread direkt, oder halt mit 2xEvents und 2xWaitForSingleObject |
AW: LoadLibrary in Thread?
Zitat:
|
AW: LoadLibrary in Thread?
BeginThread macht nichts Anderes, als IsMultiThread auf True zu setzen, was mir nichts bringt, da der Delphi-Speichermanager nicht verwendet wird
und auch die anderen ein/zwei Dinge, worauf dieses Einfluß hat, nicht vorkommen. Ansonsten fängt das nur die Exceptions ab. OK, dann verreckt wenigstens nicht gleich die ganze App, aber LoadLibrary funktioniert dennoch nicht. PS: Die DLL macht nicht viel.
Delphi-Quellcode:
Wobei es z.B. auch mit der user32.dll knallt, wenn ich versuche diese zu laden.
library TestDLL;
uses Windows; procedure Init; stdcall; begin MessageBox(0, 'beep', 'init', 0); end; exports Init; begin end. Und nein, die MessageBox ist nicht Schuld, den diese wird auch angezeigt, wenn man sie in einem Thread aufrufen würde. Außerdem läuft ja schon LoadLibrary schief und da wird dieses noch garnicht aufgerufen. |
AW: LoadLibrary in Thread?
Woher soll ich wissen, was du für einen Speichermanager benutzt? :roll:
|
AW: LoadLibrary in Thread?
Delphi-Quellcode:
Geht ohne Probleme mit Delphi 7.
type
TInit = procedure; stdcall; function MyTestThread(Param: Pointer): Integer; var hTestDLL: THandle; TestDLLInit: TInit; begin hTestDLL := LoadLibrary(PChar(ExtractFilepath(ParamStr(0)) + 'TestDLL.dll')); if hTestDLL <> 0 then begin @TestDLLInit := GetProcAddress(hTestDLL, 'Init'); if Assigned(TestDLLInit) then begin TestDLLInit; end else MessageBox(0, PChar(SysErrorMessage(GetLastError)), 'GetProcAddress', MB_ICONSTOP); end else MessageBox(0, PChar(SysErrorMessage(GetLastError)), 'LoadLibrary', MB_ICONSTOP); Result := 0; end; procedure TForm1.btn1Click(Sender: TObject); var ThreadID: Cardinal; begin CloseHandle(BeginThread(nil, 0, MyTestThread, nil, 0, ThreadID)); end; |
AW: LoadLibrary in Thread?
VirtualAlloc?
Die Codes selber nutzen nur direkt die WinAPI. Ich finde es ja schon merkwürdig, daß LoadLibrary überhaupt eine Exception wirft. :shock: Win7 + D2010. Nja, aktuell muß ich mich noch etwas für meinen Code schämen ... werd' ihn nur noch schell aufräumen. |
AW: LoadLibrary in Thread?
Zeig einfach mal etwas Code oder mach ein Testprojekt.
|
AW: LoadLibrary in Thread?
Das Testprojekt ist schon angefangen, aber der Rest wird halt bis nach der Arbeit warten müssen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz