Einzelnen Beitrag anzeigen

Testsieger

Registriert seit: 23. Nov 2013
22 Beiträge
 
#1

String/Char-Pointer aus C# DLL korrekt auslesen

  Alt 2. Jan 2014, 09:25
Hallo,
erst mal ein frohes Neues Jahr.

Ich habe leider noch eine „ungelöste“ Aufgabe aus dem alten Jahr:

Die Ausgangssituation ist folgende:
Ich habe in mein Delphi-Programm eine C#-DLL eingebunden, über die eine eigene Datenbank gemanagt wird. Zwischen meinem Programm und der DLL müssen also jede Menge Daten ausgetauscht werden. Dabei handelt es sich um numerische und alphanumerische Daten, die als Pointer übergeben werden müssen. Alle numerischen Daten werden problemlos wechselseitig ausgetauscht.
Die Übergabe von Strings als „Pansichar“ funktioniert auch in eine Richtung: Übergabe von Delphi an die DLL. Nur umgekehrt hapert es. Ich kann keine Daten sauber auslesen und weiterverarbeiten.
Dabei gibt es DLL-Routinen, die aufeinander aufbauen und korrekt funktionieren. Beispiel:
Ich lese über eine Funktion eine Pansichar-Variable ein und übergebe den Inhalt (bzw. die Pointeradresse) wieder an eine andere DLL-Routine, die dann auch richtig ausgeführt wird. Das Problem liegt also „nur“ im Delphi-Programm.

Hier 2 Basisfunktionen der DLL, die nacheinander aufgerufen werden:
Function GetVarInfo(hFile:integer;iVar:Integer;out varname:pansichar;out varinfo:pinteger):Integer;stdcall; external 'c:\test\io32.dll' name 'GetVarInfo';
Function GetVarHandle(hFile:Integer;varname:pansichar;var varHandle:double):Integer;stdcall; external 'c:\test\io32.dll' name 'GetVarHandle';

“Getvarinfo” liefert den Variablennamen, den man an “Getvarhandle” wieder übergibt. Mit diesem
Variablenamen werden in weiteren Funktionen die Daten der Datenbank abgerufen. Das funktioniert auch, aber ich kann mir den Variablenamen nicht richtig anzeigen lassen.

Hier meine Aufruf-Routinen:

var hFile,iVar:integer;
varname2:pansichar;
varhandle:double;
varinfo:pinteger;
zwst1:string[120];
begin
fehler:=getvarinfo(hFile,iVar,varname2,varinfo);
fehler:=getvarhandle(hFile,@varname2,varhandle);
zwst1:=(ansistring(@varname2));
showmessage(zwst1);
end;
Ich bekomme leider die Variable „varname2“ nicht immer korrekt angezeigt. Normalerweise sollte ja der Inhalt einer Pointervariablen mit „^“ ausgelesen werden, aber damit bekomme ich nur eine Zugriffsverletzung. Mit der obigen Routine bekomme ich manchmal „varname2“ richtig angezeigt. „Manchmal“ heißt, je nachdem welche Datenbank ich öffne und einlese.
Ich vermute, es ist ein Konvertierungsproblem, aber warum bekomme ich manchmal etwas angezeigt und manchmal nicht. Wie schon gesagt, wenn ich „varname2“ einer weiteren DLL-Funktion übergebe, um numerische Datensätze auszulesen, bekomme ich alle Datensätze richtig ausgelesen und angezeigt. Nur der Zugriff auf „varname2“ selbst funktioniert nicht korrekt.
Hat jemand eine Idee?
  Mit Zitat antworten Zitat