Einzelnen Beitrag anzeigen

venice2
(Gast)

n/a Beiträge
 
#10

AW: DLL nicht automatisch laden

  Alt 3. Aug 2020, 12:12
Zitat:
So ganz ohne Code
Ganz ohne. Hast du ihn für Delphi übersehen?

Eine DLL Dynamisch zu laden ist nicht das Problem und damit geht es auch. (ganz so dumm bin ich dann doch nicht!)
Nur wie gesagt verstehe nicht das es mit einer statisch geladenen DLL in C++ funktioniert und in Delphi halt nicht.

Delphi-Quellcode:
unit Dynamic_Trace;

interface

uses Windows;

const
  dllfile = 'Tracer.dll';

var
  TRACE_Handle: Thandle = 0;
  Trace_Loaded: Bool = false;

  Trace: function(Msg: PWideChar): LongInt; stdcall;

function Load_TRACEDLL(const dllfilename: string): BOOL;
procedure Unload_TRACEDLL;

implementation

function Load_TRACEDLL(const dllfilename: string): BOOL;
var
  oldmode: integer;
begin
  if TRACE_Handle <> 0 then
    Result := true
  else
  begin
    oldmode := SetErrorMode($8001);
    TRACE_Handle := LoadLibrary(PWideChar(dllfilename));
    SetErrorMode(oldmode);
    if TRACE_Handle <> 0 then
    begin
      @Trace := GetProcAddress(TRACE_Handle, PAnsiChar('Trace'));
      if (@Trace = nil) then
      begin
        FreeLibrary(TRACE_Handle);
        TRACE_Handle := 0;
      end;
    end;
    Result := (TRACE_Handle <> 0);
  end;

end;

procedure Unload_TRACEDLL;
var
  HWND: DWord;
begin
  if TRACE_Handle <> 0 then
  begin
    HWND := FindWindow('TRACER', 'TRACER');
    if HWND <> 0 then
    begin
      TRACE_Handle := SendMessage(HWND, WM_DESTROY, 0, 0);
      Trace_Loaded := false;
    end else
    begin
      TRACE_Handle := 0;
      Trace_Loaded := false;
    end;
  end;
end;

end.
Delphi-Quellcode:
  if UseDebug then
  begin
    if not Trace_Loaded then
    begin
      Trace_Loaded := Load_TRACEDLL(ExtractFilePath(paramstr(0)) +
        dllfile);
      if Trace_Loaded then
      begin
        Trace('');
        repeat
          HWND := FindWindow('TRACER', 'TRACER');
          WinprocessMessages;
        until HWND <> 0;
      end;
    end;
  end;
Und der Aufruf.

Delphi-Quellcode:
if Trace_Loaded then
  Trace(PWideChar('Init ' + 'Value = ' + BoolToStr(bInit)));
So startet die Anwendung auch wenn die DLL nicht existiert.

Aber meine Frage ist damit nicht beantwortet denn ich verwende so Dynamisches und kein statisches laden.

Geändert von venice2 ( 3. Aug 2020 um 13:22 Uhr)
  Mit Zitat antworten Zitat