![]() |
Parameterübergabe: was geht hier vor?
Hallo Leute!
Zunächst ein bisschen Prosa vorweg: Ich schreibe eine DLL in Delphi. An das aufrufende Programm muss ich Zeichenketten zurückgeben. Das Aufrufende Programm kann so konfiguriert werden, dass es eine DLL mit folgender C-Syntax erwartet:
Code:
Anmerkung: wchar_t ist ein WideChar in C.
(STDCALL)
long int myfunction(wchar_t a[], wchar_t b[], wchar_t c[], wchar_t d[], wchar_t e[], wchar_t f[]); Ich habe die entsprechende Funktion in Delphi so nachgebildet:
Delphi-Quellcode:
Jetzt das Problem: Ich kann zwar den String a (und c und e) verändern, aber bei den Strings b (und d und f) bekomm ich eine Zugriffsverletzung.
function myfunction(a, b, c, d, e, f: Array of WideChar): longint; stdcall;
Ich habe dann den Spieß rumgedreht: Eine DLL in C geschrieben mit obigem Aufruf und die Anwendung in Delphi, die die DLL aufruft -> gleiches Ergebnis. Wenn ich mir die Adressen der Arrays innerhalb der DLL anzeigen lasse, so bekomm ich für a[0], a[1], a[2], ..., c[0], c[1], c[2] ... plausible Werte (z.B. 1241104 dezimal, immer im korrekten Abstand von 2 Byte) angezeigt; für die anderen (b[0], b[1], ..., d[0], d[1], ...) werden jedoch sehr niedrige Adressen ausgegeben (z.B. 100, 102 dezimal). Hat jemand von Euch eine Erklärung? Ciao P.S. die Problematik im Thread "Strings innerhalb DLL verändern" habe ich gelöst, deswegen ein neuer Thread |
Re: Parameterübergabe: was geht hier vor?
Übersetze die Arrays als PWideChar.
|
Re: Parameterübergabe: was geht hier vor?
Arrays kann man normal nicht ohne weiteres als Parameter übergeben!
Versuchs mal mit:
Delphi-Quellcode:
Dann den Typ in der Function benutzen, dannach sollte es funzen!
type
TWideChar = Array of WideChar; |
Re: Parameterübergabe: was geht hier vor?
Moin!
Es sollte sogar ohne Probleme möglich sein direkt WideString als Typ anzugeben (ohne Array dann natürlich). MfG Muetze1 |
Re: Parameterübergabe: was geht hier vor?
Zitat:
![]() Das gilt auch für WideStrings. |
Re: Parameterübergabe: was geht hier vor?
Moin!
Zitat:
MfG Muetze1 |
Re: Parameterübergabe: was geht hier vor?
Dann mal los.
Code:
Einen Referenzzähler gibt es nicht, da hast du recht.
CODE:004039D0 dd 8 ; <-- Länge des Strings
CODE:004039D4 aTest: ; DATA XREF: CODE:00403A5Co CODE:004039D4 unicode 0, <Test>,0 CODE:004039DE db 0 CODE:004039DF db 0 WideString ist ein sog. gezählter String und hat intern eine andere Struktur als PWideChar. Daher sind sie nicht einfach austauschbar, auch wenn der Compiler vielleicht aktuell für die korrekte Übergabe sorgt. Du verläßt dich hier auf undokumentierte Interna und könntest damit schnell verlassen sein. Deshalb generell Finger weg von Delphis Stringtypen wenn man andere Programmteile anspricht, die nicht die Delphistrukturen kennen. Aber Argumente wäre soviel hilfreicher als "Nein, und da streite ich mich gerne mit dir." ;) ... ich lasse mich auch gern überzeugen. |
Re: Parameterübergabe: was geht hier vor?
"array of" ist nie eine korrekte Konvertierung eines Zeigerparameters in C.
Als Parameter ist "wchar_t a[]" in C aequivalent mit "wchar_t *a". Die korrekte Konvertierung nach Delphi lautet "a: PWideChar". Man kann einen WideString via PWideChar(WideS) uebergeben, aber wenn die Funktion den String schreibt, dann muss man vorher mit SetLength() eine genuegende Puffergroesse garantieren. |
Re: Parameterübergabe: was geht hier vor?
Zitat:
Zitat:
|
Re: Parameterübergabe: was geht hier vor?
Hallo!
Ich habe nochmal einige Möglichkeiten durchgecheckt. Tatsache ist, dass ich Strings, die ich lediglich an die DLL übergebe und darin NICHT verändern will, mittels PWideChar übergebe und dies funktioniert tadellos. Mache ich das auch mit den zu verändernden Strings, so kommen nur Fragezeichen zurück:-( Bei der aufrufenden Anwendung handelt es sich übrigens um TestStand von NationalInstruments. Die Hilfe sagt zur Übergabe von Strings folgendes: Zitat:
Ich habe die in C geschriebene Minimal-DLL auf TestStand losgelassen - keine Probleme. Aber ich will/muss nun mal Delphi für mein Projekt nehmen. Ich forsche weiter an der Sache aber so langsam (nach etlichen Tagen! des Ausprobierens) habe ich die Schnauze voll. So long. weltaran |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz