在C#中添加对DCOM服务器的引用,不带类型库或IDispatch

时间:2015-07-10 12:37:26

标签: c# dcom

我目前正在研究DCOM客户端/服务器应用程序对。 DCOM服务器是C ++,而客户端是用C#实现的。我想要做的是添加对DCOM服务器的引用,该引用遇到以下错误:

  

无法添加对“server.exe”的引用,请确保该文件   是可访问的,它是一个有效的程序集或COM组件。

从C ++测试客户端访问服务器不是问题。

我不需要从VBA访问DCOM服务器,因此DCOM服务器公开的对象直接来自IUnknown而不是IDispatch,服务器也没有类型库。另外,据我所知,类型库不能正确编组数组,这是一个关键要求。而是使用代理dll访问服务器。或者,我尝试使用我的C#项目来引用所述dll,它返回相同的错误。

是否可以在不使用IDispatch或TLB的情况下解决引用问题?是不是因为根本不使用类型库而引起的问题?

@HansPassant

要求的测试客户端
            CoInitialize(NULL);
            HRESULT hr = CoInitializeSecurity(NULL, -1 , NULL, NULL ,RPC_C_AUTHN_LEVEL_CONNECT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL ,EOAC_NONE ,NULL);
            CLSID clsid;
            hr = CLSIDFromProgID(L"hcps.uitvoering.drawingplanning", &clsid);
            COSERVERINFO si;
            ZeroMemory(&si, sizeof(COSERVERINFO));
            si.pwszName = L"localhost";
            IClassFactory* pFactory;
            hr = CoGetClassObject(clsid, CLSCTX_LOCAL_SERVER, &si, IID_IClassFactory , (LPVOID*)&pFactory);
            if (hr != S_OK)
            {
                return 0;
            }

            IDrawingPlanningServer * pServer = NULL;
            hr = pFactory->CreateInstance(NULL,  IID_PPV_ARGS(&pServer));
            if (hr == S_OK)
            {
                CClient client;             
                hr = pServer->LogOn(&client);
                IEntry* pEntry;
                hr = pServer->CreateEntry(&pEntry);
                hr = pEntry->Save();
                pEntry->Release();
                hr = pServer->LogOff();
                pServer->Release();
            }
            pFactory->Release();
            CoUninitialize();
            system("pause");

和IClient,用作回调接口:

class CClient : public IClient
{
public:

STDMETHODIMP QueryInterface(REFIID riid, LPVOID* ppvObject)
{
    HRESULT hr;
    if (NULL == ppvObject)
    {
        hr = E_POINTER;
    }
    else
    {
        hr = E_NOINTERFACE;
        *ppvObject = NULL;  
        if ((riid == IID_IUnknown) || (riid == IID_IClient))
        {
            *ppvObject = static_cast<CClient*>(this);
            hr = S_OK;
        }
    }
    return hr;
}
    STDMETHODIMP_(ULONG) AddRef()
    {
        return 1;
    }
    STDMETHODIMP_(ULONG) Release()
    {
        return 1;
    }
    STDMETHODIMP New(IEntry* entry)
    {
        return E_NOTIMPL;
    }
    STDMETHODIMP Update(IEntry* entry)
    {
        return E_NOTIMPL;
    }
    STDMETHODIMP Delete(IEntry* entry)
    {
        return E_NOTIMPL;
    }
};

0 个答案:

没有答案