Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Sind diese API funktionen richtig übersetzt? (https://www.delphipraxis.net/83986-sind-diese-api-funktionen-richtig-uebersetzt.html)

C.Schoch 9. Jan 2007 19:14


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:
function ShutdownBlockReasonQuery(hWnd : HWND; lpText : PWideChar; Buff : DWORD) : boolean;
Hier noch der msdn.com Eintrag
msdn

Der_Unwissende 9. Jan 2007 19:26

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

C.Schoch 9. Jan 2007 20:14

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;

nitschchedu 9. Jan 2007 20:37

Re: Sind diese API funktionen richtig übersetzt?
 
Zitat:

Zitat von C.Schoch
Hi,
Ich bin mir nicht sicher ob ich diese API routinen richtig übersetzt habe.

Code:
BOOL WINAPI ShutdownBlockReasonCreate(
  HWND hWnd,
  LPCWSTR pwszReason
);

Vergiss nicht WINAPI wird stdcall;

also so hier

Delphi-Quellcode:
function ShutdownBlockReasonCreate(hWnd: HWND; pwszReason: LPCWSTR): Bool; stdcall;

Olli 10. Jan 2007 20:38

Re: Sind diese API funktionen richtig übersetzt?
 
Zitat:

Zitat von C.Schoch
Delphi-Quellcode:
function ShutdownBlockReasonQuery(hWnd : HWND; lpText : PWideChar; Buff : PDWORD) : BOOL;

Wie waere es mit
Delphi-Quellcode:
function ShutdownBlockReasonQuery(hWnd : HWND; lpText : PWideChar; var Buff : DWORD) : BOOL; stdcall;
(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)^".)

Robert Marquardt 11. Jan 2007 04:53

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:
function ShutdownBlockReasonQuery(hWnd : HWND; lpText : PWideChar; Buff : PDWORD = nil) : BOOL;
Ein Defaultparameter braucht keine komischen Umtypungen.

Olli 11. Jan 2007 07:02

Re: Sind diese API funktionen richtig übersetzt?
 
Zitat:

Zitat von Robert Marquardt
Das ist in diesem Fall eher falsch. Der Name Buff deutet an das mehrere DWORDs dort stehen.

Wage ich anzuzweifeln, da es im Orginal heißt: "pcchBuff", was soviel bedeutet wie "Pointer auf Anzahl der Zeichen in Buff".

Nachtrag vom MSDN MSDN-Library durchsuchenShutdownBlockReasonQuery:
Zitat:

pcchBuff
[in, out] A pointer to a variable that specifies the size of the pwszBuff buffer, in bytes. If the function succeeds, this variable receives the number of characters copied into the buffer, including the null-terminating character. If the buffer is too small, the variable receives the required buffer size, in characters, not including the null-terminating character.
Noch'n Nachtrag: Man beachte (rot markiert) die Diskrepanz zwischen der Dokumentation und dem Präfix des Parameternamens (cb wäre eigentlich für die Anzahl von Bytes, cch für die Anzahl von Zeichen).

Robert Marquardt 11. Jan 2007 07:13

Re: Sind diese API funktionen richtig übersetzt?
 
Na das ist die inzwischen uebliche Microsoft-Schlamperei. Frueher haette der Parameter nie "Buff" geheissen.

C.Schoch 11. Jan 2007 18:50

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

Angel4585 27. Apr 2009 09:00

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:
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.
Die external Kommentare hatte ich anfangs anstatt stdcall, habs aber geändert da es hier so gesagt wurde.
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 :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:58 Uhr.
Seite 1 von 2  1 2      

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