Mal wieder IActiveDesktop



  • Servus ihr Programmierer,

    ich bin nach langem Suchen, wie ich ein JPG-Bild als Hintergrundbild einstellen kann, auf diesen Sourcecode gekommen:

    #define _WIN32_IE 0x400 
    #include <windows.h> 
    #include <tchar.h> 
    #include <wininet.h> 
    #include <shlobj.h> 
    
    long changeWallpaper(char *strPicPath, DWORD flags) 
    { 
     WCHAR tempstr[MAX_PATH]; 
     MultiByteToWideChar(CP_ACP, 0, strPicPath, -1, tempstr, sizeof(tempstr) ); 
    
     HRESULT hr; 
     IActiveDesktop *pActiveDesktop; 
    
     CoInitialize(NULL); 
     hr = CoCreateInstance(CLSID_ActiveDesktop, NULL,CLSCTX_INPROC_SERVER,IID_IActiveDesktop, (void**)&pActiveDesktop); 
     if(hr == S_OK ) 
     { 
           pActiveDesktop->SetWallpaper(tempstr, 0); 
           WALLPAPEROPT wpo; 
           wpo.dwSize = sizeof(WALLPAPEROPT); 
           wpo.dwStyle = flags; 
           pActiveDesktop->SetWallpaperOptions(&wpo,0); 
           pActiveDesktop->ApplyChanges(AD_APPLY_ALL); 
           pActiveDesktop->Release(); 
           return TRUE; 
     } 
     else return FALSE; 
    }
    

    Ich arbeite mit dev c++. Der bringt folgende Fehler:

    desctop.c: In function `changeWallpaper':
    desctop.c:14: error: `IActiveDesktop' undeclared (first use in this function)
    desctop.c:14: error: (Each undeclared identifier is reported only once
    desctop.c:14: error: for each function it appears in.)
    desctop.c:14: error: `pActiveDesktop' undeclared (first use in this function)
    desctop.c:17: error: `CLSID_ActiveDesktop' undeclared (first use in this function)
    desctop.c:17: error: `IID_IActiveDesktop' undeclared (first use in this function)
    
    desctop.c:21: error: `WALLPAPEROPT' undeclared (first use in this function)
    desctop.c:21: error: syntax error before "wpo"
    desctop.c:22: error: `wpo' undeclared (first use in this function)
    desctop.c:25: error: `AD_APPLY_ALL' undeclared (first use in this function)
    
    C:\Dev-cpp\bin\make.exe: *** [desctop.o] Error 1
    

    Er findet also IActiveDesktop... nicht. Aber in welcher Bibliothek ist die Funktion definiert? Was hab ich falsch gemacht?



  • Nimm Visual C++



  • Geht das auch mit Dev c++?





  • Danke für den Link, aber da war ich auch schon. Das Problem ist die Lösung, die bei diesem Thema herauskam:

    Ich habe es jetzt endlich geschafft. Danke für die Hinweise.
    Entscheidend ist offenbar folgende Sequenz:

    #define _WIN32_IE 0x0400 // IE 4+
    #include <afx.h>
    #include <wininet.h>

    die auch noch an der richtigen Stelle eingebunden werden muß.

    Aber ich habe keine Bibliothek, die afx.h heißt. Jetzt hab ich mal gegooglet und bin auf folgende Adresse gestoßen:
    http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=3019&SiteID=1
    Da steht, dass die Bibliothek in der Platform SDK enthalten ist. Kann man die Bibliothek auch allein ohne SDK downloaden?



  • Ein afx.h Header hat bei einem Dev++ Projekt nichts zu suchen, zumal du es wahrscheinlich gar nicht hinbekommen solltest, diesen gescheit/vollständig zu implementieren. Hast du denn schon dieses Define drinnen? Das muss ganz oben hin vor deinen Headern!

    #define _WIN32_IE 0x0400 // IE 4+
    


  • Verwende VC2008EE, da ist das PSDK schon dabei...
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-143003.html

    Für Dev C++ musst Du Dich an den Hersteller wenden!



  • Ja, hab ich. Siehe oben^^.



  • @Jochen: Also hat man das bisher noch nie mit Dev c++ gemacht?


  • Mod

    In der Doku steht dass Du shlobj.h includen musst!
    http://msdn2.microsoft.com/en-us/library/bb776357.aspx

    Hast Du das gemacht?



  • Oha, okay jetzt habe ich es auch gesehen 🤡
    Habe es gerade geprüft, das hier funktioniert als Konsolenprogramm mit VS05 auch ohne afx.h

    #define _WIN32_IE 0x400
    
    #include <windows.h>
    #include <tchar.h>
    #include <wininet.h>
    #include <shlobj.h>
    
    long changeWallpaper (char *strPicPath, DWORD flags)
    {
    	WCHAR tempstr[MAX_PATH];
    	MultiByteToWideChar (CP_ACP, 0, strPicPath, -1, tempstr, sizeof(tempstr) );
    
    	HRESULT hr;
    	IActiveDesktop *pActiveDesktop;
    
    	CoInitialize(NULL);
    	hr = CoCreateInstance (CLSID_ActiveDesktop, NULL,CLSCTX_INPROC_SERVER,IID_IActiveDesktop, (void**)&pActiveDesktop);
    	if(hr == S_OK )
    	{
    		pActiveDesktop->SetWallpaper(tempstr, 0);
    		WALLPAPEROPT wpo;
    		wpo.dwSize = sizeof(WALLPAPEROPT);
    		wpo.dwStyle = flags;
    		pActiveDesktop->SetWallpaperOptions(&wpo,0);
    		pActiveDesktop->ApplyChanges(AD_APPLY_ALL);
    		pActiveDesktop->Release();
    		return TRUE;
    	}
    	else return FALSE;
    }
    
    int main ()
    {
    	changeWallpaper ("C:\\Dokumente und Einstellungen\\Sebastian\\Eigene Dateien\\Eigene Bilder\\Jessica_Alba.jpg", 0);
    	return 0;
    }
    

    Raten würde ich dir auch zu VS. Dev++ ist nicht wirklich das Wahre.



  • Felix15 schrieb:

    @Jochen: Also hat man das bisher noch nie mit Dev c++ gemacht?

    Ich kenn mich mit Dev C++ nicht aus... weiss nur, dass man da das PSDK nicht einbinden kann, sondern das nehmen muss was mitkommt... und das ist in unserer schnelllebigen Zeit leider schlecht...



  • Ok, danke für eure Antworten. Ich probiers dann mal mit Visual Studio. Wenn ihr doch einmal herausfinden solltet, wie das mit dev c++ geht, schreibt mir bitte ne Mail.



  • Dev-C++ wird seit Februar 2005 nicht mehr weiterentwickelt.
    Alternative (außer VisualStudio): Code:Blocks

    greetz, Swordfish



  • Swordfish schrieb:

    Code:Blocks

    Aber das Problem mit dem PSDK bleibt dabei das gleiche, oder?



  • Jochen Kalmbach schrieb:

    Swordfish schrieb:

    Code:Blocks

    Aber das Problem mit dem PSDK bleibt dabei das gleiche, oder?

    Das Problem bleibt das gleiche wenn der MinGW verwendet wird. Code::Blocks ist nur eine IDE!



  • Fazit: Code:Blocks ist nicht verwendbar...



  • MinGW ist nicht verwendbar 😉

    greetz, Swordfish



  • kann man sich nicht die nötigen definitionen aus dem windows sdk klauen?



  • Und woher die a-Dateien nehmen?
    Wenn Du zu viel Zeit hast, mag das ja der Weg sein...


Anmelden zum Antworten