Thema: Delphi DLL-Parameter

Einzelnen Beitrag anzeigen

Frickeldrecktuxer_TM
(Gast)

n/a Beiträge
 
#6

Re: DLL-Parameter

  Alt 5. Mai 2006, 17:38
Zitat von TomDooley:
Zitat:
Integer sind 32bittig, ein char nur 8bittig, du müsstest schon genauer sagen, wie Integer in ein array of char gebracht werden sollen.
Wie oben beschrieben habe die meine Variablen nicht nur als String sondern auch als integer vorliegen. Eigentlich habe ich das selbe Problem wie zuvor bei den Strings... Wie muss ich einen Integer einer Funktion übergeben, welche einen Parameter vom Typ PChar erwartet? Ich nehme mal an, @IntegerVar dürfte nicht funktionieren, oder?
Jein (schon wieder ).
Es würde syntaktisch ohne weiteres gehen und sogar semantisch, solange dann die C-Funktion nicht weiter ausliest als parameter+3, weil das das letzte Byte des Integers wäre. Mit @IntegerVar bekommst du einen Pointer auf das unterste Byte des Integers, danach kommen noch drei weitere, allerdings kein Nullterminator am Ende. Der Rest ist analog, du könntest in der C-Funktion mit inParam[0] bis inParam[3] auf die einzelnen Bytes des Integers zugreifen (wenn du's ausprobieren möchtest und verwirrende Ergebnisse bekommst, beachte die Endianness auf Intel-Systemen, die sind nämlich LittleEndian).
Aber das ergibt nunmal nicht sinderlich viel Sinn, weil man üblicherweise nicht mit den einzelnen Bytes eines Integers rechnet. Wenn du also die gesamte 32bit-Zahl haben willst, müsstest du sie in der C-Funktion entweder aus den vier Einzelbytes wieder zusammensetzen oder durch einen Typecast in einen 32bit-Typ (je nach Architektur und Compiler kann das int oder long int sein) drauf zugreifen. Einfacher wäre es hier, einfach eine zweite Funktion in C einzuführen, die als Parameter kein Byte-Array (char *) annimmt, sondern einen Integer (oder ein Integer-Array).

Zitat von TomDooley:
Ich denke, ich könnte den Integer nun zuerst in einen String konvertieren und dann analog zu Deiner Problemlösung verwenden...
Ich nehme an du meinst IntToStr()? Das wäre eine andere Problemstellung. Da übergibst du ja nicht den Integer als Integer, sondern die Repräsentation der Zahl in einem willkürlichen (menschenlesbaren) System, nämlich als String "123".

Zitat von TomDooley:
Da die C++ DLL ein Char-Array erwartet, frage ich mich nun, ob ich den Integer nicht auch so übergeben könnte:
Delphi-Quellcode:
//...
  charArr := IntToCharArray(intVar); //charArr[0]=1, charArr[1]=2, etc.
Das kommt ganz darauf an, was du vorhast, und ob dieses Vorgehen sinnvoll ist. Dabei hättest du jede Stelle im Dezimalsystem in einem eigenen Byte. Wenn du das so haben willst, wäre das eine (weitere) mögliche Lösung (vorrausgesetzt die Funktion in der DLL erkennt, ob es sich beim übergebenen Parameter um einen String oder einen Integer handelt).
Jetzt kennst du drei (vier) verschiedene Möglichkeiten, die alle "irgendwie" den Integer an die Funktion übergeben, aber jeweils in verschiedenen Datenformaten und zugänglich über verschiedene Zugriffsarten. Es kommt einzig und allein darauf an, was du damit machen willst. Du musst also entscheiden, was praktikabel für deine spezielle Anwendung ist. Willst du mit der Zahl rechnen wäre es unsinnig, sie im Delphi-Teil in ihre Dezimalstellen aufzudröseln, zu übergeben und in der DLL aus den Dezimalstellen wieder einen Integer zusammenzubasteln, damit man in der DLL damit rechnen kann.
  Mit Zitat antworten Zitat