Froma us DLL in EXE app aufrufen



  • ok danke das macht sinn. jedoch weiss ich trotzdem nicht warum ich eine zugriffsverletzung bekomme 😕 hier noch der code der dll klasse.

    //---------------------------------------------------------------------------
    
    #ifndef CaxH
    #define CaxH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class __export TdllForm : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
    private:	// Anwender-Deklarationen
    public:		// Anwender-Deklarationen
    	__fastcall TdllForm(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TdllForm *dllForm;
    //---------------------------------------------------------------------------
    #endif
    


  • Hallo

    Debugger benutzten und die genaue Zeile finden, an der die Exception vorkommt. Das muß an einer speziellen Anpassung von dir liegen, das Verfahren an sich ist korrekt.

    bis bald
    akari



  • der debuger hält an der zeile

    TdllForm *dllform = new TdllForm(NULL);
    

    an. und nun? 😕
    muss sonst am dll projekt noch was getan werden? z.b. am einprungspunkt oder so? dieser ist original wie vom projektmanager erstellt.



  • Wo tritt die Zugriffsverletzung denn genau auf?
    Im Programm oder in der DLL?
    Und in welcher Funktion?
    Was passiert an der Stelle an der die Zugriffsverletzung ausgelöst wird?

    Entschuldigung, da war jemand schneller!



  • ich hab alle informationen die mir bekannt sind (inkl. code) gesagt. mehr weiss ich nicht. insofern kann ich nichts zu deinem post sagen.



  • ich hab alle informationen die mir bekannt sind (inkl. code) gesagt. mehr weiss ich nicht. insofern kann ich nichts zu deinem post sagen.



  • kann mir sonst einer ein beispielprojekt einer dll und einer exe anwendung machen und hier von beiden den code posten? dann sehe ich eher was ich falsch gemacht habe.



  • hier ein neues projekt von mir:

    exe - .cpp

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    #include "DLL.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    	TfrmDLL *dll = new TfrmDLL(NULL);
        dll->ShowModal();
        delete dll;
    }
    //---------------------------------------------------------------------------
    

    exe - .h
    nichts - da unverändert.

    dll - .cpp

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #include <windows.h>
    #pragma hdrstop
    //---------------------------------------------------------------------------
    
    #pragma argsused
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
    {
    	return 1;
    }
    //---------------------------------------------------------------------------
    

    dll - .h

    //---------------------------------------------------------------------------
    
    #ifndef DLLH
    #define DLLH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class __export TfrmDLL : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
    private:	// Anwender-Deklarationen
    public:		// Anwender-Deklarationen
    	__fastcall TfrmDLL(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TfrmDLL *frmDLL;
    //---------------------------------------------------------------------------
    #endif
    

    Weiteres
    Dem exe projekt wurde die *.lib der dll datei hinzugefügt.

    Problem
    Wie beschrieben, zugriffsverletzung



  • class __export TfrmDLL : public TForm
    

    So geht das auch nicht:

    Funktionen/Klassen einer DLL müssen ex- bzw. importiert werden. Da du offenbar das

    #ifdef __DLL__
    #	define DLL_TYP __declspec(dllexport)
    #else
    #	define DLL_TYP __declspec(dllimport)
    #endif
    

    nicht nutzen willst / nicht gelesen hast, brauchst du 2 Header Dateien für dein DLL Formular

    Der erste ist für das Compilieren und Linken der DLL und exportiert die Klasse.

    Die zweite ist für das Compilieren und Linken der EXE un importiert die Klasse.

    Mit obigen Code kannst du dir das ersparen un eine Header Datei für beide Vorgänge nutzen.



  • verstehe dich nicht ganz. wie genau muss ich mein beispiel nun anpassen und was genau muss ich dann an dateien noch verwenden? 🙄



  • ich glaube ich verstehe dich nun. logisch ist natürlich das exe import muss und dll export. deswegen ging es ja nicht wie du sagst, mit dem __export ohne define makro. jedoch klappt das ganze nicht so ganz. im dll header (der dann auch im exe projekt so verwendet wird) steht das nun:

    //---------------------------------------------------------------------------
    #ifndef DLLH
    #define DLLH
    
    #ifdef DLLH
    #define DLL __declspec(dllexport)
    #else
    #define DLL __declspec(dllimport)
    #endif
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class DLL TfrmDLL : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
    private:	// Anwender-Deklarationen
    public:		// Anwender-Deklarationen
    	__fastcall TfrmDLL(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TfrmDLL *frmDLL;
    //---------------------------------------------------------------------------
    #endif
    

    ist das korrekt so?



  • scheinbar muss ich den gleichen header für das exe projekt noch ohne den anfang benutzen, also so:

    //---------------------------------------------------------------------------
    #ifdef DLLH
    #define DLL __declspec(dllexport)
    #else
    #define DLL __declspec(dllimport)
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class DLL TfrmDLL : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
    private:	// Anwender-Deklarationen
    public:		// Anwender-Deklarationen
    	__fastcall TfrmDLL(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TfrmDLL *frmDLL;
    //---------------------------------------------------------------------------
    #endif
    

    stimmt das nun alles?



  • scheinbar muss ich den gleichen header für das exe projekt noch ohne den anfang benutzen,

    Wer har das gesagt?

    Liest du eigentlich das was man postet?
    Was auf den Seiten, auf die die Links verweisen, steht?

    Mach dein Formular einfach in die EXE und warte bis du mehr Erfahrung hast.


Anmelden zum Antworten