Dynamischer Zugriff auf eine dll



  • Hast Du Recht. Probier's mal mit enum anstatt type
    und definiere mal zusätzlich noch einen typ, z.B. so:

    enum EnTDPResult =
    (
        //...
    );
    typedef EnTDPResult TDPResult;
    

    Bin mir aber auch nicht 100% sicher und hab's auch nicht
    ausprobiert.

    Gruß,

    Alexander



  • Wenn ich das so mache:

    enum EnTDPResult =
    ( 
        DP_NO_ERROR,                            // no error
        DP_GENERIC_ERROR,            // generic error
        DP_CALLED_TWICE,            // DP function have been called double (only with DPSetDispatchMessage()) 
        DP_OPEN_FAILED,                // device (FDL) opening failed
        DP_FDL_LOAD_FAILED,            // unable to load FDL library 
        DP_NOT_OPEN,                // FDL not opened 
        DP_THREAD_ENABLED,            // error, background thread enabled: function disabled 
        DP_NO_THREAD_ENABLED,                // error, background thread is not enabled: function disabled 
        DP_OUT_OF_MEMORY,            // out of memory 
        DP_CONVERTER_FAILED,                // PROFIBUS converter not found, failed or bad type 
        DP_ILL_ADDRESS,                // illegal DP slave address 
        DP_SAP_OPEN_FAILED,            // PROFIBUS SAP opening failed 
        DP_SLAVE_OPEN,                // slave is allread open 
        DP_SLAVE_NOT_OPEN,            // slave is not opened 
        DP_SLAVE_NOT_FOUND,            // slave not found
        DP_ILLEGAL_CONFIG,            // illegal PROFIBUS configuration 
        DP_CFG_ERROR,                // sconfiguration error on startup 
        DP_PRM_ERROR,                // parameter error on startup 
        DP_CFG_AND_PRM_ERROR,                // configuration and parameter error on startup 
        DP_BAD_LENGTH,                // data length incorrect 
        DP_INCOMPLETE,                // background operation initiated: use DPGetAsyncResult() for answer. High word holds operation ID */ 
        DP_NORESULT                // no background operation finished DPGetAsyncResult() 
    );
           typedef EnTDPResult TDPResult;
    

    sagt der Compiler
    [C++ Fehler] TProfibus.h(13): E2447 'EnTDPResult' muß ein bereits definiertes enum sein.

    [edit] sorry, hab' EnTDPResult geschrieben, eigentlich...[/edit]



  • Das typedef brauchst du doch gar nicht. Mit dem enum ist doch schon alles deklariert. Mal abgesehen davon, hab ich mal irgendwo gelesen, dass der Rückgabetyp einer Funktion nicht zur Signatur gehört.



  • roN schrieb:

    Wenn ich das so mache:

    enum TDPResult =
    ( 
        // ...
    );
           typedef EnTDPResult TDPResult;
    

    sagt der Compiler
    [C++ Fehler] TProfibus.h(13): E2447 'EnTDPResult' muß ein bereits definiertes enum sein.

    Dann sieh Dir noch mal genau an, was ich geschrieben habe.
    Das ist doch ein kommerzielle Dll, oder? Gibt's denn da von Seiten des Herstellers keine
    ordentliche Unterstützung, Beispiele etc.?

    Gruß,

    Alexander



  • Alexander Kempf schrieb:

    Dann sieh Dir noch mal genau an, was ich geschrieben habe.

    Siehe [edit]

    Alexander Kempf schrieb:

    Das ist doch ein kommerzielle Dll, oder? Gibt's denn da von Seiten des Herstellers keine
    ordentliche Unterstützung, Beispiele etc.?

    ja, ist schon eine kommerzielle Dll und ich hab' auch ein beispiel, aber das kompiliert nicht mit dem BCB5 und ist mit statischer dll-Einbindung gemacht (hab' ich auch schon probiert, dann hat's von der Herstellerseite geheissen, das funktioniere nur mit BCB6...beim 5er hab' ich immer einen Linker-Error bekommen :() ein Beispiel das ich habe, ist für Delphi, das kompiliert ohne Probleme, dann hab' ich versucht den Delphicode mit dem BCB zu kompilieren=Wieder dieser Linker-Error ärger dann hab' ich gedacht, ich probiere mal, die Funktionen dynamisch zu laden...)



  • Hast Du's, wie Braunstein vorgeschlagen hat, auch mal ohne den typedef probiert?



  • Alexander Kempf schrieb:

    Hast Du's, wie Braunstein vorgeschlagen hat, auch mal ohne den typedef probiert?

    ja, hab' ich= selbes Ergebniss... 😞



  • Versuchen wir es doch mal anders.
    Was war das denn für ein Linker-Error?



  • Braunstein schrieb:

    Was war das denn für ein Linker-Error?

    Okay, der war folgender:

    **[Linker Fehler] Unresolved external '__stdcall DPInit(char , char )' referenced from Z:\5085XX\508957_MSIA\SOFTWARE\BUMASO\BUMASO 0.6\TPROFIBUS.OBJ
    Wobei meine TProfibus.cpp so aussieht:

    //---------------------------------------------------------------------------
    #include <vcl.h>
    #ifdef _WIN32
        #include <windows.h>
    #endif
    #include "prof_dp.h"
    #include "TProfibus.h"
    #include "Tools.h"
    #include "MainForm.h"
    // local variables
    static HANDLE					ConsoleOutput;	// console output
    static CONSOLE_SCREEN_BUFFER_INFO		ConsoleInfo;	// current console info
    static UINT					uNotifyMessage;	// notify message
    __declspec(dllimport) EXPO1 DP_RESULT EXPO2 DPInit(LPSTR pDllName, LPSTR pInitSting);
    
    // prototypes
    static bool InitCommunication(unsigned int uPort);
    static bool StopCommunication(void);
    static bool GetAnswer(void);
    static bool DpeGetAnswer(void);
    static bool ReceiveMessages(void);
    static bool OperationMenu(void);
    static bool DpeOperationMenu(void);
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    //---------------------------------------------------------------------------
    __fastcall TProfibus::TProfibus()
    {
    	ConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
    	if (!GetConsoleScreenBufferInfo(ConsoleOutput, &ConsoleInfo))
    	{
    
    	}
    }
    //---------------------------------------------------------------------------
    void __fastcall TProfibus::Init(int SlaveID_int, unsigned int uPort)
    {
    if (!InitCommunication(uPort))
    	{
    	ShowMessage("lauft nöd");
    	}
    else
            {
            ShowMessage("Communication Started");
            // Alle Components auf dem Formular enablen
            Tools::SetAllComponents(Main_Frm, true, crArrow);
            }
    }
    //---------------------------------------------------------------------------
    static bool InitCommunication(unsigned int uPort)
    {
    #if USE_THREAD
    	DWORD			dwThreadID;		// id of current thread
    #endif
    	char			Buffer[20];		// text buffer
    
    	ShowMessage("COM" + uPort);
    #if 1
    	if (DPInit(NULL, Buffer) != DP_NO_ERROR)
    #else
    	if (DPInit("fdlcp", NULL) != DP_NO_ERROR)		// open SIEMENS Profibus card
    #endif
    	{
    		ShowMessage("Unable to init DP");
    		return FALSE;
    	}
    									// get notification message
    #if USE_THREAD
    	uNotifyMessage = RegisterWindowMessage("DrvDemoMessage");
    	if (!uNotifyMessage)
    	{
    		ShowMessage("Unable to register message");
    		return FALSE;
    	}
    									// notify by thread ID
    	dwThreadID = GetCurrentThreadId();
    									// notify only acyclic operations.
    	if (DPSetUserMsg(NULL, dwThreadID, uNotifyMessage, MSG_TYPE_ASYNC /*| MSG_TYPE_DPCYCLE */ | MSG_TYPE_DPE) != DP_NO_ERROR)
    	{
    		ShowMessage("Unable to set user message");
    		return FALSE;
    	}
    									// enable communication thread
    	if (DPEnableCommThread(TRUE) != DP_NO_ERROR)
    	{
    		StopCommunication();
    		ShowMessage("Unable to init thread");
    		return FALSE;
    	}
    #endif
    
    	return TRUE;
    }
    
    //---------------------------------------------------------------------------
    

    [edit]code hinzugefügt[/edit]



  • hallo,

    also das enum ist bullshit.

    schreib mal

    enum EnTDPResult //und hier kein gleichzeichen.
    { //geschweifte klammer
    ...

    }; //geschweifte klammer und semikolon

    dann übersetzt das auch der compiler und du hast schon mal ein problem weniger.

    mfg
    murph



  • murphy schrieb:

    hallo,

    dann übersetzt das auch der compiler und du hast schon mal ein problem weniger.

    Das ist richtig, der Linker motzt aber immernoch:
    **[Linker Fehler] Unresolved external '__stdcall DPInit(char , char )' referenced from Z:\5085XX\508957_MSIA\SOFTWARE\BUMASO\BUMASO 0.6\TPROFIBUS.OBJ



  • Hallo,

    Der Linker Error besagt nur, dass eine Funktion vom Typ __stdcall DPInit(char *, char *)" nicht definiert wurde. Ändere doch mal die Definition in deiner cpp auf diesen Typ. Also so:

    __declspec(dllimport) __stdcall DPInit(char* pDllName, char* pInitSting);
    

    Desweitern könnte vielleicht auch ein Blick in die Hilfe bezüglich __stdcall helfen (hier zum Beispiel zu Compileroption -VC).

    Ciao



  • Braunstein schrieb:

    Hallo,

    Der Linker Error besagt nur, dass eine Funktion vom Typ __stdcall DPInit(char *, char *)" nicht definiert wurde. Ändere doch mal die Definition in deiner cpp auf diesen Typ. Also so:

    __declspec(dllimport) __stdcall DPInit(char* pDllName, char* pInitSting);
    

    Desweitern könnte vielleicht auch ein Blick in die Hilfe bezüglich __stdcall helfen (hier zum Beispiel zu Compileroption -VC).

    Ciao

    Dann motzt der Compiler wieder:

    [C++ Fehler] TProfibus.cpp(15): E2356 Redeklaration von '__stdcall DPInit(char *,char *)' mit anderem Typ
    [C++ Fehler] prof_dp.h(171): E2344 '__stdcall DPInit(char *,char *)' bereits deklariert
    

    und die Hilfe über __stcall werde ich mir jetzt mal zu gemüte führen...



  • Sag mal, hast du eigentlich die zugehörige prof_dp.lib mit in dein Projekt eingebunden (für statische Bindung)? Falls du sie nicht hast kansst du sie dir mit Hilfe von ImpLib erzeugen.



  • roN schrieb:

    Dann motzt der Compiler wieder:
    [C++ Fehler] prof_dp.h(171): E2344 '__stdcall DPInit(char *,char *)' bereits deklariert

    Hast Du die Header-Datei "prof_dp.h" denn selbst geschrieben oder wurde die mitgeliefert?
    Ich arbeite nämlich auf einem ähnlichen Gebiet und mußte mal eine Dll von Siemens ein-
    binden. Dort hat das mit der mitgelieferten Header-Datei auch nicht funktioniert.

    Gruß,

    Alexander



  • Braunstein schrieb:

    Sag mal, hast du eigentlich die zugehörige prof_dp.lib mit in dein Projekt eingebunden (für statische Bindung)? Falls du sie nicht hast kansst du sie dir mit Hilfe von ImpLib erzeugen.

    Klar, hab' ich erzeugt und eingebunden.

    Und die Header-Datei wurde mit geliefert.



  • roN schrieb:

    Klar, hab' ich erzeugt und eingebunden.
    Und die Header-Datei wurde mit geliefert.

    😕 Linkst Du eigentlich jetzt statisch oder dynamisch?
    Mir kommt's so vor, als ob Du da einen Mischmasch hast.

    Gruß,

    Alexander



  • Alexander Kempf schrieb:

    roN schrieb:

    Klar, hab' ich erzeugt und eingebunden.
    Und die Header-Datei wurde mit geliefert.

    😕 Linkst Du eigentlich jetzt statisch oder dynamisch?
    Mir kommt's so vor, als ob Du da einen Mischmasch hast.

    Gruß,

    Alexander

    Mischmasch hab' ich keinen, ich hab' zwei Versionen, zum einen unterstützt mich jemand aus der borland Newsgroup bei der dynamischen und ihr hier, unterstützen mich bei der statischen Einbindung. Mir ist schlussendlich egal, wie ich darauf zugreiffen kann, hauptsache es funktioniert mal...



  • roN schrieb:

    (...) und ihr hier, unterstützen mich bei der statischen Einbindung.

    😕 Wie paßt das zum Thema des Threads?



  • Alexander Kempf schrieb:

    roN schrieb:

    (...) und ihr hier, unterstützen mich bei der statischen Einbindung.

    😕 Wie paßt das zum Thema des Threads?

    Gar nicht, am anfang war die hilfe zur dynamischen Einbindung da, aber dann hat Braunstein nach dem Linker Error gefragt den ich bei der statischen Einbindung bekomme....so war das...
    schau sonst mal auf den Beitrag vom 14. Okt 2003 um 13:13.


Anmelden zum Antworten