COM与.NET调用DCOM组件
生活随笔
收集整理的這篇文章主要介紹了
COM与.NET调用DCOM组件
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
COM組件已經(jīng)部署好了,接下來就是調(diào)用了既然我們是部署了COM+服務(wù)器,我們這里就講下怎么遠(yuǎn)程調(diào)用COM組件。
#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?<stdio.h> #include?<tchar.h> #include?<icrsint.h> #include?<iostream> #include?<windows.h>
#import?"SayHello.tlb"?no_namespace?named_guids
struct?__declspec(uuid("c6d664f5-6cf6-4c12-9948-8a40b16818be")) ISayHello?:?IDispatch { ????// ????//?Wrapper?methods?for?error-handling ????// ????_bstr_t?SayHello?( ????????_bstr_t?name?);
????// ????//?Raw?methods?provided?by?interface ????//
????virtual?HRESULT?__stdcall?raw_SayHello?( ????????/*[in]*/?BSTR?name, ????????/*[out,retval]*/?BSTR?*?pRetVal?)?=?0; };
????//初始化COM運(yùn)行環(huán)境,也可以使用CoInitialize但使用COM的每根線程都需要調(diào)用 ????CoInitializeEx(NULL,?COINIT_MULTITHREADED); ????HRESULT?hr; ????//為進(jìn)程(一個(gè)進(jìn)程只需調(diào)用一次)注冊(cè)安全和設(shè)置默認(rèn)安全設(shè)置, ????//我們上期寫的是以匿名方式部署可以不需要這部分 ????hr?=?CoInitializeSecurity(NULL,?-1,?NULL,?NULL,RPC_C_AUTHN_LEVEL_NONE,? ????????RPC_C_IMP_LEVEL_ANONYMOUS,?NULL,?EOAC_NONE,?NULL); ???? //??//設(shè)置驗(yàn)證標(biāo)識(shí)信息,我們上期寫的是以匿名方式部署不需要這部分 //??COAUTHIDENTITY?*pAuthidentity; //??COAUTHINFO?*pAuthInfo; //??pAuthidentity?=?(COAUTHIDENTITY*)malloc(sizeof(COAUTHIDENTITY)); //??pAuthidentity->User?=?(USHORT*)pUser; //??pAuthidentity->UserLength?=?strlen(pUser); //??pAuthidentity->Password?=?(USHORT*)pPassword; //??pAuthidentity->PasswordLength?=?strlen(pPassword); //??pAuthidentity->Domain?=?NULL; //??pAuthidentity->DomainLength?=?0; //??//有時(shí)候驗(yàn)證通過UNICODE的方式不要設(shè)置錯(cuò)了 //??pAuthidentity->Flags?=?SEC_WINNT_AUTH_IDENTITY_ANSI; //?? //??//驗(yàn)證信息 //??pAuthInfo?=?(COAUTHINFO*)malloc(sizeof(COAUTHINFO)); //??pAuthInfo->dwAuthnSvc=?RPC_C_AUTHN_WINNT; //??pAuthInfo->dwAuthzSvc=?RPC_C_AUTHZ_NONE; //??pAuthInfo->pwszServerPrincName=?NULL; //??pAuthInfo->dwAuthnLevel=?RPC_C_AUTHN_LEVEL_NONE; //??pAuthInfo->dwImpersonationLevel=?RPC_C_IMP_LEVEL_IMPERSONATE; //??pAuthInfo->dwCapabilities=?RPC_C_QOS_CAPABILITIES_DEFAULT; //??pAuthInfo->pAuthIdentityData=?pAuthidentity;
????//遠(yuǎn)程服務(wù)器信息 ????COSERVERINFO?ServerInfo={0,?L"192.168.0.200",?NULL/*pAuthInfo*/,?0}; ????MULTI_QI?MultiQi={?IID_ISayHello,?NULL,?NOERROR?}; ????ISayHello?*pSayHello; ????//創(chuàng)建DCOM對(duì)象返回接口指針 ????hr?=?CoCreateInstanceEx(CLSID_CSayHello,?NULL,?CLSCTX_REMOTE_SERVER,?&ServerInfo,?1,?&MultiQi); ????if(FAILED(hr))?return; ???? ????*pSayHello?=?(ISayHello*)MultiQi.pItf; ????//為DCOM對(duì)象指針設(shè)置反問安全令牌 ????hr?=?CoSetProxyBlanket(*ppUnknown,?RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,?NULL, ????????RPC_C_AUTHN_LEVEL_NONE,RPC_C_IMP_LEVEL_ANONYMOUS,?NULL/*pAuthidentity*/,?EOAC_NONE);
????BSTR?userName?=?SysAllocString(L"test"); ????BSTR?retVal; ????//調(diào)用DCOM接口 ????hr?=?pSayHello->raw_SayHello(userName,?&retVal); ????//釋放DCOM接口 ????pSayHello->Release(); ????//釋放COM運(yùn)行環(huán)境 ????CoUninitialize();
在創(chuàng)建好VC的WIN32項(xiàng)目后,在預(yù)編譯文件中引用。
#define?_WIN32_WINNT?0x0501?//是為了DCOM調(diào)用很多函數(shù)都有下面的限定,不然不能編譯通過了如:
#if (_WIN32_WINNT >= 0x0400 ) || defined(_WIN32_DCOM) // DCOM
#import?"SayHello.tlb"?no_namespace?named_guids? //是將COM組件的定義引用進(jìn)來
ISayHello接口變?yōu)镃++的如下定義:
調(diào)用代碼如下:
總結(jié)
以上是生活随笔為你收集整理的COM与.NET调用DCOM组件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++中利用WebService下载文件
- 下一篇: C/S框架-发布和部署WebServic