COM/DCOM调用没这么复杂吧. new Atl Progject. test new interface love F7 copy test.h test_i.c to your client; Add in stdafx.h #include "test.h" add in your call.cpp #include "love_i.cClassNamae::OnTest() { ILove *pLove; hr = ::CoCreateInstanceEx(..) pLove = (ILove *)mqi.pItf; pLove->YourMethod(...) }
copy test.h love_i.c to your client; Add Love Method. Login([in] BSTR* lpszUser,[in] BSTR* lpszPass)client: WCHAR* user[1]; WCHAR* pass[1]; user[0]= SysAllocString("user"); pass[0]= SysALlocString("pass"); pLove->Login(user,pass) SysFreeString(user[0]); SysFreeString(pass[0]);
您好!我在论坛上已经见到你多次了,谢谢你的热心。
不过您似乎对Dcom了解的不多,有两种方式调用Dcom 组件:一是不需改程序代码只需配置注册表(通过dcomcnfg.exe或OLE View工具),另一种是使用CoCreatInstanceEx(),因为有关远程机器的信息在这个函数的参数中。而后者不需要客户端配置信息,所以更加灵活。
另外,#import导入方式是实现远程自动化的方法,用远程自动化要在服务器端和客户端配置许多信息,远程自动化和Dcom 是两种不同的方式。
我已经用ip地址试过了,情况一样。而且如果机器名不能解析,返回的错误码应为:0x800706BA(RPC 服务器无法使用)。
您说的#import是编写自动化控制器常用的方式,而对于自动化控制器使用远程的自动化服务器,微软提供了远程自动化技术,而在Dcom中是无法用这种方式的。(我何尝不想避开Invoke函数,可是同志,不行啊!)
VARIANT param;
VariantInit(¶m);
param.vt = VT_I2; // short类型
param.iVal = 5;
最后别忘了VariantClear(¶m);对于第二个问题,我做了个小例子,不过现在在远程创建的时候得到0x80070005,访问被拒绝!
VARIANT var;
var.vt = VT_BOOL;
var.boolVal = TRUE;
VARIANTARG param[4];
short i;
for (i = 0 ; i <= 3 ; i++)
VariantInit(¶m[i]);
param[0].vt = VT_I4; // long类型
param[1].vt = VT_I4; // long类型
param[2].vt = VT_BSTR; // BSTR类型
param[3].vt = VT_BSTR; // BSTR类型
param[0].lVal = 11;
param[1].lVal = 1;
BSTR bstrVal = SysAllocString(L"hhhhh");
param[2].bstrVal = bstrVal;
param[3].bstrVal = bstrVal;
EXCEPINFO exc;
exc.wCode = 1001;
exc.wReserved = 0;
exc.bstrSource = SysAllocString(L"hhhhh");
exc.bstrDescription = NULL;
exc.bstrHelpFile = NULL;
exc.dwHelpContext = NULL;
exc.pvReserved = NULL;
exc.pfnDeferredFillIn = NULL;
exc.scode = 0;
DISPPARAMS di = {¶m[0],NULL,4,0};
UINT err;
m_ps->Invoke
(3,IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_METHOD,&di,&var,&exc,&err);
for (i = 0 ; i <= 3 ; i++)
VariantClear(¶m[i]);
SysFreeString(bstrVal);此外,我在一台远程机器上运行了EXE组件(带/EMBEDDING参数),在客户端(并没有注册一个这个服务的proxy)创建远程对象成功。可是调用方法失败,不知何故。而且在另一台机器上远程同样运行了EXE组件,在客户端却不能成功创建远程对象,不知又是何故。
我查了书,你说的是关于标准Marshaling的内容。等我把相关的细节了解清楚再和你讨论。
和你讨论问题感到十分愉快。
new Atl Progject. test
new interface love
F7
copy test.h test_i.c to your client;
Add in stdafx.h
#include "test.h"
add in your call.cpp
#include "love_i.cClassNamae::OnTest()
{
ILove *pLove;
hr = ::CoCreateInstanceEx(..)
pLove = (ILove *)mqi.pItf;
pLove->YourMethod(...)
}
Add Love Method.
Login([in] BSTR* lpszUser,[in] BSTR* lpszPass)client:
WCHAR* user[1];
WCHAR* pass[1];
user[0]= SysAllocString("user");
pass[0]= SysALlocString("pass");
pLove->Login(user,pass)
SysFreeString(user[0]);
SysFreeString(pass[0]);
ITypeLib *pTLB;
HRESULT hr = S_FALSE;
char szFileName[MAX_PATH];
OLECHAR wszFileName[MAX_PATH];
GetModuleFileName(AfxGetApp()->m_hInstance, szFileName, MAX_PATH);
int i,j;
for(i = 0 ; i < MAX_PATH ; i++)
{
if (szFileName[i] == 0)
break;
}
szFileName[i-3] = 't';
szFileName[i-2] = 'l';
szFileName[i-1] = 'b';
mbstowcs(wszFileName, szFileName, MAX_PATH);
hr=LoadTypeLib(wszFileName,&pTLB);
if(FAILED(hr))
return hr;
hr=RegisterTypeLib(pTLB,wszFileName,NULL);
pTLB->Release();
(类库文件和运行的程序文件放在同一目录下)
当运行时会把类型库的有关信息注册到注册表中。然后,在客户端和远程都运行了程序,并在注册表中也看到了有关的信息(HKEY_CALSSES_RO
OT\TypeLib\{my-typelibs-guid}\)
可是运行客户端程序还是报“服务器运行失败”。
我成功了,原来是DCOMCNFG配置不对。
在这个程序中并不需要自己做proxy,我想可能系统使用了缺省的proxy吧。