Autor Beitrag
markus030177
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 16.06.03 18:14 
Wie würdet ihr aus Delphi4 eine Funktion aufrufen (Prototyp gefragt), die in einer C-DLL folgendermassen aussieht:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Mo 16.06.03 20:20 
Was ist am PChar das problem?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var
  S: String;
begin
  S := 'Mein kleiner String';
  iread(123, PChar(S), ...);
end;

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
markus030177 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 17.06.03 09:54 
Bringt diese Deklaration hier was?
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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.

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
markus030177 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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?

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!