E_INVALIDARG - Woran liegts? - (gelöst: RAPI2 - Include vergessen?)



  • Hallo an alle,
    ich kenne mich mit der ganzen WinApi noch nich so aus, muss allerdings jetzt ein Programm schreiben, welches auf ein WinCE-Gerät zugreift(eigentlich sogar auf mehrere).

    Dabei bin ich leider noch nicht sehr weit gekommen.
    Ich habe mir dieses Bsp. hier vorgenommen und wollte das erstmal zum laufen bekommen:
    http://msdn.microsoft.com/en-us/library/aa917197.aspx

    leider hat mich der Compiler mit Fehlern überschüttet (nur ein Ausschnitt):

    Fehler	2	error C2065: 'IRAPIDesktop': nichtdeklarierter Bezeichner	c:\users\rbs\documents\visual studio 2008\projects\rapi4\rapi4\rapi4.cpp	17	rapi4
    Fehler	3	error C2065: 'pIRapiDesktop': nichtdeklarierter Bezeichner	c:\users\rbs\documents\visual studio 2008\projects\rapi4\rapi4\rapi4.cpp	17	rapi4
    Fehler	4	error C2065: 'CLSID_RAPI': nichtdeklarierter Bezeichner	c:\users\rbs\documents\visual studio 2008\projects\rapi4\rapi4\rapi4.cpp	18	rapi4
    Fehler	5	error C2065: 'IID_IRAPIDesktop': nichtdeklarierter Bezeichner	c:\users\rbs\documents\visual studio 2008\projects\rapi4\rapi4\rapi4.cpp	21	rapi4
    Fehler	6	error C2065: 'pIRapiDesktop': nichtdeklarierter Bezeichner	c:\users\rbs\documents\visual studio 2008\projects\rapi4\rapi4\rapi4.cpp	22	rapi4
    Fehler	7	error C2065: 'IRAPIEnumDevices': nichtdeklarierter Bezeichner	c:\users\rbs\documents\visual studio 2008\projects\rapi4\rapi4\rapi4.cpp	25	rapi4
    Fehler	8	error C2065: 'pIRapiEnumDevices': nichtdeklarierter Bezeichner	c:\users\rbs\documents\visual studio 2008\projects\rapi4\rapi4\rapi4.cpp	25	rapi4
    

    Ich tippe zur Zeit auf einen vergessenen include, oder eine lib. Leider habe ich jetzt trotz stundenlangem versuchen und probieren immer noch keine Lösung gefunden:( Ich hoffe jemand kann mir helfen.

    Des Weiteren habe ich noch ein ganz anderes Problem:
    Ich habe nun gelesen, das man seine includes in die stdafx.h schreiben soll.
    Wenn ich aber den include für die rapi2.h dort rein schreibe bekomme ich viele Fehler über Neudeklarationen. Zur Zeit steht der include also in meiner main-cpp über der stdafx.h. So hat es wenigstens geklappt. Da das ja aber sicher nicht so gedacht ist würde ich gern wissen wieso das in der stdafx nicht klappt.



  • Ich habe mein Problem inzwischen selbst lösen können. Auch wenn mir die Lösung etwas seltsam vorkommt:)

    Ich musste lediglich die ole32.lib aus der Liste der benötigten Libs entfernen und alles lief.

    Leider hat sich inzwischen ein neues Problem ergeben:

    IRAPIDesktop *pIRapiDesktop;
    IRAPISink* sink;
    DWORD* sinkID;
    
    void init()
    {
    	sink = NULL;
    	sinkID = NULL;
    	pIRapiDesktop = NULL;
    
    	HRESULT hr = S_OK;
    
    	// Initialize COM.
    	hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
    
    	// Create an instance of the IRAPIDesktop interface.
            hr = CoCreateInstance(CLSID_RAPI,
    			  NULL,
    			  CLSCTX_INPROC_SERVER,
    			  IID_IRAPIDesktop,
    			  (void**)&pIRapiDesktop);
    
    	hr = pIRapiDesktop->Advise(sink, sinkID);
    }
    

    nach

    hr = pIRapiDesktop->Advise(sink, sinkID);
    

    ist hr dann E_INVALIDARG. Ich weiß leider nicht was ich falsch gemacht habe. Die 2 Argumente von Advise sollten stimmen (ist ja theoretisch nicht schwierig).

    Hier noch die Doku vom msdn:
    http://msdn.microsoft.com/en-us/library/aa922441.aspx

    Hat jemand eine Idee was ich ändern muss? Bin für jegliche Hilfe dankbar.


  • Mod

    1. Das entfernen einer LIB aus der Linker Liste löst kein Compiler Problem. Du hast irgendeinen Header vergessen gehabt!

    2. Dein sink Zeiger muss eine gültiger Interface Zeiger sein, den Du bereit stellst. Das ist ein Event-Sink! Advise speicherhier ichts rein sondern benutzt diesen Zeiger. Ich kann nicht sehen, dass Du hier einen gültigen Sink für den Advise zur Verfügung stellst.

    Tipp: Lies mal mehr Grundlagen zu COM!



  • ich hatte da noch einen fehler...
    hab ich jetzt auch von jemandem gesagt bekommen:)

    ich hab jetzt folgenden Code:

    der Sink:

    class IRapiCon : public IRAPISink
    {
    private:
    
    public:
    
        IRapiCon()
        {
        }
    
        virtual HRESULT STDMETHODCALLTYPE OnDeviceConnected(IRAPIDevice* pIDevice)
        {
            std::cout << "Co" << std::endl;
            return 0;
        }
    
        virtual HRESULT STDMETHODCALLTYPE OnDeviceDisconnected(IRAPIDevice* pIDevice)
        {
            std::cout << "DisCo" << std::endl;
            return 0;
        }
    
        virtual HRESULT STDMETHODCALLTYPE QueryInterface(const IID &,void **)
        {
            return 0;
        }
        virtual ULONG STDMETHODCALLTYPE AddRef( void)
        {
            return 0;
        }
        virtual ULONG STDMETHODCALLTYPE Release( void)
        {
            return 0;
        }
    
        virtual ~IRapiCon()
        {
        }
    };
    

    macht erstmal nix weiter...aber das sollte ja nicht schlimm sein, oder?

    und mein main:

    IRAPIDesktop *pIRapiDesktop;
    	DWORD* sinkID = NULL;
    
    	IRapiCon* rapi = new IRapiCon();
    
    	pIRapiDesktop = NULL;
    	HRESULT hr = S_OK;
    	HRESULT hr2 = S_OK;
    
    	// Initialize COM.
    	hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
    
    	// Create an instance of the IRAPIDesktop interface.
    	hr = CoCreateInstance(CLSID_RAPI,
    						  NULL,
    						  CLSCTX_INPROC_SERVER,
    						  IID_IRAPIDesktop,
    						  (void**)&pIRapiDesktop);
    
    	hr = pIRapiDesktop->Advise(rapi, sinkID);
    
            //der Rest ist unwichtig...
    

    ich bekomme weiterhin den Fehler in hr zurückgeliefert...

    Tipp: Lies mal mehr Grundlagen zu COM!

    Danke für den Hinweis. Mal schauen ob die Bibliothek hier was über COM hat.


  • Mod

    fc90 schrieb:

    macht erstmal nix weiter...aber das sollte ja nicht schlimm sein, oder?
    ...ich bekomme weiterhin den Fehler in hr zurückgeliefert...

    1. QueryInterface macht nichts. Folgerichtiog kommt kein Zeiger zuürck und kann nicht weiter benutzt werden.
    2. Ohne Grundlagen ist das nur stochern im Nebel.
    3. Mit ATL und MFC sind solche Sinks in 2 Sekunden gebaut... 😉



  • erstmal Danke für deine schnelle Hilfe.

    Martin Richter schrieb:

    1. QueryInterface macht nichts. Folgerichtiog kommt kein Zeiger zuürck und kann nicht weiter benutzt werden.

    Ok...wusste nicht das da was zurückgegeben werden muss:)

    Martin Richter schrieb:

    2. Ohne Grundlagen ist das nur stochern im Nebel.

    Merk ich schon...aber ich stehe leider unter Zeitdruck.

    Martin Richter schrieb:

    3. Mit ATL und MFC sind solche Sinks in 2 Sekunden gebaut... 😉

    Na mal sehen:) Ich kenn mich halt mit der Materie noch nicht wirklich aus.
    War bis jetzt eher mit Java am Werk und wurde nun tief ins kalte Wasser geschubst:)

    Hast du vielleicht einen Tipp welches Buch ich dafür zu Rat nehmen sollte? Ich komme durch die Uni an vieles ran.

    Ein Tutorial für COM hab ich schon gefunden. Das werd ich jetzt mal durcharbeiten.


  • Mod

    Bücher
    ATL-Internals von Sells Brothers
    Essential COM, Don Box

    Ansonsten einfach die MSDN mit Ihren Samples angehen. Da werden Sinks beschrieben und in der MSDN gibt es Tonnen an Samples.
    http://support.microsoft.com/kb/194179

    BTW bzgl. mal kurz so reingeschmissen: COM macht man nicht mal eben so... 🕶



  • danke für die Tipps...

    Martin Richter schrieb:

    BTW bzgl. mal kurz so reingeschmissen: COM macht man nicht mal eben so... 🕶

    merk ich schon:) Ich würde mir auch gern die Zeit nehmen um mich tiefer einzuarbeiten, aber es fehlt leider die Zeit. Deshalb werde ich auf eine Art Crashkurs ausweichen müssen:(

    Eigentlich ist das Ziel des ganzen nur das Verwalten von mehreren Windows-Mobile-Geräten an einen PC...

    ActiveSync kriegts nämlich nicht auf die Reihe:)



  • Ich hab inzwischen raus wieso es nicht ging...war noch nichts kompliziertes:)

    Man darf nur nicht den Zeiger den man übergibt gleich null setzen:

    DWORD* sinkID = NULL;
    

    Ich habe die ganze Zeit in meiner Klasse den Fehler gesucht:(


Anmelden zum Antworten