bekomm Active Desktop nicht



  • was mir grad aufgefallen ist

    wenn ich ein MFC projekt erstell ist bereits das enthalten in der stdafx

    #ifndef _WIN32_IE			// Allow use of features specific to IE 6.0 or later.
    #define _WIN32_IE 0x0600	// Change this to the appropriate value to target other versions of IE.
    #endif
    

    #dazuedit#

    bin nu soweit das er fehlerfrei compiliert, ich hab das so gelassen, das 0x400 nicht geschrieben
    ich hab in der stdafx die wininet.h direkt unter afxext.h gesetzt, und das shlobj.h direkt unten drann

    aaaaaaaaber - wenn cih die exe starte - kommt: " The Instruction at "0x00411585" referenced memory at "0x00000000". The memory could not be "read" " fehlermeldung

    ich habs so wie in dem beispiel aus der MSDN aufgerufen /=



  • Wenn Du einen Fehler gemacht hast, solltest Du einfach debuggen...



  • mach ich bereits

    int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    {
    	int nRetCode = 0;
    
    	HRESULT hr;
    	IActiveDesktop *pActiveDesktop;
    
    	hr = CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER,
                          IID_IActiveDesktop, (void**)&pActiveDesktop);
    
    	pActiveDesktop->Release();
    
    	// initialize MFC and print and error on failure
    

    wenn ich pActiveDesktop->Release(); auskommentier gehts, wenn nicht kommt dort der fehler, der debugger hilft gar nicht, der sagt an dieser stelle nur acess violation, also das ich auf den zeiger kein zugriff im speicher hab - versteh ich nicht



  • Dann solltest Du vielleicht man den Rückgabewert von "CoCreateInstance" auswerten...
    Dir fehlt nämlich noch ein CoInitialize(Ex)



  • ich hab grad gemerkt
    wenn ich ein leeres projekt erstell und in einer einzelnen .cpp datei das einfueg

    #define _WIN32_IE 0x400
    #include <windows.h>
    #include <tchar.h>
    #include <wininet.h>
    #include <shlobj.h>
    
    int _tmain(int argc, _TCHAR* argv[])
    {
      HRESULT hr;
      IActiveDesktop *pActiveDesktop;
      hr = CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER,
        IID_IActiveDesktop, (void**)&pActiveDesktop);
      pActiveDesktop->Release();
      return 0;
    }
    

    compiliert der fehlerfrei, aber kommt das selbe problem

    von CoInitialize hab ich bisher nirgends gelesen, auch in der MSDN nicht {zu dem problem}





  • das ich nach CoInitialize in der MSDN schau ist mir schon klar, hab cih auch gemacht und eingebaut
    nuuuuur - woher sollte ich wissen das ich das aufrufen muss, in der MSDN und auch sonst ueberall in google steht zu IActiveDesktop nirgends dieser aufruf

    ich hab den nu drinne - compiliert fehlerfrei - und das programm laeuft auch fehlerfrei

    nur ->SetWallpaper wird ignoriert

    HRESULT hr;
    IActiveDesktop *pActiveDesktop;
    CoInitialize( NULL );
    hr = CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER, IID_IActiveDesktop, (void**)&pActiveDesktop);
    pActiveDesktop->SetWallpaper( L"C:\2.jpg", NULL );
    pActiveDesktop->Release();
    

    commandbox geht kurz auf - verschwindet gleich wieder ohne eine aenderung

    auf jeden fall vielen dank fuer deine geduld !!!!!!



  • "C:\2.jpg" -> "C:\\2.jpg"



  • Du hast immer noch nicht die Rückgabewerte geprüft! Dann wäre Dir auch aufgefallen, dass man CoInitialize aufrufen muss!!!

    Aber ich halte mich jetzt hier raus.



  • 000 schrieb:

    "C:\2.jpg" -> "C:\\2.jpg"

    hab ich gemacht, war mir auch aufgefallen - keine aenderung, erscheint kein neues bild

    @jochen
    ich bedanke mich nochmal fuer deine geduld, kann deine jetzige reaktion verstehen {o;
    ps. ich hab bereits CInitialize aufgerufen, siehe den source

    #dazuedit
    mein problem war, ich hab das
    pActiveDesktop->ApplyChanges(AD_APPLY_ALL);
    vergessen

    nu funktioniert alles
    [thread geloest]

    vielen dank



  • Vermutlich musst Du noch den ActiveDesktop zuerst mal aktivieren mit SetDesktopItemOptions und fActiveDesktop=TRUE
    Und natürlich noch "ApplyChanges"...
    Siehe
    http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/programmersguide/shell_adv/activedesktop.asp



  • ne brauch ich nicht aktivieren - ist bereits - da es nun problemlos funktioniert

    danke fuer die geduld, topic kann als [solve] betitelt werden #gg

    HRESULT hr;
    IActiveDesktop *pActiveDesktop;
    CoInitialize( NULL );
    hr = CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER, IID_IActiveDesktop, (void**)&pActiveDesktop);
    
    pActiveDesktop->SetWallpaper( L"C:\\115.jpg", NULL );
    pActiveDesktop->ApplyChanges(AD_APPLY_ALL);
    
    pActiveDesktop->Release();
    

    sehr komisch find ich nur, das ich wininet.h direkt unter afxext setzen muss damit es funktioniert, wenn ich es tiefer anordne bekomm ich nur schwierigkeiten

    .
    .
    .
    #include <afx.h>
    #include <afxwin.h>         // MFC core and standard components
    #include <afxext.h>         // MFC extensions
    
    #include <wininet.h>		// IActiveDesktop
    
    #ifndef _AFX_NO_OLE_SUPPORT
    #include <afxdtctl.h>		// MFC support for Internet Explorer 4 Common Controls
    #endif
    #ifndef _AFX_NO_AFXCMN_SUPPORT
    #include <afxcmn.h>			// MFC support for Windows Common Controls
    #endif // _AFX_NO_AFXCMN_SUPPORT
    
    #include <iostream>
    
    // TODO: reference additional headers your program requires here
    #include <shlobj.h>
    

Anmelden zum Antworten