Probleme mit abstrakter Klasse



  • Ich habe eine Funktion gesucht, um den Desktophintergrund zu maximieren und bin dabei auf die Klass IActiveDesktop gestoßen.

    BCB Hilfe Link:

    ms-help://embarcadero.rs2009/ShellCC/platform/shell/reference/ifaces/iactivedesktop/iactivedesktop.htm
    

    Als ich eine Instanz erstellen wollte, habe ich bemerkt, das IActiveDesktop abstrakt ist und da ist es schlecht mit einer Instanz;

    Ich dachte, ich mach eine Klasse, lass von IActiveDesktop erben und erstell die, aber ich mache was nicht ganz richtig. Die erbende Klasse wird auch abstrakt ?

    `[BCC32 Fehler] Wallpaper.h(13): E2353 Klasse 'Wallpaper' ist abstrakt, weil '__stdcall IActiveDesktop::QueryInterface(const _GUID &,void * 😉 = 0'

    BCB Hilfe: (ich steig da nicht ganz durch)

    class A {
    public:
       virtual myex( int ) = 0;
       virtual twoex( const int ) const = 0;
    };
    class B : public A {
    public:
       myex( int );
       twoex( const int ) const;
    };
    B b;   // ok
    


  • Hallo

    Du must in deiner abgeleiteten Klasse mindestens noch die Methode QueryInterface implementieren. Und zwar mit genau dem Prototypen wie verlangt.

    bis bald
    akari



  • Tim06TR schrieb:

    Ich habe eine Funktion gesucht, um den Desktophintergrund zu maximieren und bin dabei auf die Klass IActiveDesktop gestoßen.

    IActiveDesktop ist ein Interface (angedeutet durch das I), genauer gesagt, ein COM-Interface.

    Tim06TR schrieb:

    ms-help://embarcadero.rs2009/ShellCC/platform/shell/reference/ifaces/iactivedesktop/iactivedesktop.htm
    

    Oder hier:
    http://msdn.microsoft.com/en-us/library/bb776830%28VS.85%29.aspx

    Tim06TR schrieb:

    Ich dachte, ich mach eine Klasse, lass von IActiveDesktop erben und erstell die, aber ich mache was nicht ganz richtig. Die erbende Klasse wird auch abstrakt ?

    Wenn du ein Interface implementieren willst, mußt du natürlich alle seiner Methoden implementieren.

    Tim06TR schrieb:

    BCB Hilfe: (ich steig da nicht ganz durch)

    class A {
    public:
       virtual myex( int ) = 0;
       virtual twoex( const int ) const = 0;
    };
    class B : public A {
    public:
       myex( int );
       twoex( const int ) const;
    };
    B b;   // ok
    

    Das "=0" bei den Methoden von A bedeutet, daß A sie nicht implementiert. Bei den Methoden von B steht kein "=0", deshalb erwartet der Compiler, daß du irgendwo eine Implementation davon erstellt hast. (Wenn du es vergessen hast, schlägt das Linken fehl.)

    Weil für alle Methoden von B eine Implementation existiert, kannst du Instanzen von B erstellen. A ist eine abstrakte Basisklasse ohne Datenfelder, was gemeinhin als Interface aufgefaßt wird. Man sagt, B "implementiert A".

    Allerdings ist der Sinn der Sache hier gar nicht, daß du IActiveDesktop implementierst (oder bist du der Desktop? 😉 ). Du solltest eher so etwas machen.

    Im Übrigen wäre es wahrscheinlich sinnvoll, wenn du dein Unterfangen mit der gründlichen Lektüre eines Tutorials für COM beginnst, etwa mit diesem hier. Andernfalls wirst du nicht weit kommen.



  • Habe nun die Änderungen vorgenommen.

    if (MessageBox(NULL,"Übernehmen ?","",MB_YESNO) == 6)
    	{
    		Graphics::TBitmap* Bitm = new Graphics::TBitmap;
    		TJPEGImage* jpg = new TJPEGImage;
    		jpg->LoadFromFile(ChampionFolder+"\\"+Splashes->Strings[Beginning+Ima-1]);
    		Bitm->Assign(jpg);
    		Bitm->SaveToFile(LeagueMODkonf->LOLPLACE->Text + "Designs\\Wallpaper.bmp");
    		SystemParametersInfo(SPI_SETDESKWALLPAPER,0,(LeagueMODkonf->LOLPLACE->Text + "Designs\\Wallpaper.bmp").c_str(),SPIF_SENDCHANGE|SPIF_UPDATEINIFILE);
    	  //	std::auto_ptr<IActiveDesktop> AD;
    	  //	AD->SetWallpaperOptions((LPCWALLPAPEROPT)WPSTYLE_STRETCH,NULL);
    
    		HRESULT hr;
    		IActiveDesktop *pActiveDesktop;
    
    		hr = CoCreateInstance(Shlobj::CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER,
    		IID_IActiveDesktop, (void**)&pActiveDesktop);
    
    		pActiveDesktop->SetWallpaperOptions((LPCWALLPAPEROPT)WPSTYLE_STRETCH,NULL);
    		pActiveDesktop->Release();
    
    	}
    

    Ich bekomme einen Fehler zur Laufzeit (Shell32.dll) in dem obigen Code.
    Wenn ich den Hintergrund auch mit IActiveDesktop ändern will, funktioniert auch das nicht, also etwas stimmt an meinem Code nicht.

    EDIT: Zugrifsverletzun 00000002

    EDIT 2: UPS



  • Tutorial durcharbeiten, Debugger benutzen!



  • Zitat:

    I found out that Active Desktop is no longer supported after windows xp (sigh).
    

    Das ist Mist. ich brauch ne Alternative.

    EDIT: Eventuell, geht nicht beides,(evtl. 2 Lösungen: für Win7 und Vista bzw XP und geringer).



  • Idee !

    Ich könnte doch ein Bild nehmen, dass exakt die Größe des Bildschirms hat, das würde zwar bei mehreren Bildschirmen, nur Schirme mit exakt der selben Auflösung unterstützen, aber das stört micht nicht.

    Fragt sich nur (ich speicher ja eh noch mal als bitmap) wie(ob) ich ein Bild resizen kann !



  • was willst du überhaupt eigentlich machen?

    greetz KN4CK3R



  • BMP als Hintergrundbild (UND ZWAR STRETCHED !)
    mehr eigentlich nicht.



  • bool __fastcall Tdesktopchanger::setimg(String dateipfad)
    {
    	WCHAR FileName[MAX_PATH];
    	MultiByteToWideChar(CP_ACP, 0, dateipfad.c_str(), dateipfad.Length() + 1, FileName, sizeof(FileName));
    
    	CoInitialize(NULL);
    	IActiveDesktop *pActiveDesktop;
    
    	HRESULT hr = CoCreateInstance(Shlobj::CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER, IID_IActiveDesktop,(void**)&pActiveDesktop);
    	if(hr != S_OK)
    		return false;
    	if(pActiveDesktop->SetWallpaper((LPCWSTR)FileName, 0) != S_OK)
    		return false;
    	pActiveDesktop->ApplyChanges(AD_APPLY_ALL);
    	pActiveDesktop->Release();
    	CoUninitialize();
    	return true;
    }
    

    das hab ich mal in nem Programm benutzt um das Hintergrund alle paar Minuten wechseln zu lassen

    Edit: #include <shlobj.h>

    greetz KN4CK3R



  • 1. Mein Fehler war, dass mein cast von int in WALLPAPEROPT nicht zulässig war.

    2. Mit dem leicht geänderten code hats dann super geklappt (auch dank an KN4CK3R, in deinem Code kann ich das viel besser nachvollziehen)

    MEINS:

    String dateipfad = LeagueMODkonf->LOLPLACE->Text + "Designs\\Wallpaper.bmp";
    
    		WCHAR FileName[MAX_PATH];
    		MultiByteToWideChar(CP_ACP, 0, dateipfad.c_str(), dateipfad.Length() + 1, FileName, sizeof(FileName));
    
    		CoInitialize(NULL);
    		IActiveDesktop *pActiveDesktop;
    
    		HRESULT hr = CoCreateInstance(Shlobj::CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER, IID_IActiveDesktop,(void**)&pActiveDesktop);
    		if(hr != S_OK)
    			ShowMessage("Fehler bei übernahme");
    		else
    		{
    			_tagWALLPAPEROPT* Option = new _tagWALLPAPEROPT;
    			Option->dwStyle = WPSTYLE_STRETCH;
    			if(pActiveDesktop->SetWallpaper((LPCWSTR)FileName, 0) != S_OK)
    				ShowMessage("Fehler bei übernahme (2)");
    			if (pActiveDesktop->SetWallpaperOptions(Option,NULL))
    			{
    				ShowMessage("Fehler beim maximieren");
    			}
    			else
    			{
    				pActiveDesktop->ApplyChanges(AD_APPLY_ALL);
    				pActiveDesktop->Release();
    				CoUninitialize();
    			}
    			delete Option;
    		}
    

Anmelden zum Antworten