COM组件已经部署好了,接下来就是调用了既然我们是部署了COM+服务器,我们这里就讲下怎么远程调用COM组件。
在创建好VC的WIN32项目后,在预编译文件中引用。
- #ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later.
- #define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows.
- #endif
-
- #include
- #include
- #include
- #include
- #include
-
- #import "SayHello.tlb" no_namespace named_guids
#define _WIN32_WINNT 0x0501 //是为了DCOM调用很多函数都有下面的限定,不然不能编译通过了如:
#if (_WIN32_WINNT >= 0x0400 ) || defined(_WIN32_DCOM) // DCOM
#import "SayHello.tlb" no_namespace named_guids //是将COM组件的定义引用进来
ISayHello接口变为C++的如下定义:
- struct __declspec(uuid("c6d664f5-6cf6-4c12-9948-8a40b16818be"))
- ISayHello : IDispatch
- {
-
-
-
- _bstr_t SayHello (
- _bstr_t name );
-
-
-
-
-
- virtual HRESULT __stdcall raw_SayHello (
- BSTR name,
- BSTR * pRetVal ) = 0;
- };
调用代码如下:
-
- CoInitializeEx(NULL, COINIT_MULTITHREADED);
- HRESULT hr;
-
-
- hr = CoInitializeSecurity(NULL, -1, NULL, NULL,RPC_C_AUTHN_LEVEL_NONE,
- RPC_C_IMP_LEVEL_ANONYMOUS, NULL, EOAC_NONE, NULL);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- COSERVERINFO ServerInfo={0, L"192.168.0.200", NULL, 0};
- MULTI_QI MultiQi={ IID_ISayHello, NULL, NOERROR };
- ISayHello *pSayHello;
-
- hr = CoCreateInstanceEx(CLSID_CSayHello, NULL, CLSCTX_REMOTE_SERVER, &ServerInfo, 1, &MultiQi);
- if(FAILED(hr)) return;
-
- *pSayHello = (ISayHello*)MultiQi.pItf;
-
- hr = CoSetProxyBlanket(*ppUnknown, RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE, NULL,
- RPC_C_AUTHN_LEVEL_NONE,RPC_C_IMP_LEVEL_ANONYMOUS, NULL, EOAC_NONE);
-
- BSTR userName = SysAllocString(L"test");
- BSTR retVal;
-
- hr = pSayHello->raw_SayHello(userName, &retVal);
-
- pSayHello->Release();
-
- CoUninitialize();
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28462199/viewspace-1252909/
,如需转载,请注明出处,否则将追究法律责任。