AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

String/Char-Pointer aus C# DLL korrekt auslesen

Ein Thema von Testsieger · begonnen am 2. Jan 2014 · letzter Beitrag vom 2. Jan 2014
Antwort Antwort
Seite 1 von 3  1 23      
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
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: String/Char-Pointer aus C# DLL korrekt auslesen

  Alt 2. Jan 2014, 09:41
Du musst auch Speicher für varname reservieren, den die DLL dann befüllt.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH ( 2. Jan 2014 um 13:05 Uhr) Grund: Rechtschreibfehler
  Mit Zitat antworten Zitat
Testsieger

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

AW: String/Char-Pointer aus C# DLL korrekt auslesen

  Alt 2. Jan 2014, 09:44
Ich habe schon "new(varname2)" eingebaut. Nützt leider auch nichts.
Trotzdem danke für den Tipp.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: String/Char-Pointer aus C# DLL korrekt auslesen

  Alt 2. Jan 2014, 09:52
Bist Du sicher, dass das tatsächlich ein Ausgabeparameter ("out") ist? Normalerweise würde ich es ungefähr so versuchen:
Delphi-Quellcode:
var
  varname2: AnsiString;
begin
  SetLength(varname2, <Längenangabe>);
  fehler:=getvarinfo(hFile,iVar,PAnsiChar(varname2),varinfo);
  SetLength(varname2, StrLen(PAnsiChar(varname2)));
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Testsieger

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

AW: String/Char-Pointer aus C# DLL korrekt auslesen

  Alt 2. Jan 2014, 09:57
Es ist auf jeden Fall eine Ausgabe, sonst könnte die 2. Funktion ja nicht damit weiterarbeiten.
Ich probiere jetzt eben deinen Vorschlag aus. Irgendwo in diesem Bereich vermute ich auch meinen Fehler.

Danke schon mal...
  Mit Zitat antworten Zitat
Testsieger

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

AW: String/Char-Pointer aus C# DLL korrekt auslesen

  Alt 2. Jan 2014, 10:09
Ich bekomme leider beim Compilieren die Fehlermeldung für den Funktionsaufruf mit pansichar(...), dass ein Konstantenobjekt nich als Var-Parameter übergeben werden kann.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: String/Char-Pointer aus C# DLL korrekt auslesen

  Alt 2. Jan 2014, 10:16
Deshalb ja meine Frage nach dem out. Was passiert, wenn Du das weglässt?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Testsieger

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

AW: String/Char-Pointer aus C# DLL korrekt auslesen

  Alt 2. Jan 2014, 10:25
Ich habe zu der DLL die Info zur Strukur und die sieht so aus:
Delphi-Quellcode:
int __stdcall GetVarInfo(
    const int hFile,
    const int iVar,
    char* varName,
    int* varType);
Ich brauche ja auch den Variablennamen. Manchmal (=je nach geöffneter Datenbank) bekomme kann ich ihn ja auch
richtig angezeigt, aber manchmal nur teilweise oder auch garnicht.

Warum bekomme ich eine Fehlermeldung im Programmablauf, wenn ich ansistring(@varname2) ändere in ansistring(varname2^). Das wäre doch eigentlich der korrekte Delphiuaufruf für einen Pointerinhalt.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: String/Char-Pointer aus C# DLL korrekt auslesen

  Alt 2. Jan 2014, 10:29
Wo steht da etwas von Ausgabeparameter? Ich sehe da char* varName, also einen Zeiger auf ein Zeichen, was PAnsiChar/PWideChar entspricht. Lass also das out weg und versuch es noch einmal wie gezeigt, das sollte nach meinem Dafürhalten funktionieren.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Testsieger

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

AW: String/Char-Pointer aus C# DLL korrekt auslesen

  Alt 2. Jan 2014, 10:33
Habe ich mal ausprobiert, gibt leider einen "access violation" Fehler.
In der C#-Definition bedeutet "const", dass die Variable an die DLL übergeben werden muss und die
mit "*" versehenen Variablen kommen zurück, also out.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz