Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi New von C anders als bei Delphi? (https://www.delphipraxis.net/13862-new-von-c-anders-als-bei-delphi.html)

Alter Mann 28. Dez 2003 10:25


New von C anders als bei Delphi?
 
Hi Leute.

Habe den Versuch unternommen ein C-Prog nach Delphi umzusetzen,
doch leider scheitere ich solch trivalen Sachen wie GetMem, AllocMem
usw., vieleicht könnt ihr ja helfen; ist vermutlich nur ein Denkfehler.

hier das 'gekürtze Original' aus C:

Code:
...
PCHAR DeviceID = new CHAR[DeviceIDLen + 1];
  if (DeviceID)
  {
   r = Func_GetDeviceID(ThisDevInst,DeviceID,DeviceIDLen + 1,0);
   ...
   printf("%s",DeviceID);
   ...
  }
delete [] DeviceID;
...
und hier in Delphi:

Code:
var
   DeviceID : pChar;
   S       : String;
begin
  GetMem(DeviceID, DeviceIDLen + 1);
  r := Func_GetDeviceID(ThisDevInst, DeviceID, DeviceIdLen +1, 0);
  ...
  S := StrPas(DeviceID); // Fehler!
  S := StrPas(@DeviceID); // Ok
  ...
  FreeMem(DeviceID, DeviceIDLen + 1); <- Läuft nicht, da kann ich machen was ich will
end;
Die Funktion ist wie folgt deklariert und stammt aus dem DDK für .Net:

Code:
Func_GetDeviceID : function (const dnDevInst : DevInst;
                             var Buffer : pChar;
                             const BufferLen : ULONG;
                             const ulFlags : ULONG): CONFIGRET stdcall;

DevInst und CONFIGRET sind DWORD;
Hat jemand eine Idee an was es liegt?

SirThornberry 28. Dez 2003 10:35

Re: New von C anders als bei Delphi?
 
komicher Weise funktionier bei mir
Delphi-Quellcode:
  GetMem(DeviceID, 20);
  S := StrPas(DeviceID);
  FreeMem(DeviceID, 20);
versuchst du eventuell zwischen "getmem" und "s := StrPas" den speicher von DeviceID wieder freizugeben??

Alter Mann 28. Dez 2003 10:43

Re: New von C anders als bei Delphi?
 
Hallo SirThornberry


eigendlich ist das ja richtig.
Aber die Function 'verbiegt' den pChar, so das ich nur mit

Code:
S:= StrPas(@DeviceID);
an den Inhalt ran komme. Durch dieses verbiegen fuzt das FreeMem ebend nicht.

SirThornberry 28. Dez 2003 10:50

Re: New von C anders als bei Delphi?
 
komich das du damit überhaupt an den inhalt ran kommst denn mit dem @ davor bekommst du ja eigentlich nur die Adresse im speicher. Kanns eventuell sein das die funktion den speicher selbst von windows anfordert?? ansonsten vorm aufruf der procedure einfach mal die speicheradresse von DeviceID zwischenspeichern und dann anhand der gesicherten Adresse den speicher freigeben

Luckie 28. Dez 2003 10:51

Re: New von C anders als bei Delphi?
 
Wie kann eine Funktion den Speicherbereich "verbiegen"? Entweder sie bekommt Variable mit genug Speicher, dann klappt es oder nicht, dann klappt es eben nicht. Aber neuen oder anderen Speicherbereich anfordern kann sie definitiv nicht. Den Speicher, den du mit GetMem holst muss der gleiche sein, den du mit FreeMem wieder frei gibst.

Desweiteren geht auch ein direkter Cast mit String() nach String oder du kannst es ganz Delphi überlassen und den PChar dem String direkt zuweisen.

Robert Marquardt 28. Dez 2003 12:46

Re: New von C anders als bei Delphi?
 
Sieht verdaechtig nach USB aus.
Mach doch einfach S := DeviceID;

Alter Mann 28. Dez 2003 17:20

Re: New von C anders als bei Delphi?
 
Tja, was soll ich sagen :?

Die Funktion fordert den Speicher selber an, den wenn DeviceID = nil übergebe bekomme
ich den erforderlichen Wert geliefert, aber ebend nur in der Form S:=@DeviceID.

Hat somit schon geholfen, danke.

Dafür kommen jetzt andere Probleme...


ps. Robert, Du liegst schon richtig :wink:

Robert Marquardt 28. Dez 2003 18:00

Re: New von C anders als bei Delphi?
 
Wenn die Funktion den speicher selbst alloziiert, dann darfst du ihn keinesfalls mit FreeMem freigeben.
Es muss dokumentiert sein welche Windows-Funktion zum Freigeben zustaendig ist.
Alternativ gibt es im API eine Funktion dafuer.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02: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