dll unter Visual Studio .net für Dephi 7 erstellen
-
Hi,
möchte C-Code (geschriebene Funktionen) in delphi 7 verwenden.
wie erstelle ich unter Visual Studio .net eine dll die von einem delphi 7 programm geladen werden kann.irgendwo eine gute anleitung im netz?
oder
was für ein Projekt muss ich auswählen, was noch einstellen?Code für eine dll mit der funktion
int addieren(int zahl1, zahl2)als beispiel würde mich evtl. zum Verständnis weiterhelfen.
(habe unter delphi schon eine solche dll geschrieben und auch eingebunden, funktioniert auch ohne probleme, mein Versuch mit einer unter VC erzeugten dll endete mit einem Programmabsturzt)
bye
safexy
-
Möchtest du die dll mit Hilfe der MFC erstellen? Wenn ja wählste nen MFC-DLL Projekt und schreibst einfach C-Funktionen da rein und die exportierbaren sehen so aus:
extern "C" __declspec (dllexport) RÜCKGABEWERT __stdcall FUNKTIONSNAMESchreibste einfach in PROJEKTNAME.cpp
-
hier mit MFC (der aufruf unter delphi findet die funkion addiere nicht, handle ergibt NIL)
// rechnen.cpp : Definiert die Initialisierungsroutinen für die DLL. // #include "stdafx.h" #include "rechnen.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CrechnenApp BEGIN_MESSAGE_MAP(CrechnenApp, CWinApp) END_MESSAGE_MAP() // CrechnenApp-Erstellung extern "C" __declspec(dllexport) int __stdcall addiere(int zahl1, int zahl2) { return zahl1 + zahl2; } CrechnenApp::CrechnenApp() { // TODO: Hier Code zur Konstruktion einfügen // Alle wichtigen Initialisierungen in InitInstance positionieren } // Das einzige CrechnenApp-Objekt CrechnenApp theApp; // CrechnenApp Initialisierung BOOL CrechnenApp::InitInstance() { CWinApp::InitInstance(); return TRUE; }hier mein versuch mit win32 dll (gleiche problem)
// rechnen.cpp : Definiert den Einstiegspunkt für die DLL-Anwendung. #include "stdafx.h" BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } extern "C" int __stdcall addiere(int zahl1, int zahl2) { return zahl1+zahl2; }hier der Code der delphi dll (der funktioniert)
library rechnen; uses SysUtils, Classes; {$R *.res} function addiere(zahl1, zahl2: integer): integer; stdcall; begin result:=zahl1+zahl2; end; exports addiere; begin end.und hier der Programmcode in Delphi der die dll aufruft (mit der delphi erzeugten dll funktioniert es, mit denen aus Visual Studio jedoch nicht)
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TSummenFunktion = function(zahl1, zahl2: integer): integer; stdcall; TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} function addieren(zahl1, zahl2: integer; var summe: integer): integer; var SummenFunktion: TSummenFunktion; Handle: THandle; begin Handle:=LoadLibrary(PChar(ExtractFilePath(ParamStr(0))+'rechnen.dll')); if Handle <> 0 then begin @SummenFunktion := GetProcAddress(Handle, 'addiere'); if @SummenFunktion <> nil then begin summe:=SummenFunktion(zahl1, zahl2); result:=1; end else result:=0; FreeLibrary(Handle); end else result:=0; end; procedure TForm1.Button1Click(Sender: TObject); var summe: integer; begin if (addieren(strtoint(edit1.Text),strtoint(edit2.Text),summe) <> 0) then edit3.Text:=inttostr(summe) else edit3.Text:= 'Fehler: DLL nicht ladbar!'; end; end.die dlls habe ich im selben verzeichnis wie das programm selbst (immer das auktuelle in den richtigen Namen umbenannt)
wer kann helfen?
bye
safexyp.s.:
die delphi bespiele stammen von http://www.delphi-source.de/tutorials/dlls/?page=1 , wurden jedoch von mir einwenig modifiziert
-
Hi,
hab nun alles per Hand erstellt...
headerdatei:
#if!defined DLLTEST_H #define DLLTEST_H __declspec(dllexport) int addiere(int zahl1, int zahl2); #endifdlltest.c :
#include "dlltest.h" __declspec(dllexport) int addiere(int zahl1, int zahl2) { return zahl1+zahl2; }bei Aufruf unter obigen delphi-porgramm liefert die dll den richtigen Wert zurück, weise ich den zurückgegebenen Wert summe der Delphi-Funktion
"function addieren(zahl1, zahl2: integer; var summe: integer): integer" außerhalb dieser, einem objekt zu, kommt es zu einem Fehler sobald er die Zuweisung ausführen soll.bei Verwendung der unter delphi generierten DLL tritt dieser Fehler nicht auf.
was mache ich falsch?
bye
safexy
p.s.: auch wenn ich summe global unter delphi deklariere, passiert dieser mir unverständliche Fehler
Rechtschreibfehler bitte überlesen - es ist schon spät und mach mich nun mal lieber ins Bett

-
Hi,
schritt für schritt komm ich etwas weiter

da hab ich wohl was vergessen...ändere ich beide Köpfe in C in
__declspec(dllexport) int __stdcall addiere(int zahl1, int zahl2) // ^^^^^^^^^^^sollte es ja auch eigentlich mit stdcall unter Delphi funktionieren..., macht es aber nicht, jetzt findet er einfach die Funktion addiere in der DLL nicht mehr...
belasse ich es in
__declspec(dllexport) int addiere(int zahl1, int zahl2)und ändere im Delphiprogramm
type TSummenFunktion = function(zahl1, zahl2: integer): integer; stdcall;in
type TSummenFunktion = function(zahl1, zahl2: integer): integer; cdecl;dann funktioniert es.
Meine Frage ist, was muss ich tun, damit ich es unter delphi auch als stdcall aufrufen kann?
bye
safexy