我目前正在研究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;
}
};