AGB  ·  Datenschutz  ·  Impressum  







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

Parameterübergabe: was geht hier vor?

Ein Thema von weltaran · begonnen am 6. Mai 2005 · letzter Beitrag vom 6. Mai 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von weltaran
weltaran

Registriert seit: 12. Sep 2003
Ort: Offenburg
78 Beiträge
 
Delphi 5 Enterprise
 
#1

Parameterübergabe: was geht hier vor?

  Alt 6. Mai 2005, 12:15
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:
 (STDCALL)

 long int myfunction(wchar_t a[], wchar_t b[], wchar_t c[], wchar_t d[], wchar_t e[], wchar_t f[]);
Anmerkung: wchar_t ist ein WideChar in C.


Ich habe die entsprechende Funktion in Delphi so nachgebildet:
 function myfunction(a, b, c, d, e, f: Array of WideChar): longint; stdcall; 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.

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
  Mit Zitat antworten Zitat
Mephistopheles
(Gast)

n/a Beiträge
 
#2

Re: Parameterübergabe: was geht hier vor?

  Alt 6. Mai 2005, 12:18
Übersetze die Arrays als PWideChar.
  Mit Zitat antworten Zitat
Benutzerbild von Speedmaster
Speedmaster

Registriert seit: 4. Mär 2005
Ort: Karlsruhe
535 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Parameterübergabe: was geht hier vor?

  Alt 6. Mai 2005, 12:23
Arrays kann man normal nicht ohne weiteres als Parameter übergeben!

Versuchs mal mit:
Delphi-Quellcode:
type
  TWideChar = Array of WideChar;
Dann den Typ in der Function benutzen, dannach sollte es funzen!
Felix K.
Zitat:
Siehst du diesen Park da unten?
Jeden Tag lernen sich leute kennen und verlassen einander, und du hast dein ganzes Leben Zeit darin zu gehen!
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Parameterübergabe: was geht hier vor?

  Alt 6. Mai 2005, 12:46
Moin!

Es sollte sogar ohne Probleme möglich sein direkt WideString als Typ anzugeben (ohne Array dann natürlich).

MfG
Muetze1
  Mit Zitat antworten Zitat
Mephistopheles
(Gast)

n/a Beiträge
 
#5

Re: Parameterübergabe: was geht hier vor?

  Alt 6. Mai 2005, 12:58
Zitat von Muetze1:
Es sollte sogar ohne Probleme möglich sein direkt WideString als Typ anzugeben (ohne Array dann natürlich).
Häh? Bitte lesen -> http://www.manuel-poeter.de/hitcount...ls/Strings.zip

Das gilt auch für WideStrings.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: Parameterübergabe: was geht hier vor?

  Alt 6. Mai 2005, 13:53
Moin!

Zitat von Mephistopheles:
Das gilt auch für WideStrings.
Nein, und da streite ich mich gerne mit dir.

MfG
Muetze1
  Mit Zitat antworten Zitat
Mephistopheles
(Gast)

n/a Beiträge
 
#7

Re: Parameterübergabe: was geht hier vor?

  Alt 6. Mai 2005, 14:19
Dann mal los.
Code:
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
Einen Referenzzähler gibt es nicht, da hast du recht.
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.
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#8

Re: Parameterübergabe: was geht hier vor?

  Alt 6. Mai 2005, 14:28
"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.
  Mit Zitat antworten Zitat
Mephistopheles
(Gast)

n/a Beiträge
 
#9

Re: Parameterübergabe: was geht hier vor?

  Alt 6. Mai 2005, 14:33
Zitat von Robert Marquardt:
Als Parameter ist "wchar_t a[]" in C aequivalent mit "wchar_t *a".
Die korrekte Konvertierung nach Delphi lautet "a: PWideChar".


Zitat von Robert Marquardt:
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.
Es scheint auch mit WideString zu gehen. Habe mir das mal kurz im Disassembler angeschaut, wenn ich einen WideString an eine stdcall-Prozedur übergebe. In diesem Fall wird der Pointer auf die Zeichenkette übergeben. Aber darauf würde ich mich (s.o.) nicht verlassen.
  Mit Zitat antworten Zitat
Benutzerbild von weltaran
weltaran

Registriert seit: 12. Sep 2003
Ort: Offenburg
78 Beiträge
 
Delphi 5 Enterprise
 
#10

Re: Parameterübergabe: was geht hier vor?

  Alt 6. Mai 2005, 16:15
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:
In general, when you use string parameters, use one of the buffer types if
you want the DLL function to be able to change the contents of the
argument in TestStand. Use the C String or Unicode String type if the DLL
function does not modify the argument.

If you specify one of the string buffer types, the DLL-adapter copies the contents
of the string argument and a trailing zero element into a temporary buffer
before calling the DLL function. You specify the minimum size of the
temporary buffer in the Number of Elements control. If the string value is
longer than the buffer size you specify, the adapter resizes the temporary
buffer so that it is large enough to hold contents of the string argument and
the trailing zero element. After the DLL function returns, TestStand copies
the value that the function writes into the temporary buffer back to the
string argument.
If you specify the C String or Unicode String type, the adapter passes the
address of the actual string directly to the function without copying it to a
buffer. The code module must not change the contents of the string.

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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 09:18 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