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:
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;
Nun noch den QT4 Code: (weiss leider nicht wie man C Code formatiert, deshalb als Zitat)
Zitat:
//Pelles C: File-> New-> Project
// Choose
Win32 Dynamic Link Library (
DLL)
// Enter Test in the Name field
// Set the project path in the Location field
//Project Options-> Compiler
//Check: Use Microsoft extensions
//Check: Undecorate exported __stdcall functions
//Add this file to the project
//Project-> Build Test.dll
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>
struct MyStruct
{
int NumA;
int NumB;
int NumC;
char TestA[255];
char TestB[255];
char const* str;
}; // notice the semicolon here
BOOL APIENTRY DllMain(HINSTANCE hInst, DWORD Reason, LPVOID Reserved)
{
if(Reason==DLL_PROCESS_ATTACH)
{
return TRUE;
}
if(Reason==DLL_PROCESS_DETACH)
{
return TRUE;
}
return FALSE;
}
INT __declspec(dllexport) __stdcall Addit ( int A, int B)
{
int C;
C = A + B;
return C;
}
INT __declspec(dllexport) __stdcall Mulit ( int A, int B)
{
int C;
C = A * B;
return C;
}
char __declspec(dllexport) __stdcall stringit ( char A)
{
return A;
}
int __declspec(dllexport) __stdcall recordes (struct MyStruct *strct)
{
// strct->TestA[1] = 'H';
// strct->TestA[0] = 1;
// strct->str = _strdup(strct->TestA);
// strcpy(strct->TestB,strct->TestA);
strcpy(strct->TestB,"*Hallo");
return strct->NumA;
}
VOID __declspec(dllexport) __stdcall FillStruct (struct Mystruct *strct )
{
// copy some values to the structure that is in the LB program
}
Mir ist schon klar, dass das purer C Code ist, QT4 aber eigentlich für C++ geschrieben ist.
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:
Exports from DLL7.dll
5 exported name(s), 5 export addresse(s). Ordinal base is 1.
Sorted by Name:
RVA Ord. Hint Name
-------- ---- ---- ----
00001020 1 0000 Addit
00001080 2 0001 FillStruct
00001030 3 0002 Mulit
00001050 4 0003 recordes
00001040 5 0004 stringit
Tdump mit der funktionierenden
DLL aus QT4:
Zitat:
Exports from Qtest.dll
5 exported name(s), 5 export addresse(s). Ordinal base is 1.
Sorted by Name:
RVA Ord. Hint Name
-------- ---- ---- ----
000012D8 1 0000 _Z10FillStructP8Mystruct@4
00001266 2 0001 _Z5Additii@8
0000127F 3 0002 _Z5Mulitii@8
000012A9 4 0003 _Z8recordesP8MyStruct@4
00001296 5 0004 _Z8stringitc@4
Grüsse
Rainer