Delphi-Quellcode:
Procedure AnsiStringVektor_To_Excel(S: PAnsiChar; n_Anzahl: ExcelLongInt);
StdCall;
// Aufgabe -> Einen Delphi-AnsiString-Vektor auf EINMAL an Excel-VBA übertragen
// S: PAnsiChar : Erstes Element des zu zu übertragenden StringVektors
// n_Anzahl: ExcelLongInt : Gesamtzahl der Strings im StringVektor
VAR
Vektor:
Array of PAnsiChar
ABSOLUTE S;
P : AnsiString;
i : Integer;
Begin
For i:= 1
To n_Anzahl
Do // Excel: 1-basiertes Array
Begin
P:= AnsiString_Vektor_Global[i-1];
// -1: Delphi: 0-basiertes Array
System.AnsiStrings.StrPLCopy(Vektor[i], P, Length(P));
// --> Access violation
// System.AnsiStrings.StrCopy(PAnsiChar(Vektor[i]), PAnsiChar(P)); // --> Access violation
End;
End;
{AnsiStringVektor_To_Excel}
Naja, also so geht das ja nicht. Ein
array of PAnsiChar
ist ja kein
PAnsiChar
, sondern ein
PPAnsiChar
(Arrays sind Zeiger auf ihr erstes element, mit der Länge, dem Referenzzähler und der Typeninfo vorweg).
absolute
gibt dir zwar im gegensatz zu einem Typecast keinen Fehler aus, aber das heißt nicht, dass es so richtig ist.
Richtig muss
S
aber entweder ein
PPAnsiChar
oder
Vektor
ein
array of AnsiChar
(bzw. ein
PAnsiChar
) sein.
Auch kommt da jetzt noch folgendes hinzu: Arrays sind ja, wie eben schon gesagt, sowohl referenzgezählt, als auch typisiert und haben eine feste Länge. Gut möglich, dass dir das somit auch nochmal den Speicher zerschießt, da dafür in dem
PAnsiChar
ja gar nichts reserviert ist.