![]() |
aus c-Programm eine Delphi-dll aufrufen
hallo,
vielleicht kann mir ja jemand weiterhelfen. Mein Problem besteht darin, dass ich von einem c-Programm auf eine in delphi erstellte dll zugreifen möchte. Hier der delphi-code
Delphi-Quellcode:
library notiz;
uses SysUtils, Classes, ComObj, ActiveX, StdVcl, Windows, Messages, Variants, Graphics, Controls, Forms, Dialogs, AutoArchive_TLB, StdCtrls, Inifiles, ExtCtrls, uLogFile, uProgHilfe; {$R *.res} function anhaengen(dbID, docID, text: String): String; var test : String; sl_test : TStringList; Dms : HypDms; Notiz : IHypDocDosFile; begin CoInitialize(nil); ShowMessage(dbid+' '+docID+' '+text); ShowMessage('hallo1'); try Dms := CoHypDms.Create; ShowMessage('AA-Biblio initialisiert!'); except ShowMessage('Die AA-Biblio konnten nicht aktiviert werden!'); exit; end; ShowMessage('hallo2'); notiz:= IHypDocDosFile(Dms.OpenDocument(dbID, strtoint(docID))); ShowMessage('hallo3'); if (notiz <> nil) then begin ShowMessage('hallo4'); if notiz.ExistComponent('CC_TEXT', 1) then begin ShowMessage('hallo5'); test:= notiz.SaveComponentToString('CC_TEXT', 1); end; end else ShowMessage('hallo10'); notiz:= nil; CoUnInitialize; ShowMessage('ende'); end; exports anhaengen; begin end. und ich versuche nun von dem C-Programm aus darauf zuzugriefen und das funktioniert nicht. Der Teil in c sieht so aus: HMODULE handle; handle = LoadLibrary("notiz.dll"); if (handle != NULL) { //dies ist mit Sicherheit falsch definiert, da //das alles strings sind, die die dll erwartet und zurückgibt, //aber ich hab keine Ahnung, wie ich die umschreiben muss typedef int (*DLLFUNC)(char*, char*, char*); DLLFUNC func = (DLLFUNC)GetProcAddress(handle, "anhaengen"); if (func != NULL) { //das hier macht er nicht! int i = func("Test", "5512", "Test c_code"); } } FreeLibrary(handle); |
Re: aus c-Programm eine Delphi-dll aufrufen
1. Du musst statt Strings PChar nehmen (Das eentspricht dem *char in C
2. Du musst die Funktion mit "stdcall" definieren, damit alle Übergabe-Variablen aus dem Stack geholt werden (dort wo sie auch C hinschreibt). |
Re: aus c-Programm eine Delphi-dll aufrufen
danke, ich habe die Strings durch PChar ersetzt und das funktioniert auch soweit, dass die dll ihre Arbeit ordentlich tut. Die dll zeigt mir das als letztes an: ShowMessage('ende');
Danach kommt aber eine Fehlermeldung, mit der ich nichts anfangen kann: Debug Error File: i386\chkesp.c The Value of ESP was not properly saved across a function call. This is usually a Result of calling a function declared with one calling convention with a function pointer declared with a different calling convetion Was soll mir das sagen? |
Re: aus c-Programm eine Delphi-dll aufrufen
Ersetze das empfohlene stdcall in der Delphi DLL mit cdecl; und erstell es erneut.
/EDIT: Zur Erklärung: C verwendet per default (DLLFUNC) die Cdecl Aufufkonvention und nicht die StdCall. |
Re: aus c-Programm eine Delphi-dll aufrufen
vielen dank, jetzt funktioniert es!
|
Re: aus c-Programm eine Delphi-dll aufrufen
Zitat:
Edit: C will sich halt doch selber um seinen Stack-Pointer kümmern. |
Re: aus c-Programm eine Delphi-dll aufrufen
eine Frage hätte ich dann doch noch.
meine dll soll einen Rückgabewert an das c-programm zurückgeben (verkürzt dargestellt):
Delphi-Quellcode:
in meinem c-programm sieht das ja so aus:
library notiz;
uses SysUtils, ... {$R *.res} function anhaengen(dbID, docID, text: PChar): PChar; cdecl; var ... begin Result:= ''; if notiz.LoadComponentFromString(test , 'CC_TEXT', 1, true) then Result:='' else Result:='Error - laden der Komponente'; end; exports anhaengen; begin end. char i = func("Test", "5512", "Test c_code"); ich hätte jetzt angenommen, dass wenn kein Fehler in der dll war, wäre i jetzt leer und ansonsten würde da eben dieser Error-Text drin stehen. Das stand nun aber immer nur Zahlen drin z.B. mal -128. Wo liegt da noch das Problem? |
Re: aus c-Programm eine Delphi-dll aufrufen
Reicht es vielleicht auch, einfach einen Integerwert (als eine Art Fehlercode zu übergeben). Ist einfacher.
Oder fürs erste: Result:=PChar('Error'); |
Re: aus c-Programm eine Delphi-dll aufrufen
Versuch mal:
Code:
char i[80] = func("Test", "5512", "Test c_code");
|
Re: aus c-Programm eine Delphi-dll aufrufen
ok, dann eben als integer - danke
bei dem anderen bekomme ich folgende Fehlermeldung: 'char' kann nicht in 'char [80]' konvertiert werden |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:09 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