![]() |
Zugriff mit Delphi auf QT4 DLL! Prozedureinstiegspunkt!
Hi,
ich versuche eine QT4 erzeugte DLL durch Delphi zu nutzen. Ich habe eine DLL mit PellesC erzeugt. Mit dieser DLL funktioniert alles (allerdings pures C). Ich habe den Code nach QT4 umgesetzt und kann ihn kompilieren. Die DLL ist auch vorhanden. Wenn ich diese aus Delphi aufrufe bekomme´ich Prozedureinstiegspunkt nicht gefunden. Ich gehe davon aus, dass ich irgendetwas bei der Einstellung in QT4 falsch mache. Frage: Wie muss ich QT4 einstellen um an eine Delphi konforme DLL zu kommen.
Delphi-Quellcode:
Nun noch den QT4 Code: (weiss leider nicht wie man C Code formatiert, deshalb als Zitat)
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type Mystruct =record NumA,NumB,NumC:integer; TestA,TestB:shortstring; str:shortstring; end; TForm1 = class(TForm) Button1: TButton; Label1: TLabel; Button2: TButton; Label2: TLabel; Button3: TButton; Label3: TLabel; Button4: TButton; Label4: TLabel; Label5: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; function Addit(a, b: integer): integer;stdcall ; function Mulit(a, b: integer): integer;stdcall ; function stringit(a:char): char;stdcall ; function recordes(a:Pointer): integer;stdcall ; implementation {$R *.dfm} function Addit(a, b: integer): integer;stdcall;external 'Qtest.dll'; //cdecl function Mulit(a, b: integer): integer;stdcall;external 'Qtest.dll'; //cdecl function stringit(a:char): char;stdcall ;external 'Qtest.dll'; //cdecl function recordes(a:Pointer): integer;stdcall ;external 'Qtest.dll'; //cdecl procedure TForm1.Button1Click(Sender: TObject); begin label1.Caption:=inttostr(Addit(2,3)); end; procedure TForm1.Button2Click(Sender: TObject); begin label2.Caption:=inttostr(Mulit(2,3)); end; procedure TForm1.Button3Click(Sender: TObject); var a:char; begin a:='h'; label3.Caption:=Stringit(a); end; procedure TForm1.Button4Click(Sender: TObject); var a:^Mystruct; begin new(a); a^.NumA:=100; a^.NumB:=200; a^.NumC:=300; a^.TestA:='Test'; label4.Caption:=inttostr(recordes(@a^)); label5.caption:=a^.TestB; dispose(a); end; Zitat:
Da ich sehr wenig Erfahrung mit C und C++ habe wäre es nett wenn mir jemand auf die Sprünge helfen könnte. Noch eine Ergänzung: Tdump mit der funktionierenden DLL aus PellesC: Zitat:
Zitat:
Rainer |
Re: Zugriff mit Delphi auf QT4 DLL! Prozedureinstiegspunkt!
Hallo! Vielleicht solltest du die Funktionen nicht durch ihren Namen sondern über ihren Index ansprechen. Dieser scheint ja zumindest bei beiden DLL-Versionen zu stimmen.
|
Re: Zugriff mit Delphi auf QT4 DLL! Prozedureinstiegspunkt!
Hi,
scheint etwas schwierig zu sein das Thema. Offensichtlich weiss keiner so genau was da abgeht. Hab das Problem gelöst: Statt: INT __declspec(dllexport) __stdcall Addit ( int A, int B) muss: extern "C" __declspec(dllexport) INT Addit ( int A, int B) In Delphi, beim Aufruf: function Addit(a, b: integer): integer;cdecl;external 'Qtest.dll'; //cdecl statt stdcall Fragt mich aber nicht warum! Wenn ich die Aufrufe jedenfalls so ändere bekomme ich die gleichen Einsprungprozeduren wie bei PellesC und es funktioniert auch alles. Mein nächster Schritt wird jetzt sein eine C++ Klasse in der DLL zu deklarieren und sie von aussen, durch Delphi, zu nutzen. Ich halte euch auf dem laufenden. Grüsse Rainer |
Re: Zugriff mit Delphi auf QT4 DLL! Prozedureinstiegspunkt!
Hallo,
du bist auf das "Problem" Name-Mangeling reingefallen. Jede C-Funktion beginnt mit einem _ int Foo(); wird zu _Foo Eine c++-Klasse aus Delphi heraus zu benutzen, funktioniert nicht. Heiko |
Re: Zugriff mit Delphi auf QT4 DLL! Prozedureinstiegspunkt!
Hi Hoika,
es funktioniert ja mit den gegebenen Änderungen. Solange ich extern "C" davorstehen habe klappt das ohne weiters. Die andere variante funktioniert auch mit _ nicht. Grüsse Rainer |
Re: Zugriff mit Delphi auf QT4 DLL! Prozedureinstiegspunkt!
Liste der Anhänge anzeigen (Anzahl: 2)
Hi,
so ist das funktionsfähig: Delphi Code:
Delphi-Quellcode:
C++ Code mit QT4:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type Mystruct =record NumA,NumB,NumC:integer; TestA,TestB:shortstring; str:shortstring; end; TForm1 = class(TForm) Button1: TButton; Label1: TLabel; Button2: TButton; Label2: TLabel; Button3: TButton; Label3: TLabel; Button4: TButton; Label4: TLabel; Label5: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; function Addit(a, b: integer): integer;cdecl ; function Mulit(a, b: integer): integer;cdecl ; function stringit(a:char): char;cdecl ; function recordes(a:Pointer): integer;cdecl ; implementation {$R *.dfm} function Addit(a, b: integer): integer;cdecl;external 'Qtest.dll'; //cdecl function Mulit(a, b: integer): integer;cdecl;external 'Qtest.dll'; //cdecl function stringit(a:char): char;cdecl ;external 'Qtest.dll'; //cdecl function recordes(a:Pointer): integer;cdecl ;external 'Qtest.dll'; //cdecl procedure TForm1.Button1Click(Sender: TObject); begin label1.Caption:=inttostr(Addit(2,3)); end; procedure TForm1.Button2Click(Sender: TObject); begin label2.Caption:=inttostr(Mulit(2,3)); end; procedure TForm1.Button3Click(Sender: TObject); var a:char; begin a:='h'; label3.Caption:=Stringit(a); end; procedure TForm1.Button4Click(Sender: TObject); var a:^Mystruct; begin new(a); a^.NumA:=100; a^.NumB:=200; a^.NumC:=300; a^.TestA:='*Tester'; label4.Caption:=inttostr(recordes(@a^)); label5.caption:=a^.TestB; dispose(a); end; end. Zitat:
Wer es selbst probieren will, ich habs angehängt. (Der Delphi Teil ist mit D7 geschrieben, der QT Teil mit QT4) Was mir, zur Zeit, auch noch nicht gefällt ist, dass ich libgcc_s_dw2-1.dll mitliefern muss. Ich gehe allerdings davon aus, dass das mit QT4 und dem GCC Compiler zusammenhängt. Grüsse Rainer |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:10 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