[DELPHI] DLL + Thread Problem
Ich habe mal wieder ein Problem, also auf ein neues :D
Und zwar möchte ich in einer DLL einen Thread starten.
Das funktioniert aber komischerweiße nicht.
Die .exe, die die DLL ladet stürtzt dann einfach ab.
Wenn ich ein
in die DLLMain mache, funktioniert die DLL zwar, aber die .exe hört einfach auf zu arbeiten.
Ich benutze BeginThread. Mit CreateThread habe ich es auch versucht, da habe ich das gleiche Problem.
Hoffe ihr versteht wie ich das meine, und könnt mir weiter helfen.
Falls euch die Informationen nicht reichen, bitte sagen :D
Danke im Vorraus !
AW: [DELPHI] DLL + Thread Problem
Ohne Code kann man da nur raten.
System.IsMultiThread gesetzt? Fehlende Synchronisierung? ...
AW: [DELPHI] DLL + Thread Problem
Danke schonmal für deine Hilfe.
Code:
IsMultiThread := True;
Das habe ich, aber was meinst du mit fehlender Synchronisierung?
(Ich editier gleich den Code hier rein)
---------- Post added at 00:36 ---------- Previous post was at 00:22 ----------
So hier die Codes:
DLL
Code:
library test;
uses
SysUtils,
Windows,
Dialogs;
{$R *.res}
function tThread(p: Pointer): Integer;
begin
while True do
begin
ShowMessage('Endlosschleife soll bleiben...');
end;
end;
function StartPlugin(sParam: PChar): PChar; stdcall;
Var
Id:DWORD;
begin
BeginThread(nil,0,@tThread,nil,0,id);
EndThread(0); // Ohne das kackt die exe sofort nach dem starten der Threads ab.
end;
exports
StartPlugin;
Begin
IsMultiThread := True;
end.
EXE
Code:
program bin;
uses
SysUtils, Windows;
type
TRealFunction = function(sParam: PChar): PChar; stdcall;
function LoadDLL(DllName: PChar; Einstieg: PChar; sParam: PChar): string;
var
RealFunction: TRealFunction;
Handle: THandle;
begin
Handle := LoadLibrary(DllName);
if Handle <> 0 then begin
@RealFunction := GetProcAddress(Handle, Einstieg);
if @RealFunction <> nil then begin
result := PChar(RealFunction(sParam));
end;
FreeLibrary(Handle);
end;
end;
Var
sString: String;
begin
// sString wird eig. ausgelesen
sString := 'lal';
while True do
begin
sleep(5000);
if sString = 'lal' then
LoadDLL(PAnsiChar(GetCurrentDir + '\test.dll'),'StartPlugin',PAnsiChar('übergabe-string'));
// hier immer wieder ein command wiederholen
// allerdings passiert nichts mehr, nachdem die dll geladen wird
end;
end.
AW: [DELPHI] DLL + Thread Problem
In StartPlugin musst Du auf den Thread warten und in einem Thread darfst Du keine VCL Funktionen aufrufen, da diese nicht threadsafe ist.
Also so ungefähr:
Code:
function tThread(p: Pointer): Integer;
begin
while True do
begin
MessageBox(0, 'test', 'bla', 0);
//ShowMessage('Endlosschleife soll bleiben...');
end;
end;
function StartPlugin(sParam: PChar): PChar; export;
Var
Id:DWORD;
begin
waitforsingleobject(BeginThread(nil,0,@tThread,nil,0,id),infinite);
end;
AW: [DELPHI] DLL + Thread Problem
Hmmm...
Der Thread bleibt offen, und das Programm stürtzt nicht ab. Das ist schonmal gut.
Aber die exe macht in der while Schleife einfach nicht weiter...
Sonst noch eine Idee?
AW: [DELPHI] DLL + Thread Problem
Okay, habe das Problem gelöst.
Ich muss in der EXE mit zwei Threads arbeiten, damit die EXE normal weiterläuft.
Danke inout für deine Hilfe.
AW: [DELPHI] DLL + Thread Problem
Stimmt, so wie es jetzt ist macht es auch nicht viel Sinn ;)
Es liegt wohl daran, dass Du die DLL lädst, die Funktion ausführst und die DLL sofort wieder freigibst. Kommentiere in der EXE das FreeLibrary mal aus, dann wird es funktionieren.
Du solltest also das Handle mit LoadLibrary im Hauptprogramm erstellen, der Funktion LoadDLL übergeben, die dann nur die DLL Funktion startet und danach die DLL im Hauptprogramm entladen.
Edit: Das WaitForSingleObject musst Du dann natürlich wieder rausnehmen.