Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   aus c-Programm eine Delphi-dll aufrufen (https://www.delphipraxis.net/84477-aus-c-programm-eine-delphi-dll-aufrufen.html)

Susanne 17. Jan 2007 13:31


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);

sirius 17. Jan 2007 13:34

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).

Susanne 17. Jan 2007 13:51

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?

Muetze1 17. Jan 2007 13:52

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.

Susanne 17. Jan 2007 13:55

Re: aus c-Programm eine Delphi-dll aufrufen
 
vielen dank, jetzt funktioniert es!

sirius 17. Jan 2007 13:57

Re: aus c-Programm eine Delphi-dll aufrufen
 
Zitat:

Zitat von Muetze1
ersetze das emfpohlene stdcall in der Delphi DLL mit cdecl; und erstell es erneut.

:wall: ach ja, ach ja :coder2:


Edit: C will sich halt doch selber um seinen Stack-Pointer kümmern.

Susanne 17. Jan 2007 15:23

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:
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.
in meinem c-programm sieht das ja so aus:
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?

sirius 17. Jan 2007 15:27

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');

mkinzler 17. Jan 2007 15:29

Re: aus c-Programm eine Delphi-dll aufrufen
 
Versuch mal:

Code:
char i[80] = func("Test", "5512", "Test c_code");

Susanne 17. Jan 2007 15:36

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 23:05 Uhr.
Seite 1 von 3  1 23      

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