Einzelnen Beitrag anzeigen

Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
485 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: AnsiStringArray aus DLL an Excel-VBA

  Alt 30. Apr 2019, 00:35
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.
Dennis

Geändert von Dennis07 (30. Apr 2019 um 00:40 Uhr)
  Mit Zitat antworten Zitat