Dll in C++ schreiben sodass diese z.B. in VB genutzt werden kann



  • hallo

    der titel sagt eigentlich alles aus.
    ich möchte eine klasse in eine dll verfrachten, die auch User die mit VB programme erstellen nutzen können.

    geht das? wenn ja weiß jemand wie?

    ich hab eine normale dll erstellt, aber in VB kann man diese nicht nutzen! VB sagt daszu: keine gültige dll.



  • Das liegt daran, das VB-Linker anders linken als C++-Linker und dementprechend eine in C++ erstellte lib nicht woanders gelinkt werden kann. Bestimtt gibts da etwas, das dein Problem löst, aber ich kenns nicht 😉



  • Ich habe da mal was kleines zum testen gemacht (mit MFC allerdings):

    ; DLLBsp.def : Deklariert die Modulparameter für die DLL.
    
    LIBRARY      "DLLBsp"
    
    EXPORTS
        ; Explizite Exporte können hier eingefügt werden
    
    / DLLBsp.h : Hauptheaderdatei für die DLLBsp DLL
    //
    
    #pragma once
    
    #ifndef __AFXWIN_H__
    	#error 'stdafx.h' muss vor dieser Datei in PCH eingeschlossen werden.
    #endif
    
    #include "resource.h"		// Hauptsymbole
    
    // CDLLBspApp
    // Siehe DLLBsp.cpp für die Implementierung dieser Klasse
    //
    
    class CDLLBspApp : public CWinApp
    {
    public:
    	CDLLBspApp();
    
    // Überschreibungen
    public:
    	virtual BOOL InitInstance();
    
    	DECLARE_MESSAGE_MAP()
    };
    
    // DLLBsp.cpp : Definiert die Initialisierungsroutinen für die DLL.
    //
    
    #include "stdafx.h"
    #include "DLLBsp.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    const double g_Tilgung = 1;
    
    //
    //	Hinweis:
    //
    //		Wird diese DLL dynamisch an die MFC-DLLs gebunden,
    //		muss bei allen von dieser DLL exportierten Funktionen,
    //		die MFC-Aufrufe durchführen, das Makro AFX_MANAGE_STATE
    //		direkt am Beginn der Funktion eingefügt sein.
    //
    //		Beispiel:
    //
    //		extern "C" BOOL PASCAL EXPORT ExportedFunction()
    //		{
    //			AFX_MANAGE_STATE(AfxGetStaticModuleState());
    //		// Hier normaler Funktionsrumpf
    //		}
    //
    //		Es ist sehr wichtig, dass dieses Makro in jeder Funktion
    //		vor allen MFC-Aufrufen angezeigt wird. Dies bedeutet, dass es
    //		als erste Anweisung innerhalb der Funktion ausgeführt werden
    //		muss, sogar vor jeglichen Deklarationen von Objektvariablen,
    //		da ihre Konstruktoren Aufrufe in die MFC-DLL generieren
    //		könnten.
    //
    //		Siehe MFC Technical Notes 33 und 58 für weitere
    //		Details.
    //
    
    // CDLLBspApp
    
    BEGIN_MESSAGE_MAP(CDLLBspApp, CWinApp)
    END_MESSAGE_MAP()
    
    // CDLLBspApp-Erstellung
    
    CDLLBspApp::CDLLBspApp()
    {
    	// TODO: Hier Code zur Konstruktion einfügen
    	// Alle wichtigen Initialisierungen in InitInstance positionieren
    }
    
    // Das einzige CDLLBspApp-Objekt
    
    CDLLBspApp theApp;
    
    // CDLLBspApp Initialisierung
    
    BOOL CDLLBspApp::InitInstance()
    {
    	CWinApp::InitInstance();
    
    	return TRUE;
    }
    
    extern "C" {
    	__declspec (dllexport) double __stdcall Rate (double Summe, double Zinssatz) {
    		return (Summe * (g_Tilgung + Zinssatz) / 100) / 12;
    	}
    
    	__declspec (dllexport) double __stdcall GetTilgung () {
    		return g_Tilgung;
    	}
    }
    

    Und in VB

    Module Module1
    	Declare Function Rate Lib "DLLBsp.dll" _
    	Alias "_Rate@16" (ByVal Kreditsumme As Double, _
    	ByVal Zinssatz As Double) As Double
    	Declare Function GetTilgung Lib "DllBsp.dll" _
    	Alias "_GetTilgung@0" () As Double
    
    	Sub DllTest()
    		MsgBox("Für 100.000 Euro Kreditsumme müssen Sie bei " _
    		  & "5.5 % Zinssatz und " _
    		  & GetTilgung() & "%Tilgung " & Rate(100000, 5.5) _
    		  & " Euro monatlich bezahlen.")
    	End Sub
    
    	Sub main()
    		DllTest()
    	End Sub
    End Module
    

    Die .dll muss natürlich zu der .exe gelegt werden.



  • danke SirLant 👍

    also würde es gehen. aber in der dll ist keine funktion sondern eine klasse, daher bin ich etwas verdutzt wie es angestellt wird.



  • Klassen gehen auch, aber frag mich nicht wie, ich habe nur 1mal bisher ne dll erstellt und das ist die oben

    Edit:

    Hab mal ne Runde gegoogelt aber kein Tutorial oder etwas in die Richtung gefunden wo erklärt wird wie das geht 😞



  • SirLant schrieb:

    Klassen gehen auch, aber frag mich nicht wie, ich habe nur 1mal bisher ne dll erstellt und das ist die oben

    Edit:

    Hab mal ne Runde gegoogelt aber kein Tutorial oder etwas in die Richtung gefunden wo erklärt wird wie das geht 😞

    genau das is das problem 😞

    ich hab nach x begriffen gesucht bis manchmal auf seite 20 und nix gefunden. langsam zweifle ich daran ob es mit klassen überhaupt geht 😞



  • Jetzt hab ich was gefunden http://www.nickles.de/c/s/21-0011-213-1.htm



  • SirLant schrieb:

    Jetzt hab ich was gefunden http://www.nickles.de/c/s/21-0011-213-1.htm

    oh das sieht echt gut aus. das werd ich mal durchstudieren.

    danke vielmals



  • Üblicherweise erstellt man zu diesem Zweck COM-Server (DLL/EXE). Die kannst du im Prinzip mit allen "COM-fähigen" Programmiersprachen ansprechen, unter Windows versteht sich. Zur Erstellung verwendest du entweder MFC oder, etwas kompakter, ATL. Von Hand erstellt kann das Ganze beliebig kompliziert werden, mit ATL bleibt es es meistens überschaubar.

    mfg JJ



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • SirLant schrieb:

    Klassen gehen auch, aber frag mich nicht wie, ich habe nur 1mal bisher ne dll erstellt und das ist die oben

    MFC habe ich zwar lange nicht mehr gemacht, aber an ein paar Details erinnere ich mich schon ... Ahja, hier :

    "Wenn Sie in C++ programmieren, generiert der Compiler für eine Funktion wie MeineFunktion eine ergänzenten Funktionsnamen. Unter dem ergänzten Namen versteht man den langen Namen, den der Compiler auf Basis des Klassennamens, des Funktionsnamens und dem Parametertyp erstellt. Die ergänzenten Namen werden in der MAP Datei des Projektes aufgelistet."

    ...

    "Wenn Sie eine DLL benötigen, die in jeder Programmiersprache unter Windows geladen werden kann (incl. VB6), sollten Sie auf eine normale DLL zurückgreifen. Eine wichtige Einschränkung ist hier, das normale DLLs nur Funktionen im C-Stil exportieren können. C++ Klassen, Member-Funktionen oder überladene Funktionen können nicht exportiert werden, weil jeder C++-Compiler sein eigenes Verfahren verwendet. Innerhalb der DLL können Sie jedoch C++Klassen(insb. MFC-Klassen) verwenden."

    Inside Visual C++ 6.0 | ISBN: 3860634615
    S.493-500

    cu

    P84



  • Ich glaub aber nicht das du diese Klasse (ohne COM) in VB verwendet hast.

    mfg JJ



  • Ok, da hab ich jetzt was durcheinandergebracht, allgemeine .dlls müssen sich im "C-Stil" befinden damit es geht, aber prinzipiell kann man alles in ne .dll stopfen, wenn sie nicht von ner anderen Sprache verwendet werden soll, _aber_ wenn ich es noch richtig weiß kann man unter .NET Klassen von jeder .NET-Fähigen Sprache in ne .dll stecken und diese von jeder .NET-Fähigen Sprache auch benutzen.





  • Ja was nun, reden wir über VB 6 oder VB.NET, das geht aus dem ersten Posting nicht hervor. 😕

    mfg JJ



  • .NET ist dein Freund.


Log in to reply