Einzelnen Beitrag anzeigen

R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Zugriff mit Delphi auf QT4 DLL! Prozedureinstiegspunkt!

  Alt 14. Dez 2009, 07:22
Hi,
so ist das funktionsfähig:
Delphi Code:
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;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.
C++ Code mit QT4:

Zitat:
#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)
extern "C" __declspec(dllexport) INT Addit ( int A, int B)
{
int C;
C = A + B;
return C;
}

//INT __declspec(dllexport) __stdcall Mulit ( int A, int B)
extern "C" __declspec(dllexport) INT Mulit ( int A, int B)
{
int C;
C = A * B;
return C;
}

//char __declspec(dllexport) __stdcall stringit ( char A)
extern "C" __declspec(dllexport) char stringit ( char A)
{
return A;
}

//INT __declspec(dllexport) __stdcall recordes (struct MyStruct *strct)
extern "C" __declspec(dllexport) INT 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," Rainer Unger");
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 klar, dass das C Code ist und nicht so ganz zur C++ Umgebung passt!
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
Angehängte Dateien
Dateityp: zip dll_test_454.zip (231,3 KB, 4x aufgerufen)
Dateityp: zip qtest_109.zip (15,7 KB, 3x aufgerufen)
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat