0

COMの基礎を学んでいます。現在、私はアウトプロセスサーバーを書いています。かなり基本的なサーバー アプリ、dll/スタブ、およびクライアント アプリを作成しました。

サーバーを登録し、CoCreateInstance インプロセスを使用してオブジェクトのインスタンスを作成すると、次のように動作します。

サーバー/クライアント:

int _tmain(int argc, _TCHAR* argv[])
{
    IClassFactory *factory = new ISimpleServerFactory();
    DWORD classToken;

    ::CoInitialize(NULL);
    CoRegisterClassObject(
        IID_ISimpleServer, 
        factory, 
        CLSCTX_LOCAL_SERVER, 
        REGCLS_MULTIPLEUSE, 
        &classToken);

    ISimpleServer *pISimpleServer = NULL;

    HRESULT hr = CoCreateInstance(
        CLSID_CSimpleServer, 
        NULL, 
        CLSCTX_LOCAL_SERVER, 
        IID_ISimpleServer,
        (void **)&pISimpleServer);           //<===========SUCCESS

    if(SUCCEEDED(hr))
        printf("Instantiation successful\n");

    if(pISimpleServer != NULL)
        pISimpleServer->Release();

    std::cin.ignore();
    CoRevokeClassObject(classToken);
    ::CoUninitialize();
    return 0;
}

今、私はそれを別々のアプリに分割しようとしています:

サーバ:

int _tmain(int argc, _TCHAR* argv[])
{
    IClassFactory *factory = new ISimpleServerFactory();
    DWORD classToken;

    ::CoInitialize(NULL);
    CoRegisterClassObject(
        IID_ISimpleServer, 
        factory, 
        CLSCTX_LOCAL_SERVER, 
        REGCLS_MULTIPLEUSE, 
        &classToken);

    if(SUCCEEDED(hr))
        printf("Instantiation successful\n");

    if(pISimpleServer != NULL)
        pISimpleServer->Release();

    std::cin.ignore();
    CoRevokeClassObject(classToken);
    ::CoUninitialize();
    return 0;
}

クライアント:

int _tmain(int argc, _TCHAR* argv[])
{
    CoInitialize(NULL);

    SimpleServer::ISimpleServer *pISimpleServer = NULL;

    HRESULT hr = CoCreateInstance(
        CLSID_CSimpleServer, 
        NULL, 
        CLSCTX_LOCAL_SERVER, 
        IID_ISimpleServer,
        (void **)&pISimpleServer);       // HERE IT HANGS

    if (SUCCEEDED(hr))
    {
        //*****SMTH***
    }
    else
    {
        printf("Failed to load COM object (server not loaded?)\n");
    }

    if(pISimpleServer != NULL)
        pISimpleServer->Release();

    CoUninitialize();

    std::cin.ignore();

    return 0;
}

そして、クライアントは実行時にハングします。サーバーが起動していない場合、クライアントは「Failed to load COM object (server not loaded?)」とタイプするので、サーバー登録の問題ではないと思います。

しかし、それは何でしょうか?

4

1 に答える 1

0

レイモンドが指摘したように、私のサーバーはメッセージをポンピングしていません。追加した

MSG msg;
while (GetMessage(&msg, 0, 0, 0) > 0) 
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    if(_kbhit())
        break;
}

サーバー本体に入れると良くなりました:)

于 2013-07-13T02:12:32.167 に答える