WinFuture-Forum.de: C++dll In Delphi Verwenden/problem Mit Parametern Bei Funktionen - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

C++dll In Delphi Verwenden/problem Mit Parametern Bei Funktionen


#1 Mitglied ist offline   trazor 

  • Gruppe: Mitglieder
  • Beiträge: 7
  • Beigetreten: 29. Dezember 04
  • Reputation: 0

geschrieben 16. Mai 2006 - 12:52

Höchst vereherte Programmiererkollgen,

ich möchte mit folgendem Problem, aufgrund meines an seine Grenzen stoßenden Wissens, an Sie herantreten:

also... leutz...

Ich hab da was. Und zwar erstmal: Ich verwende den Borland C++ Builder 5 und Borland Delphi 4.
Mein Vorhaben: Im C++-Builder eine DLL programmieren und in Delphi verwenden.
Das Problem: Nach erfolgreicher Einbindung der Funktionen der DLL, welche auch ausgeführt werden können und richtige Rückgabewerte liefern musste ich leider feststellen, dass an die DLL übergebene Parameter nicht richtig verwendet werden. Am jeweils verwendeten Datentyp liegt es nicht, da selbst bei Boolean-Werten keine richtige Parameterübergabe erfolgte.
Hier liefere ich die beiden Quelltexte einer Test-DLL.

Delphi Testprogramm:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
	Button1: TButton;
	Edit2: TEdit;
	Edit1: TEdit;
	Edit3: TEdit;
	Label1: TLabel;
	procedure Button1Click(Sender: TObject);
  private
	{ Private-Deklarationen }
  public
	{ Public-Deklarationen }
  end;

const
  dieDll = 'C:\ordner\Project1.dll';
  function _berechne(var A, B : Integer) : Integer;  external dieDll;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var zahl1, zahl2 : Integer;
begin
 zahl1 := StrToInt(Edit3.Text);
 zahl2 := StrToInt(Edit1.Text);
 Edit2.Text := IntToStr(_berechne(zahl1, zahl2));
end;

end.


Und hier der Quelltext der Test-DLL in C++:
#include <windows.h>

#pragma argsused

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
 return 1;
}
//---------------------------------------------------------------------------

// extern verfügbare funktionen:
extern "C" __declspec(dllexport)int berechne(int, int);

// implemetierungen aller funktionen
int __export berechne(int A, int B)
{
 return A + B;
}


Ich bitte um Problemlösungen, wie ich denn Parameter korrekt übergeben kann an die DLL. (Sie werden gar nicht übergeben!)
Bitte keine Vorschläge, wie "Verwende Delphi DLL und Delphi Programm" bzw. das selbe mit C++, da dies unmöglich ist (zu große Haupt-programme mit vorgeschriebenen Programmiersprachen).

Habe schon etliche Tutorials gelesen zu DLLs und auch mehrere Foren durchforstet...

Eventuell zu beachtende Features: In der richtigen DLL muss ein Thread laufen, der mit Funktionen der DLL arbeitet.
0

Anzeige



#2 Mitglied ist offline   trazor 

  • Gruppe: Mitglieder
  • Beiträge: 7
  • Beigetreten: 29. Dezember 04
  • Reputation: 0

geschrieben 16. Mai 2006 - 13:29

nach tagenlanger suche haben wir das ergebnis ;)
die Zeile:
function _berechne(var A, B : Integer) : Integer;  external dieDll;

muss wie folgt modifiziert werden:
function _berechne(var A, B : Integer) : Integer; cdecl; external dieDll;


die brgründung habe ich noch nicht, aber das macht auch nichts. da stdcall nicht funktioniert hat und in vielen beispielen gar nicht von beidem verwendet wurde war die verwirrung groß. eben dieses "cdecl", welches ich erst auf eine französischen foren-farm gefunden habe hilft weiter ;)

trotzdem danke für's durchlesen *g*

eventuell könnt ihr mir sagen warum oder sogar sagen warum das schlecht is oder sonst was!

gruß!

trazor
0

#3 Mitglied ist offline   mo 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.794
  • Beigetreten: 17. Juni 02
  • Reputation: 0
  • Wohnort:Ulm / BaWü

geschrieben 17. Mai 2006 - 08:51

hmmm ich glaube mal wo gelesen zu haben, dass delphi und C (C++ schließe ich da einfach mal ein) parameter in genau umgekehrter reihenfolge auf den stack schieben. deshalb müsste bei einem parameter der >1byte ist, ein riesen kuddelmuddel ausbrechen und du deshalb delphi beim functioncall mit cdecl angeben musst, dass er es in C-style übergeben soll.
I'm mó. mo's good twin.
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0