Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi LoadLibrary in Thread? (https://www.delphipraxis.net/163368-loadlibrary-thread.html)

himitsu 26. Sep 2011 20:54

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 MSDN-Library durchsuchenCreateThread, darin dann MSDN-Library durchsuchenLoadLibrary
und notfalls wieder über MSDN-Library durchsuchenFreeLibraryAndExitThread freigeben.


Aber sobald LoadLibrary aufgerufen wird, endet es in einer ausgegrauten Anwendung und
Zitat:

[Window Title]
Project5.exe

[Main Instruction]
Project5.exe funktioniert nicht mehr

[Content]
Es wird nach einer Lösung für das Problem gesucht...

[Abbrechen]
:cry:

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:

brechi 26. Sep 2011 22:58

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

Luckie 26. Sep 2011 23:06

AW: LoadLibrary in Thread?
 
Zitat:

Zitat von himitsu (Beitrag 1126818)

Autsch. Benutze BeginThread, sonst ist dein Heap nicht threadsafe.

himitsu 27. Sep 2011 08:06

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:
library TestDLL;

uses
  Windows;

procedure Init; stdcall;
begin
  MessageBox(0, 'beep', 'init', 0);
end;

exports
  Init;

begin
end.
Wobei es z.B. auch mit der user32.dll knallt, wenn ich versuche diese zu laden.

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.

Luckie 27. Sep 2011 08:50

AW: LoadLibrary in Thread?
 
Woher soll ich wissen, was du für einen Speichermanager benutzt? :roll:

Luckie 27. Sep 2011 09:08

AW: LoadLibrary in Thread?
 
Delphi-Quellcode:
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;
Geht ohne Probleme mit Delphi 7.

himitsu 27. Sep 2011 09:12

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.

Luckie 27. Sep 2011 09:32

AW: LoadLibrary in Thread?
 
Zeig einfach mal etwas Code oder mach ein Testprojekt.

himitsu 27. Sep 2011 09:55

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 19:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz