![]() |
Wie kommt man an den Wert von PByte
Ich habe ein Problem mit Variablen die ich gerne aus einer C DLL hätte.
In C wäre das DWORD // DLL Version, defined OLS_VERSION WINAPI GetDllVersion( PBYTE major, // major version PBYTE minor, // minor version PBYTE revision, // revision PBYTE release // release/build Meine Version könnte so lauten: TGetDllVersion = function( Major: PBYTE; // major version Minor: PBYTE; // minor version Revision: PBYTE; // revision Release: PBYTE // release/build ): DWORD; stdcall; Das sollte mit Delphi 2009 gehen. Aber Delphi 7 kennt Pbyte gar nicht. Ist das richtig? Und was ist PByte überhaupt? Vom Namen her würde ich sagen es ist ein Zeiger auf EIN Byte irgendwo im Speicher. Richtig? Zurück bekomme ich doch den Zeiger auf mein Byte, aber wie komme ich an den Wert des Bytes herran? Kann man genauso verfahren wie mit Pchar? Muss ich überhaupt PByte benutzen ? Hat einer eine Idee? |
Re: Wie kommt man an den Wert von PByte
PByte heißt Pointer auf Byte
|
Re: Wie kommt man an den Wert von PByte
Ok ... hatte ich schon geahnt und glaube ich auch so geschrieben.
Ist es denn nun exakt ein Byte oder können es auch mehrere sein? Wie übergebe ich jetzt der C Funktion diese Pbytes ? Von der logik her bekomme ich ja in meinem Beispiel nur mehrere Zeiger zurück. Aber ich muss der C Funktion ja irgend eine Variable wieder abieten damit sie die Zeiger speichern kann. Übergebe ich da leere Zeigervariablen in der Hoffnung das die C Funktion sie dort abspeichert? Und wenn ich jetzt die Adressen habe, wie bekomme ich dann die echten werte aus dem Speicher ? Vielen Dank für die Hilfe. |
Re: Wie kommt man an den Wert von PByte
Der Dereferenzierungsoperator in Delphi ist "^". D.h.:
Delphi-Quellcode:
Danach steht in EinByte der Wert auf den EinPByte zeigt.
var
EinByte: Byte; EinPByte: PByte; begin EineProzedur(EinPByte); EinByte := EinPByte^; end; Ich glaube nicht, dass es hier in diesem Beispiel mehrere Bytes sein können. Zwar werden Arrays in C gern als lose Pointer realisiert, aber um solche zu sein müssten irgendwo noch Längenangaben sein, die ich hier nicht sehe. (Bei PChar ist's etwas anders, da dort in der Regel #0 als Terminator agiert, und man daher auch ohne Längenangaben auskommt.) Edit: Ich seh grad, das sind ja garkeine var-Parameter. In dem Fall:
Delphi-Quellcode:
"@" ist also das Gegenstück zu "^", dass einen Pointer auf die folgende Variable liefert.
var
Major, Minor, Revision, Release: Byte; Foo: DWORD; begin Major := 1; Minor := 2; Revision := 3 Release := 4; // Beispielwerte halt :) Foo := GetDllVersion(@Major, @Minor, @Revision, @Release); end; |
Re: Wie kommt man an den Wert von PByte
Da hier wohl PByte kein Zeiger auf ein Byte-Array ist, sondern einfach nur ein Zeiger auf ein Byte, ...
Delphi-Quellcode:
TGetDllVersion = function(var Major, Minor, Revision, Release: Byte): LongWord; stdcall;
|
Re: Wie kommt man an den Wert von PByte
Ich nehme mal an, dass einfach nur die Referenz auf die Variable übermittelt werden soll.
Somit kann man es in Pascal, wo wir das Var-Keyword kennen, besser so schreiben:
Delphi-Quellcode:
[EDIT]Verdammt, himi war schneller :wall: [/EDIT]
type
TGetDllVersion = function( var Major: BYTE; // major version var Minor: BYTE; // minor version var Revision: BYTE; // revision var Release: BYTE // release/build ): DWORD; stdcall; ... var Major, Minor, Revision, Release: Byte; Foo: Cardinal; begin Foo := GetDllVersion(Major,Minor,Revision,Release); end; |
Re: Wie kommt man an den Wert von PByte
Hm, das ist noch besser, stimmt :stupid:
|
Re: Wie kommt man an den Wert von PByte
Zitat:
![]() |
Re: Wie kommt man an den Wert von PByte
Donnerkiesel seit Ihr schnell :O
Das ziehe ich mir jetzt erstmal ganz in Ruhe rein. Vielen Dank erstmal für die Lösungsansätze, das bringt mich mit Sicherheit weiter. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:47 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