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 FUNKTIONSNAME
    

    Schreibste 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
    safexy

    p.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);
    #endif
    

    dlltest.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


Anmelden zum Antworten