AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

New von C anders als bei Delphi?

Ein Thema von Alter Mann · begonnen am 28. Dez 2003 · letzter Beitrag vom 28. Dez 2003
Antwort Antwort
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
946 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

New von C anders als bei Delphi?

  Alt 28. Dez 2003, 11:25
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?
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: New von C anders als bei Delphi?

  Alt 28. Dez 2003, 11:35
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??
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
946 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: New von C anders als bei Delphi?

  Alt 28. Dez 2003, 11:43
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.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: New von C anders als bei Delphi?

  Alt 28. Dez 2003, 11:50
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
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: New von C anders als bei Delphi?

  Alt 28. Dez 2003, 11:51
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#6

Re: New von C anders als bei Delphi?

  Alt 28. Dez 2003, 13:46
Sieht verdaechtig nach USB aus.
Mach doch einfach S := DeviceID;
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
946 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

Re: New von C anders als bei Delphi?

  Alt 28. Dez 2003, 18:20
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
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#8

Re: New von C anders als bei Delphi?

  Alt 28. Dez 2003, 19:00
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:00 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