Problem mit einbenden der DLL



  • Guten Tag zusammen!

    Ich habe ein Problem beim Nutzen einer DLL. Ich mache das zum ersten mal und finde leider meinen Fehler nicht 😞
    Das Progg soll einen Screenshot erstellen und unter C:\neu.bmp speichern. Bis hierhin funktionier auch noch alles. Allerdings wird danach eine DLL aufgerufen, und diese soll das BMP-Bild in eine JPG-Bild umwandeln. Tut sie aber leider nicht.
    Die DLL ist die Bildconvertierungs DLL von www.Cool-Monkey.de.
    Hat evtl jemand eine Idee wo mein Fehler liegt?
    Oder eine Alternative, wie ich mein Bild in JPG umgewandelt bekomme (evtl jemand nen fertigen Code?)?
    Vielen Dank schonmal!

    void Hook(bool State)
    {
    	if(State == true){
    		hDLL = LoadLibrary("convert2.dll");
    		if(hDLL == NULL){
    			MessageBox(NULL, "Fehler beim Laden der DLL", "Fehler", MB_OK);
    		}
    		Convert = (CONVERTER) GetProcAddress(hDLL,"Convert");
    		if(Convert == NULL){
    			MessageBox(NULL, "Fehler: Convert nicht gefunden in DLL.", "Fehler", MB_OK);
    		}
    	}else{
    		FreeLibrary(hDLL);
    	}
    }
    int WINAPI WinMain(
        HINSTANCE hInstance,
        HINSTANCE hPrevInstance,
        LPSTR lpCmdLine,
        int nCmdShow)
    {
    
    	std::string path = "C:\\neu.bmp";
    	std::string format = "JPG";
    	std::string pathn = "C:\\neu.jpg";
    	LONG quali = 1;
    	LONG bh = 0;
    
    	SaveScreen(path); // erstellt einen Screenshot und speichert ihn unter path
    	Hook(true);
    	Sleep(1000);
    	Convert(path,format,quali,bh,bh,pathn);
    	Hook(false);
    
    	return 0;
    }
    


  • Wie wäre es mit ganz normalem linken?
    Das ist ja nicht umsonst ne dll.



  • Und was genau versteht du unter "ganz normalem linken"?



  • Ich hatte kürzlich mit der libjpeg zu tun und hab aus Neugier das Beispiel ausprobiert und bei mir hat's funktioniert. Was im Code nicht drinnen steht ist die Definition von CONVERTER. Intuitiv hab ich folgenden probiert:

    typedef BOOL (WINAPI *CONVERTER)(LPCSTR lpFile, LPCSTR lpFormat, LONG lQuality, LONG lWidth, LONG lHeight, LPCSTR lpNewName);
    
    CONVERTER Convert;
    

    Da muss man aus den std-strings die char-pointer übergeben (wie bei vielen WinAPIs)

    Convert(path.c_str(), format.c_str(), quali, bh,bh, pathn.c_str());
    

    lg XOR 😉


  • Administrator

    Verim schrieb:

    Und was genau versteht du unter "ganz normalem linken"?

    Du kannst eigentlich jedem Kompiler (bzw. Linker) mitteilen, dass du gegen eine Bibliothek linken möchtest. Dann brauchst du nur noch eine Deklaration der Funktion, welche man sich meistens über die Header der Bibliothek reinholt, und du kannst die Funktion ganz normal aufrufen, wie jede andere Funktion auch. Also kein LoadLibrary und co mehr.

    Grüssli



  • Achja nur zur Auflösung der Sache:
    Das Problem war ein ganz simples. Ich habe ein std::string object anstelle eines char[]-strings übergeben. Einfacher Denkfehler ^^



  • l'abra d'or schrieb:

    Wie wäre es mit ganz normalem linken?
    Das ist ja nicht umsonst ne dll.

    Ähm, genau. Das ist nicht umsonst eine dynamic link library, die man zur Laufzeit einbinden kann. Wie wäre es also mit ganz normalem statischen linken.
    Der Satz liest sich wie "wie wäre es mit ganz normalem Fahren, ist schließlich nicht umsonst ein Flugzeug"...


  • Administrator

    pumuckl schrieb:

    Ähm, genau. Das ist nicht umsonst eine dynamic link library, die man zur Laufzeit einbinden kann. Wie wäre es also mit ganz normalem statischen linken.

    Dir ist aber schon klar, dass zwischen dynamischem Linken und statischem Linken, obwohl beide beim Kompilieren angegeben wurden, ein RIESIGER Unterschied ist? Ich würde jedenfalls nicht gleich zu statischem Linken empfehlen, nur weil man etwas beim Kompilieren dazulinkt.

    Das "dynamic" muss man nicht unbedingt so verstehen, dass man die Bibliothek selber per LoadLibrary lädt.

    Grüssli


Anmelden zum Antworten