COM与.NET调用DCOM组件
生活随笔
收集整理的這篇文章主要介紹了
COM与.NET调用DCOM组件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
COM組件已經部署好了,接下來就是調用了既然我們是部署了COM+服務器,我們這里就講下怎么遠程調用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運行環境,也可以使用CoInitialize但使用COM的每根線程都需要調用 ????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); ???? //??//設置驗證標識信息,我們上期寫的是以匿名方式部署不需要這部分 //??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; //??//有時候驗證通過UNICODE的方式不要設置錯了 //??pAuthidentity->Flags?=?SEC_WINNT_AUTH_IDENTITY_ANSI; //?? //??//驗證信息 //??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;
????//遠程服務器信息 ????COSERVERINFO?ServerInfo={0,?L"192.168.0.200",?NULL/*pAuthInfo*/,?0}; ????MULTI_QI?MultiQi={?IID_ISayHello,?NULL,?NOERROR?}; ????ISayHello?*pSayHello; ????//創建DCOM對象返回接口指針 ????hr?=?CoCreateInstanceEx(CLSID_CSayHello,?NULL,?CLSCTX_REMOTE_SERVER,?&ServerInfo,?1,?&MultiQi); ????if(FAILED(hr))?return; ???? ????*pSayHello?=?(ISayHello*)MultiQi.pItf; ????//為DCOM對象指針設置反問安全令牌 ????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; ????//調用DCOM接口 ????hr?=?pSayHello->raw_SayHello(userName,?&retVal); ????//釋放DCOM接口 ????pSayHello->Release(); ????//釋放COM運行環境 ????CoUninitialize();
在創建好VC的WIN32項目后,在預編譯文件中引用。
#define?_WIN32_WINNT?0x0501?//是為了DCOM調用很多函數都有下面的限定,不然不能編譯通過了如:
#if (_WIN32_WINNT >= 0x0400 ) || defined(_WIN32_DCOM) // DCOM
#import?"SayHello.tlb"?no_namespace?named_guids? //是將COM組件的定義引用進來
ISayHello接口變為C++的如下定義:
調用代碼如下:
總結
以上是生活随笔為你收集整理的COM与.NET调用DCOM组件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++中利用WebService下载文件
- 下一篇: C/S框架-发布和部署WebServic