![]() |
Re: DLL: Prozedureinsprungpunkt nicht gefunden
Äh, warum sollte eine versionsabhängige Kompilierung nicht funktionieren? Mittels Compilerschalter kann ich doch bestimmen, ob die DLL und die Funktion gelinkt werden soll oder nicht. Das Entwicklungssystem spielt dabei doch keine Rolle.
|
Re: DLL: Prozedureinsprungpunkt nicht gefunden
Delphi-Quellcode:
Da kommt jetz en Fehler wegen falschem Parameter, ich denke es liegt daran das ich String übergebe, aber LPCWSTR(PWideChar) gefordert ist. Wie wandle ich das denn um :shock: PChar(derstring) geht jedenfalls nicht
var
LVersion : TWindowsVersionInfo; LPath:PChar; LHandle: THandle; LCreate : TShutdownBlockReasonCreate; begin LVersion := TWindowsVersionInfo.Create(self); try if LVersion.MajorVersion >= 6 then begin GetSystemDirectory(LPath,max_Path+1); LHandle:=LoadLibrary(PChar(LPath+'\user32.dll')); @LCreate := GetProcAddress(LHandle,PChar('ShutdownBlockReasonCreate')); if LCreate(self.Handle,'Testprogramm für ShutdownBlockReason')then SNLogger.log('Shutdown wird geblockt') else SNLogger.log('Blocken nicht möglich'+SysErrorMessage(GetLastError)); end; finally LVersion.Free; end; |
Re: DLL: Prozedureinsprungpunkt nicht gefunden
Zitat:
|
Re: DLL: Prozedureinsprungpunkt nicht gefunden
Zitat:
Delphi-Quellcode:
var s:string;
PWideChar(WideString(s)) |
Re: DLL: Prozedureinsprungpunkt nicht gefunden
Das Ermitteln des Systempaths ist unnötig, da LoadLibrary sowieso im Applications-Verzeichnis und in diversen anderen Windows Verzeichnissen ala System32 nachsieht. (soweit ich weiß)
Weiterhin würde ich nach GetProcAddress prüfen, ob die Adresse, die ermittelt wurde, NULL (NIL) ist
Code:
MfG
If the function fails, the return value is NULL.
|
Re: DLL: Prozedureinsprungpunkt nicht gefunden
Achja, und weil die user32.dll ganz sicher schon geladen ist, reicht ein "Getmodulehandle" anstatt Loadlibrary auch aus.
|
Re: DLL: Prozedureinsprungpunkt nicht gefunden
die Umwandlung funzt, aber kommt immernoch die Meldung "Falscher Parameter"
Hier mal die Deklaration der Methoden:
Delphi-Quellcode:
Die habe ich doch richtig übertragen oder?
type
TShutdownBlockReasonCreate = function (hWnd:HWND;pwszReason:LPCWSTR):BOOL; TShutdownBlockReasonDestroy = function (hWnd:HWND):BOOL; { Das ist die Deklaration der Methoden vom Anfang function ShutdownBlockReasonCreate(hWnd:HWND;pwszReason:LPCWSTR):BOOL;stdcall;external user32 name 'ShutdownBlockReasonCreate'; function ShutdownBlockReasonDestroy(hWnd:HWND):BOOL;stdcall;external user32 name 'ShutdownBlockReasonDestroy'; function ShutdownBlockReasonQuery(hWnd:HWND;pwszBuff:LPWSTR;pcchBuff:DWORD):BOOL;stdcall;external user32 name 'ShutdownBlockReasonQuery'; } Also ich erkenn grad keinen Fehler :( (Was aber nix heissen muss :duck: ) @Roter Kasten:
Delphi-Quellcode:
Hab mal die Sachen berücksichtigt. die zwei if's hab ich damit ich beim debuggen besser seh wo ich bin.
var
LVersion : TWindowsVersionInfo; LPath:PChar; LHandle: THandle; LCreate : TShutdownBlockReasonCreate; begin LVersion := TWindowsVersionInfo.Create(self); try if LVersion.MajorVersion >= 6 then begin LHandle:=GetModuleHandle(PChar('user32.dll'));//TODO: Was wenn nicht eingeloggt? @LCreate := GetProcAddress(LHandle,PChar('ShutdownBlockReasonCreate')); if Assigned(LCreate) then begin if LCreate(self.Handle,PWideChar(WideString('ShutdownBlockReason Test')))then SNLogger.log('Shutdown wird geblockt') else SNLogger.log('Blocken nicht möglich'+SysErrorMessage(GetLastError)); end; end; finally LVersion.Free; end; Hab den aufruf von LCreate(self....) mal zu den überwachten Ausdrücken gemacht und dort bekomm ich ein true angezeigt. hier springt das ganze dann aber ins else :wall: |
Re: DLL: Prozedureinsprungpunkt nicht gefunden
@sirius
Ansich ist es eigentlich eh völlig egal, da LoadLibrary - falls die zu Ladende Library schon vorhanden ist - intern einfach nur einen Counter erhöht und die Adresse, in der die Library gemappt ist, zurückgibt! EDIT: EDIT2: ups .. sorry MfG |
Re: DLL: Prozedureinsprungpunkt nicht gefunden
Zitat:
|
Re: DLL: Prozedureinsprungpunkt nicht gefunden
Verstehe ich ehrlich gesagt aber auch nicht, wozu 2 Versionen kompilieren? Mit dynamischer Bindung lässt sich doch feststellen, ob die Funktion vorhanden ist. Wenn nicht, kann sie eben nicht benutzt werden, aber ich komme mit einem einzigen Kompilat aus.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:18 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