Entwickler-Ecke

Dateizugriff - Aufruf einer Funktion in einer C-Verfassten DLL


markus030177 - Mo 16.06.03 18:14
Titel: Aufruf einer Funktion in einer C-Verfassten DLL
Wie würdet ihr aus Delphi4 eine Funktion aufrufen (Prototyp gefragt), die in einer C-DLL folgendermassen aussieht:

Quelltext
1:
int iread(int id, char *buf, unsigned long bufsize, int *reason, unsigned long *actualcnt);                    


Das eigentliche Problem ist der Char-Zeiger buf, der auf ein array of char zeigen soll, in dem mir die C-Funktion etwas reinschreibt. Kann man nach Möglichkeit den PChar umgehen?
Ich hoffe jemand hilft mir, ich denke nicht das es die schwierigste Frage ist, aber ich komm nicht klar damit.
Danke schon mal.


Moderiert von user profile icontommie-lie: Code-Tags hinzugefügt


tommie-lie - Mo 16.06.03 20:20

Was ist am PChar das problem?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var
  S: String;
begin
  S := 'Mein kleiner String';
  iread(123, PChar(S), ...);
end;


markus030177 - Di 17.06.03 08:35
Titel: Neues von meiner C-Funktion
Das Problem ist ein Übergabeproblem:
Wie kann man am sichersten solche Zeichenkettenübergaben gestalten?
In der Disassemblierung habe ich mittlerweile den Grund gefunden, warum sich mein Programm "aufhängt":

asm:
6479F21A call +$00005bc1; ergibt theor. Adresse 647a4ddb, dort ist aber kein neuer Anweisungsanfang.

So genau hab ich das noch nicht überprüfen können, aber ich denke entweder ist die Funktion in der DLL, wo ich obige Zeile abgeschrieben habe , "im Eimer", oder einer meiner übergebenen Datentypen ist zu kurz bzw. zu lang. Deshalb würd ich gern einen Prototypen in Delphi zu meinem vorher genannten C-Prototypen sehen, den ein erfahrener Programmierer sich ausgedacht hat. Danke.


Delete - Di 17.06.03 09:54

Bringt diese Deklaration hier was?

Delphi-Quelltext
1:
2:
3:
4:
5:
function iread(id: integer;
  buf: LPCSTR;
  bufsize: ulong;
  reason: PINT;
  actualcnt: PULONG): integer; stdcall;

(ohne Gewähr, weil ich die DLL nicht kenne und habe)


Motzi - Di 17.06.03 10:06

Du musst auf die Aufruf-Konvention aufpassen! C-Funktionen verwenden normalerweise (falls nicht anders eingestellt) die Aufrufkonvention cdecl und nicht stdcall! Außerdem würde ich aufpassen, wenn die Funktion Daten in dem PChar ablegt! Wenn du einen String nimmst und diesen dann per Typecast an die Funktion übergibst, dann ergibt sich je nach Typecast ein komplett andres Ergebnis! Am besten einen statischen array of Char nehmen oder einen PChar für den du dyn. Speicher reservierst.


markus030177 - Di 17.06.03 13:58
Titel: Ändert nichts....
Ich denke mal dass meine DLL nicht so funktioniert wie sie soll, egal welche Datentypen und welche Aufrufkonventionen ich verwende, bleibt die aufgerufene Funktion an derselben Stelle hängen. Der Funktionsaufruf sieht auf dem Stack ganz vernünftig aus. Ich schicke gerne den interressierten die DLL, ansonsten hab ich eigentlich schon aufgegeben. Danke aber an alle für die Hilfe!!!


Motzi - Di 17.06.03 14:21

Zeig mal deinen Code... welche Versuche hast du unternommen die Funktion zu importieren und wie hast du diese dann aufgerufen?

Was für eine Dll ist das überhaupt? Gibts vielleicht auch eine Dokumentation dazu?