bekomm Active Desktop nicht



  • mahlzeit

    ich bekomm einfach das IActiveDesktop nicht in mein projekt
    ich hab schon die shlobj includiert - auch _WININET_ und alles moegliche probiert was ich bei google gefunden hab

    ich benutz visual studio 2005

    die MSDN hab ich acuh rauf und runter gelesen - ich komm einfach nicht vorran
    immer heisst es er kenne dieses IActiveDesktop nicht }=

    hilfeeee



  • Folgendes geht bei mir Problemlos mit VS2005:

    #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;
    }
    


  • hmm - schlau werd ich irgendwie nicht daraus
    wenn ich ein leeres projekt erstell, funktioniert das problemlos
    wenn ich das aber in ein MFC projekt paste, dann funktioniert das nicht

    versteh ich nicht
    sind die selben header
    sobald das IActiveDesktop kommt streikts



  • Du musst in Deinen Projekteinstellungen in den Proprozessor-Directivs das

    _WIN32_IE=0x400

    hinzufügen.
    Dann natürlich noch in der stdafx.h
    das

    #include <wininet.h>
    #include <shlobj.h>
    

    einfügen (in dieser Reihenfolge!)

    Dann sollte es auch mit einem MFC Programm gehen.



  • hab ich nu gemacht, das mit den programmeinstellungen wusste ich ne
    trotzdem kommt weiterhin

    Error	1	error C2065: 'IActiveDesktop' : undeclared identifier	e:\cpp\wall2005\wall2005\wall2005.cpp	19
    


  • 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