Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Wie kommt man an den Wert von PByte (https://www.delphipraxis.net/147034-wie-kommt-man-den-wert-von-pbyte.html)

Troelli 31. Jan 2010 17:43


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?

mkinzler 31. Jan 2010 17:48

Re: Wie kommt man an den Wert von PByte
 
PByte heißt Pointer auf Byte

Troelli 31. Jan 2010 17:58

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.

Medium 31. Jan 2010 18:07

Re: Wie kommt man an den Wert von PByte
 
Der Dereferenzierungsoperator in Delphi ist "^". D.h.:
Delphi-Quellcode:
var
  EinByte: Byte;
  EinPByte: PByte;
begin
  EineProzedur(EinPByte);
  EinByte := EinPByte^;
end;
Danach steht in EinByte der Wert auf den EinPByte zeigt.

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:
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;
"@" ist also das Gegenstück zu "^", dass einen Pointer auf die folgende Variable liefert.

himitsu 31. Jan 2010 18:14

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;

implementation 31. Jan 2010 18:14

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:
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;
[EDIT]Verdammt, himi war schneller :wall: [/EDIT]

Medium 31. Jan 2010 18:17

Re: Wie kommt man an den Wert von PByte
 
Hm, das ist noch besser, stimmt :stupid:

himitsu 31. Jan 2010 18:24

Re: Wie kommt man an den Wert von PByte
 
Zitat:

Zitat von implementation
[EDIT]Verdammt, himi war schneller :wall: [/EDIT]

*tröst*, die 2 Sekunden http://fnse.de/S05/1L9.gif

Troelli 31. Jan 2010 18:35

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 17:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz