![]() |
Sind diese API funktionen richtig übersetzt?
Hi,
Ich bin mir nicht sicher ob ich diese API routinen richtig übersetzt habe.
Code:
BOOL WINAPI ShutdownBlockReasonCreate(
HWND hWnd, LPCWSTR pwszReason );
Delphi-Quellcode:
function ShutdownBlockReasonCreate(hWnd : HWND; lpText : PWideChar) : boolean;
Code:
BOOL WINAPI ShutdownBlockReasonDestroy(
HWND hWnd );
Delphi-Quellcode:
function ShutdownBlockReasonDestroy (hWnd : HWND) : boolean;
Code:
BOOL WINAPI ShutdownBlockReasonQuery(
HWND hWnd, LPWSTR pwszBuff, DWORD* pcchBuff );
Delphi-Quellcode:
Hier noch der msdn.com Eintrag
function ShutdownBlockReasonQuery(hWnd : HWND; lpText : PWideChar; Buff : DWORD) : boolean;
![]() |
Re: Sind diese API funktionen richtig übersetzt?
Hi,
nein sind sie nicht. BOOL solltest du durch LongBool ersetzen oder direkt BOOL verwenden (deklariert in der Unit Windows, ein Alias für LongBool). Das * hinter dem DWORD im ShutDownReasonQuery zeigt hier an, dass es sich um einen Zeiger handelt, pccBuff ist also ein Zeiger auf ein DWORD. Der Rest stimmt dann aber. Die Typen LPZWSTR, BOOL und DWORD findest du übrigens auch direkt für Delphi in der Unit Windows! Gruß Der Unwissende |
Re: Sind diese API funktionen richtig übersetzt?
Danke @Der Unwissende!
Denke so sollte es passen
Delphi-Quellcode:
function ShutdownBlockReasonQuery(hWnd : HWND; lpText : PWideChar; Buff : PDWORD) : BOOL;
|
Re: Sind diese API funktionen richtig übersetzt?
Zitat:
also so hier
Delphi-Quellcode:
function ShutdownBlockReasonCreate(hWnd: HWND; pwszReason: LPCWSTR): Bool; stdcall;
|
Re: Sind diese API funktionen richtig übersetzt?
Zitat:
Delphi-Quellcode:
(Nachtrag: Sorry, soll nicht heissen das andere waere inkorrekt. Aber ich habe die Erfahrung gemacht, dass es bequemer ist es so zu schreiben. Man kann dennoch NULL uebergeben wenn man es wirklich will und zwar so: "PDWORD(nil)^".)
function ShutdownBlockReasonQuery(hWnd : HWND; lpText : PWideChar; var Buff : DWORD) : BOOL; stdcall;
|
Re: Sind diese API funktionen richtig übersetzt?
Das ist in diesem Fall eher falsch. Der Name Buff deutet an das mehrere DWORDs dort stehen.
Es geht ansonsten noch eleganter:
Delphi-Quellcode:
Ein Defaultparameter braucht keine komischen Umtypungen.
function ShutdownBlockReasonQuery(hWnd : HWND; lpText : PWideChar; Buff : PDWORD = nil) : BOOL;
|
Re: Sind diese API funktionen richtig übersetzt?
Zitat:
Nachtrag vom MSDN ![]() Zitat:
|
Re: Sind diese API funktionen richtig übersetzt?
Na das ist die inzwischen uebliche Microsoft-Schlamperei. Frueher haette der Parameter nie "Buff" geheissen.
|
Re: Sind diese API funktionen richtig übersetzt?
Hi,
Hätt nie gedacht, dass es so viele Interprätationsmöglichkeiten giebt. Der var Bezeichner ist aber IMO eher "kosmetisch" ich muss halt nicht immer @DWORD schreiben |
Re: Sind diese API funktionen richtig übersetzt?
Moin!
Zwar schon bissl älter das Tthema, aber ich hab gerade das gleiche Problem, hab folgendes drin:
Delphi-Quellcode:
Die external Kommentare hatte ich anfangs anstatt stdcall, habs aber geändert da es hier so gesagt wurde.
unit UGlobal;
interface uses Windows, SysUtils; type . . . const C_MY_CONST = 1234; //external user32 name 'ShutdownBlockReasonCreate'; function ShutdownBlockReasonCreate(hWnd:HWND;pwszReason:LPCWSTR):BOOL;stdcall; //external user32 name 'ShutdownBlockReasonDestroy'; function ShutdownBlockReasonDestroy(hWnd:HWND):BOOL;stdcall; //external user32 name 'ShutdownBlockReasonQuery'; function ShutdownBlockReasonQuery(hWnd:HWND;pwszBuff:LPWSTR;pcchBuff:DWORD):BOOL;stdcall; implementation end. Das Problem jetzt ist, dass ich die Meldungen bekomme: [Fehler] UGlobal.pas(16): E2065 Ungenügende Forward- oder External-Deklaration: 'ShutdownBlockReasonCreate' [Fehler] UGlobal.pas(18): E2065 Ungenügende Forward- oder External-Deklaration: 'ShutdownBlockReasonDestroy' [Fehler] UGlobal.pas(20): E2065 Ungenügende Forward- oder External-Deklaration: 'ShutdownBlockReasonQuery' Da ich das nicht so oft mache denke ich ich hab hier einen bescheuerten Fehler drin. Ich arbeite hier unter Vista und mit Delphi 2005 Edit: ahh habs schon, die externals einfach noch hinter stdcall; dann gehts :) |
Re: Sind diese API funktionen richtig übersetzt?
Da ich nicht mehr viel mit Delphi mache würde ich auf dem ersten Blick sagen, das
Delphi-Quellcode:
so nicht geht .... du brauchst einen verweiß auf den Speicher und nicht den Speicher selbst. Also
pcchBuff:DWORD
Delphi-Quellcode:
oder
var
Delphi-Quellcode:
mit anderen Worten ein Pointer.
PDWORD
Mfg nitsche |
Re: Sind diese API funktionen richtig übersetzt?
Moin Martin,
Du musst Deinem Delphi auch mitteilen, wo die Funktion zu finden ist:
Delphi-Quellcode:
const gebe ich bei solchen Importen immer an, da die C-Funktionen keine var-Parameter kennen, und man so Funktionen erhält, bei denen man, ohne grosse Verrenkungen, auch die Beispiele verwenden kann.
function ShutdownBlockReasonQuery(const hWnd:HWND; const pwszBuff:LPWSTR; const pcchBuff:PDWORD):BOOL; stdcall; external 'user32.dll' name 'ShutdownBlockReasonQuery';
Würde man hier, z.B., den letzten Parameter als var deklarieren, kann man niemals nil übergeben, was bei vielen Funktionen auch möglich ist (der letzte Parameter muss hier dann als PDWORD deklariert werden.). Mit dem external gibt man an, in welcher DLL die Funktion zu finden ist, und mit name, wie die Funktion in der DLL heisst. Letzteres ist hier überflüssig, da der für Delphi gewählte Funktionsname der gleiche ist, wie in der DLL, aber es gibt oft Funktionen, die als ANSI und WIDE enthalten, und mit einem A bzw. W am Ende des Namens gekennzeichnet ist. Da man, i.d.R., nur eine der beiden Varianten benötigt, kann man die Kennung im Delphi-Funktionsnamen weglassen und bei name die gewünschte Version eintragen. (Wichtig: Die Gross-/Kleinschreibung ist bei name exakt einzuhalten). |
Re: Sind diese API funktionen richtig übersetzt?
Delphi-Quellcode:
...verwendet man, wenn nach API Spezifikation der Parameter optional (IN_OPT, OUT_OPT) ist.
pcchBuff:PDWORD
Sonst muss man eine Verrenkung machen, damit nil direkt angenommen wird. Ist nil nicht erlaubt, verwendet man:
Delphi-Quellcode:
Da ist die (unabsichtliche, direkte) Angabe von nil schon schwieriger.
var pcchBuff:DWORD
Const hat keine Auswirkung hier. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:22 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-2025 by Thomas Breitkreuz