COM Exe server asynchron aufrufen ??



  • Hi,

    gibt es eine Möglichkeit einen COM Exe Server asynchron aufzurufen ??
    Bei mir blockiert der Client, bis der server fertig ist.

    Und wenn ja, was passiert dann mit den Rückgabewerten ??

    Gruß



  • NasenBaer_2013 schrieb:

    gibt es eine Möglichkeit einen COM Exe Server asynchron aufzurufen ??

    Du hast diesbezüglich bei COM/COM+/DCOM die selben Möglichkeiten die du auch hast wenn du mit einem "normalen" Objekt arbeitest.

    D.h.:

    1. Mach BeginFoo/EndFoo Funktionen, die du verwenden kannst um Dinge asynchron zu erledigen. Dazu musst du natürlich Kontrolle über das Interface des Objekts haben. In diesem Fall über das vom COM Server implementierte Interface.

    2. Ruf die Funktion in nem eigenen Thread auf. Bei COM musst du dabei auf die Apartments achten. D.h. du musst sicherstellen dass der Interface Zeiger in dem Thread verwendet werden darf in dem du Funktionen aufrufen willst.
      Das Thema ist aber dummerweise etwas zu komplex um es in ein paar Sätzen zu erklären.
      Und natürlich muss das COM Objekt Thread-safe sein, falls du es währenddessen noch mit weiteren Aufrufen quälen willst.

    Bei mir blockiert der Client, bis der server fertig ist.

    Ja. Und wieso wundert dich das? Ist doch bei anderen Aufrufen auch so!?!

    Und wenn ja, was passiert dann mit den Rückgabewerten ??

    Ich hoffe die Frage kannst du dir jetzt selbst beantworten.

    ----

    Falls es eine weitere, COM-spezifische, Möglichkeit geben sollte, bitte ich um Ergänzung. Ich kenne zumindest keine 🙂



  • Hi hustbaer ,

    also bei meinem Exe server ist irgendwo ein fehler.
    Und zwar ruft der client

    CoGetClassObject(CLSID_Hello,CLSCTX_SERVER,NULL,IID_IClassFactory,(void **)&pCF);
    

    Das geht erstmal gut und ich bekomme einen pointer auf die factory zurück.
    Ich teste den Rückgabewert auf S_OK und pCF gegen 0x00000000.

    Dann mache ich ein

    pCF->CreateInstance(NULL,IID_Hello,(void **)&pHello);
    

    Leider ist pHello immer Null, und der Rückgabewert ist
    2147746133 = 0x80040155 = REGDB_E_IIDNOTREG womit ich nix anfangen kann.

    Wenn ich im Server std::cout ausgaben mache, werden die funktionen
    CoHelloFactory::QueryInterface
    CoHelloFactory::CreateInstance
    CoHello::QueryInterface
    aufgerufen...

    In meiner Registry habe ich einträge unter
    HKEY_CLASSES_ROOT\Hello.exe\CLSID=<CLSID>
    HKEY_CLASSES_ROOT\CLSID\<CLSID> = main_server.exe
    HKEY_CLASSES_ROOT\CLSID\<CLSID>\LocalServer32 = <Pfad zu main_server.exe>
    HKEY_CLASSES_ROOT\Wow6432Node\CLSID = <CLSID>
    HKEY_CLASSES_ROOT\Wow6432Node\CLSID\<CLSID> = main_server.exe
    HKEY_CLASSES_ROOT\Wow6432Node\CLSID\<CLSID>\LovalServer32 = <Pfad zu main_server.exe>

    Muss ich die IID auch noch registrieren ??



  • Hmm okay ich glaube mir fehlt das Marshallen....

    Wie kann man denn mit MinGw ein Oleaut32.dll marshalling auf einem Windows 7 64 Bit aufsetzen ??


Anmelden zum Antworten