Thema: Delphi DLL-Parameter

Einzelnen Beitrag anzeigen

Frickeldrecktuxer_TM
(Gast)

n/a Beiträge
 
#4

Re: DLL-Parameter

  Alt 5. Mai 2006, 16:25
Zitat von TomDooley:
Zitat:
@StringVar[1] geht auch. Beim outParam sollte genug Speicher vorhanden sein (SetLength() bei AnsiStrings).
Das heisst, Object-Pascal-Strings sind mit C++-Strings (bzw. C++ Char-Arrays) kompatibel?
Jein.
AnsiStrings von Pascal sind nichts anderes als eine KEtte von Zeichen, die nullterminiert ist, also das gleiche wie ein C-String-Literal (und alles, womit die Funktionen aus string.h arbeiten können). Der Unterschied besteht darin, daß der AnsiString zusätzlich noch in vier Bytes *vor* dem String die Länge des strings sowie einen Referenzzähler hat, was bei C-Strings nicht so ist. Die Compiler-Magic sorgt aber dafür, daß du davon nichts mitbekommst, und deswegen bekommst du mit StrVariable[1] das erste Zeichen des Strings. Alle weiteren Zeichen folgen in aufsteigender Speicheradresse bis zum Nullterminator. Mit @StrVariable[1] hast du also einen Pointer auf das erste Zeichen eines nullterminierten Strings, also genau das, was C-String-Literale sind.
Mit C++-Strings (std::string) sind sie von vorne bis hinten nicht kompatibel, auch wenn man einem std::string ein char * zuweisen kann, was aber eine Eigenschaft der Klasse (std::string ist eine echte Klasse, nicht Compiler-Magic wie AnsiStrings in Delphi) ist.

Zitat von TomDooley:
Mich würde es trotzdem noch interessieren, wie ich Strings und Integer am einfachsten in ein Array of Char abfülle (und umgekehrt).
Einen String in ein array of char:
Delphi-Quellcode:
var
  a: array of char;
  s: String;
begin
  s := 'SomeText';
  SetLength(a, Length(s) + 1);
  for i := 0 to Length(a) - 2 do
    a[i] := s[i+1];
  a[High(a)] = #0;

//oder alternativ:
  s := 'SomeText';
  SetLength(a, Length(s) + 1);
  MemCopy(@a[0], @s[1], Length(a) - 1);
  a[High(a)] = #0;
end;
Integer sind 32bittig, ein char nur 8bittig, du müsstest schon genauer sagen, wie Integer in ein array of char gebracht werden sollen.
  Mit Zitat antworten Zitat