DLL Rückgabewert



  • Hallo,
    ich habe folgenden Code

    typedef UINT (CALLBACK* DLLFUNC1)(UINT);
    DLLFUNC1 dllfunc1;
    UINT uReturnVal, ConnectReady;
    
    HINSTANCE hModule = ::LoadLibrary(L"C:\\TCPIP\\Client.exe"); 
    
    dllfunc1=(DLLFUNC1)GetProcAddress(hModule, "ConnectStatus");
    
    uReturnVal=dllfunc1(ConnectReady);
    

    und erhalte am Ende des Kompilierens folgenden Fehler:

    Code wird generiert.
    : error C2220: Warnung wird als Fehler interpretiert, es wurde keine executable-Datei generiert.
    

    Der Fehler bezieht sich auf Zeile 9.

    Bin für jeden Tipp dankbar.

    Gruß
    lucio



  • Da muss auch zuerst eine Warnung da gewesen sein... ich vermute dass bei der Deklaraion ein * fehlt...



  • Hallo,
    dumm gelaufen.
    Die fehlende Initialisierung war das Problem.

    typedef UINT (CALLBACK* DLLFUNC1)(UINT); 
    DLLFUNC1 dllfunc1; 
    UINT uReturnVal, ConnectReady; 
    ConnectReady=0;                    //<---------------  
    
    HINSTANCE hModule = ::LoadLibrary(L"C:\\TCPIP\\Client.exe"); 
    
    dllfunc1=(DLLFUNC1)GetProcAddress(hModule, "ConnectStatus"); 
    
    uReturnVal=dllfunc1(ConnectReady);
    

    Danke für die Mühe
    Gruß
    lucio


  • Mod

    BTW: Prüfungen, ob die entsprechenden Funktionen auch geklappt haben würde ich aber dringend empfehlen...



  • Da hegt Herr Richter einen Verdacht ....



  • lucio77 schrieb:

    Da hegt Herr Richter einen Verdacht ....

    Zum Beispiel den Verdacht, dass dein Programm explodiert, anstatt eine aussagekräftige Meldung auszuspucken, wenn die exe mal nicht da ist oder die Funktion nicht in ihr enthalten ist (z.B. weil andere Version)?



  • Das ist nicht mein Problem,
    diese Routinen hatte ich mittlerweile eingebaut.

    Mein Problem ist ein anderes:
    Die DLL ist eine XLL und wird von Excel als AddIn geladen.
    Die XLL soll die Exe nach dem Verbindungstatus fragen.

    Dummerweise schliesst Excel ohne Fehlermeldung.
    Die XLL kompiliert ohne Warnungen und ohne Error.

    Mein Log zeigt, dass die XLL die Exe und die Methode findet
    und aufruft.

    Ich poste jetzt einfach mal den Code:

    XLL:

    void CheckParam(){		
    
    if (uCfg.Get(L"resume_automatically") == L"true") {
    
    	typedef int (CALLBACK* DLLFUNC1)(int);
    	DLLFUNC1 dllfunc1;
    	int uReturnVal, ConnectReady;
    	ConnectReady=-5;
    	uReturnVal=0;
    
    	HMODULE hModule = LoadLibrary(L"C:\\TRXLLink\\Clink.exe"); 
    	if (!hModule){
    
    		FreeLibrary(hModule);
    		FiDL::LTrace() << __FUNCTION__  <<  "Clink.exe Library nicht gefunden" << FiDL::endl;;
    
    	}else {
    		FiDL::LTrace() << __FUNCTION__  <<  "Clink.exe Library gefunden" << FiDL::endl;;
    
    		dllfunc1=(DLLFUNC1)GetProcAddress( hModule, "ConnectStatus");
    
    			if (!dllfunc1){
    				FiDL::LTrace() << __FUNCTION__  <<  "Clink.exe::ConnectStatus: Methode nicht gefunden" << FiDL::endl;;
    			}else {
    				FiDL::LTrace() << __FUNCTION__  <<  "Clink.exe::ConnectStatus: Methode gefunden" << FiDL::endl;;
    				do {
    
    					FiDL::LTrace() << __FUNCTION__  <<  "Clink.exe::ConnectStatus: call the function" << FiDL::endl;;
    					uReturnVal=dllfunc1(ConnectReady);
    
    					FiDL::LTrace() << __FUNCTION__  <<  "Clink.exe::ConnectStatus: return value delivered." << FiDL::endl;;
    					Sleep(5000);
    
    				}while (ConnectReady!=1);
    			}
    
    			RecalculateWorkbooks(1);
    	}		
    }
    

    Exe:

    extern "C" __declspec(dllexport) int ConnectStatus(int ConnectOK) { 
    LDebug() << MODULE_MAIN << " enter" << endl;
    if (uConnected== -1) {
    	LDebug() << MODULE_MAIN << "Connect Status -1" << endl;
    	return (ConnectOK=1);
    }else {
    	LDebug() << MODULE_MAIN <<"Connect Status 0" << endl;
    	return (ConnectOK=0);
    			}
    	}
    

    Gruß
    lucio



  • Der Rückgabewert hier ist immer != 0

    extern "C" __declspec(dllexport) int ConnectStatus(int ConnectOK) {
    LDebug() << MODULE_MAIN << " enter" << endl;
    if (uConnected== -1) {
        LDebug() << MODULE_MAIN << "Connect Status -1" << endl;
        return (ConnectOK=1);
    }else {
        LDebug() << MODULE_MAIN <<"Connect Status 0" << endl;
        return (ConnectOK=0);
                }
        }
    

    Weil das

    return (ConnectOK=1);
    

    oder das

    return (ConnectOK=0);
    

    statt mit = mit == geschrieben werden sollte.



  • Hallo,
    danke für den Hinweis. Das war ungeschickt von mir.
    Den Fehler hat es aber nicht behoben.

    Hat jemand eine Idee wie ich das Problem noch näher eingrenzen kann?

    Danke im Voraus
    Gruß
    lucio


  • Mod

    Und ab wo kanllt es nun?

    Bist Du sicher, dass diese Signatur stimmt:

    typedef UINT (CALLBACK* DLLFUNC1)(UINT);
    


  • Martin Richter schrieb:

    Bist Du sicher, dass diese Signatur stimmt:

    typedef UINT (CALLBACK* DLLFUNC1)(UINT);
    

    Die Zeile habe ich aus der MSDN.

    Es kracht gar nicht.
    Excel schliesst einfach.

    Kann ein Mutex der EXE dazu führen?
    Ich habe ihn gerade entdeckt.
    Die Exe stammt nicht von mir.
    Ich werde ihn einmal entfernen.

    Gruß
    lucio


Anmelden zum Antworten