Das PAnsiChar <>
String UnicodeString (seit Delphi 2009) wollte ich auch grade ansprechen.
Zitat:
Delphi-Quellcode:
function SeGetCertificationId(var CertificationId: string): TSeReturnCode;
var
PCertificationID: PAnsiChar;
PCurrent: PAnsiChar;
CertificationIDLength: Cardinal;
i: Cardinal;
begin
PCertificationID := nil;
// VB übergibt PCertificationID = &H000000000 und CertificationIDLength = 0
Result := TSeReturnCode(se_getCertificationID(PCertificationID, CertificationIDLength));
...
Der Code ist so nichtmal kompilierbar.
Wieso ignoriert hier jemand die Compilerwarnungen?
Und wenn VB das macht, warum du nicht auch?
CertificationIDLength wurde nicht initialisiert
PCertificationID = string -> PAnsiChar
Und wenn VB das macht, dann vermutlich um erstmal im Result die nötige Länge abzufragen, welche für einen weiteren Aufruf benutzt wird.
Man kann alternativ auch blind den Speicher auf eine Länge festlegen, die "immer" ausreichend wäre,
und anschließend auf das zurück ändern, was wirklich benutzt wurde.
Probleme:
* falsche Typen (
ANSI <>
Unicode)
* falsche Benutzung (ungültige Parameter)
Entweder intern mit
ANSI arbeiten und umkopieren oder die umgebende Funktion mit einem AnsiString bauen.