![]() |
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:
und hier in Delphi:
...
PCHAR DeviceID = new CHAR[DeviceIDLen + 1]; if (DeviceID) { r = Func_GetDeviceID(ThisDevInst,DeviceID,DeviceIDLen + 1,0); ... printf("%s",DeviceID); ... } delete [] DeviceID; ...
Code:
Die Funktion ist wie folgt deklariert und stammt aus dem DDK für .Net:
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;
Code:
Hat jemand eine Idee an was es liegt?
Func_GetDeviceID : function (const dnDevInst : DevInst;
var Buffer : pChar; const BufferLen : ULONG; const ulFlags : ULONG): CONFIGRET stdcall; DevInst und CONFIGRET sind DWORD; |
Re: New von C anders als bei Delphi?
komicher Weise funktionier bei mir
Delphi-Quellcode:
versuchst du eventuell zwischen "getmem" und "s := StrPas" den speicher von DeviceID wieder freizugeben??
GetMem(DeviceID, 20);
S := StrPas(DeviceID); FreeMem(DeviceID, 20); |
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:
an den Inhalt ran komme. Durch dieses verbiegen fuzt das FreeMem ebend nicht.
S:= StrPas(@DeviceID);
|
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
|
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. |
Re: New von C anders als bei Delphi?
Sieht verdaechtig nach USB aus.
Mach doch einfach S := DeviceID; |
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: |
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