2147417850 RPC_E_CHANGED_MODE ??



  • Hallo,

    ich verwende in einer CLR Test-Konsolenanwendung folgende Funktionen...:

    #ifdef WIN32
    	WSADATA dat;
    	WSAStartup(MAKEWORD(2,2),&dat);
    
    	HRESULT hr = CoInitialize(NULL);
    
    	if (FAILED(hr))	{
    		WSACleanup();
    		std::cout << "Fehler:" << hr  << std::endl;
    		return -1;
    	}
    #endif
    

    ...und entsprechend am Ende...:

    #ifdef WIN32
    	CoUninitialize();	
    	WSACleanup();
    #endif // WIN32
    

    ...zusammen mit den Librarys:

    Ws2_32.lib, Winmm.lib, Advapi32.lib, Ole32.lib;
    ...sowie mit den open source Librarys...:
    emiplib.lib, jrtplib.lib, jthread.lib, speex.lib;

    ...um ein VoiceOverIP Testprogramm, das Bestandteil von emiplib.lib ist, auszuprobieren.

    Jedoch scheint die Funktion CoInitialize(NULL) nicht zu funktionieren, denn sie hat den Rückgabewert: -2147417850 (RPC_E_CHANGED_MODE)

    nach "C/C++ Forum :: VCL (C++ Builder) :: CoInitializeEx() schlägt fehl" habe ich das Projekt neu initialisiert - ohne Änderung.

    Im Netz gibt es viele Seiten, die sich mit dem Thema beschäftigen. Von diesen erschien mir folgende IBM Seite die am meisten weiterführenden Inhalte aufzuweisen:

    http://www-01.ibm.com/support/docview.wss?rs=171&context=SW910&q1=U200242+OR+U803326+OR+U803577+OR+U803579+OR+U803580+OR+U803582+OR+SI21715+OR+SI21717&uid=swg1IC46987&loc=en_US&cs=utf-8&cc=us&lang=all,

    Bringt es etwas die Patches zu installieren oder sollte ich besser keine CLR Konsolenanwendung als Testplattform verwenden ?

    MfG



  • CLR -> .NET: Macht im Bezug auf C++/CLI meistens keinen Sinn:
    ➡ Kein CLR Console Project.


  • Mod

    Wie schon gesagt: CLR+C++/CLI machen IMHO keienn Sinn für reale Projekt. Schon gar nicht wenn Du dann auch noch anfängst Windows API und WinSock reinzumischen wo die CLR ihre eigenen Techniken hat.
    Absoluter Unfig... Just my 2 cents.

    Ansonsten ist Dir schienbar nciht klar was CoInitialize macht und dazu rateich Dir einfach mal (wieimmer) die MSDN zu lesen, denn dort ist auch dieser Fehler klar erwähnt:
    CoInitialize Function
    http://msdn.microsoft.com/en-us/library/ms678543(VS.85).aspx

    After the concurrency model for a thread is set, it cannot be changed. A call to CoInitialize on an apartment that was previously initialized as multithreaded will fail and return RPC_E_CHANGED_MODE.

    In anderen Worten:
    Du machst etwas (COM initialisieren) was jemand anderes schon gemachthat mit anderen Parametern und das ist eben nicht erlaubt.

    siehe auch:
    CoInitializeEx
    http://msdn.microsoft.com/en-us/library/ms695279(VS.85).aspx

    PS: Kommt mir vor als ob Du CPP programmierst (Copy+Paste+Programming) 🤡



  • Hallo,

    danke für die Hinweise. Demnach muss man einfach nur den CLR - Sockel un- initialisieren und siehe da - nun läuft das Program (erstaunlicherweise). Ich gebe aber zu, dass es sich hierbei keineswegs um eine ernsthafte Programmierung handelt – allenfalls ein bisschen Spielerei ;-).

    //CLR  Konsolenanwendung 
    int main(array<System::String ^> ^args)
    {
    //CLR Sockel abschalten
    CoUninitialize();	
    WSACleanup();
    
    //Neuen Sockel initialisieren 
    #ifdef WIN32
    	WSADATA dat;
    	WSAStartup(MAKEWORD(2,2),&dat);
    
    	HRESULT hr = CoInitialize(NULL);
    	if (FAILED(hr))
    	{
    		WSACleanup();
    		std::cout << "Fehler:" << hr << std::endl;
    
    		return -1;
    	}
    
    	#endif
    
    .
    .
    // Hier ist dann der emiplib Beispielcode.
    .
    
    #ifdef WIN32
    	CoUninitialize();	
    	WSACleanup();
    #endif 
    
    	return 0;
    }
    

    ….ansonsten habt Ihr natürlich recht.

    MfG


  • Mod

    Das ist nicht mal Spielerei, dass ist einfach an den Gegenbenheiten vorbei und berücksichtigt in keiner Weise das System, dass dahinter liegt.

    Vergiß einfach das CLR Prpjekt.



  • Das ist Fatal was Du machst... und wird massive Nebeneffekte haben, wenn Du mal ein größeres Projekt hast...


Anmelden zum Antworten