我在一台机子上运行DCOM客户机程序结果正常!但把DCOM组件拷到另一台机子
却总出现没有查找的接口指针!!!为什么呀?????我服务机和客户机的安全性配置在下面:
hr = CoInitialize(NULL);
if(FAILED(hr))
{MessageBox("组件初始化失败!");
return false;
}
//初始化安全设置
hr = CoInitializeSecurity(
NULL, //Points to security descriptor
-1, //Count of entries in asAuthSvc
NULL, //Array of names to register
NULL, //Reserved for future use
RPC_C_AUTHN_LEVEL_DEFAULT, //The default authentication level for proxies
RPC_C_IMP_LEVEL_IDENTIFY, //The default impersonation level for proxies
NULL, //Reserved; must be set to NULL
0, //Additional client or server-side capabilities
NULL //Reserved for future use
);
//创建对象实例,并返回IUnknown 指针
//hr = CoCreateInstanceEx(CLSID_Account, NULL,
// CLSCTX_LOCAL_SERVER , IID_IUnknown, (void**)&pUnknown);
COSERVERINFO ServerInfo={0,L"hzh",NULL,0};//这里hzh为配置DCOM的机子名
MULTI_QI MultiQi={&IID_IUnknown,NULL,NOERROR};
hr=CoCreateInstanceEx(CLSID_Account,NULL,CLSCTX_REMOTE_SERVER,&ServerInfo,1,&MultiQi);
if(FAILED(hr))
{ MessageBox("创建对象实例失败!");
return false;
}
//通过IUnkonwn指针去查询接口指针,返回IAccount指针
pUnknown = (IUnknown *) MultiQi.pItf;
//pAccount = (IAccount *) MultiQi.pItf;
hr = pUnknown->QueryInterface(IID_IAccount,(void**)&pAccount);
if(FAILED(hr))
{ MessageBox("没有查找的接口指针!");
return false;
}
pUnknown->Release();但是结果总是:没有查找的接口指针,为什么呀???
却总出现没有查找的接口指针!!!为什么呀?????我服务机和客户机的安全性配置在下面:
hr = CoInitialize(NULL);
if(FAILED(hr))
{MessageBox("组件初始化失败!");
return false;
}
//初始化安全设置
hr = CoInitializeSecurity(
NULL, //Points to security descriptor
-1, //Count of entries in asAuthSvc
NULL, //Array of names to register
NULL, //Reserved for future use
RPC_C_AUTHN_LEVEL_DEFAULT, //The default authentication level for proxies
RPC_C_IMP_LEVEL_IDENTIFY, //The default impersonation level for proxies
NULL, //Reserved; must be set to NULL
0, //Additional client or server-side capabilities
NULL //Reserved for future use
);
//创建对象实例,并返回IUnknown 指针
//hr = CoCreateInstanceEx(CLSID_Account, NULL,
// CLSCTX_LOCAL_SERVER , IID_IUnknown, (void**)&pUnknown);
COSERVERINFO ServerInfo={0,L"hzh",NULL,0};//这里hzh为配置DCOM的机子名
MULTI_QI MultiQi={&IID_IUnknown,NULL,NOERROR};
hr=CoCreateInstanceEx(CLSID_Account,NULL,CLSCTX_REMOTE_SERVER,&ServerInfo,1,&MultiQi);
if(FAILED(hr))
{ MessageBox("创建对象实例失败!");
return false;
}
//通过IUnkonwn指针去查询接口指针,返回IAccount指针
pUnknown = (IUnknown *) MultiQi.pItf;
//pAccount = (IAccount *) MultiQi.pItf;
hr = pUnknown->QueryInterface(IID_IAccount,(void**)&pAccount);
if(FAILED(hr))
{ MessageBox("没有查找的接口指针!");
return false;
}
pUnknown->Release();但是结果总是:没有查找的接口指针,为什么呀???
2. 服务器端、客户端都须注册XXps.dll
3. 服务器端DCOM 配置:
1. 运行dcomcnfg.exe 进行DCOM 配置
2. 系统默认属性页面,选择"在这台计算机上启用分布式COM",且将"默认身份验证级别" 改为"无"
3. 系统默认安全性页面,确认"默认访问权限" 和"默认启动权限" 中的默认值均无EveryOne (影响正常启动)
4. 服务程序常规页面,将"身份验证级别" 为"无"
5. 服务程序位置页面,选择"在这台计算机上运行应用程序"
6. 服务程序安全性页面,均选择"使用自定义访问权限",且加入EveryOne 至用户列表
7. 服务程序身份标识页面,选择"交互式用户"
8,NT不能禁止guest用户4. 客户端DCOM配置:
1. 运行dcomcnfg.exe 进行DCOM 配置
2. 系统默认属性页面,选择"在这台计算机上启用分布式COM",且将"默认身份验证级别" 改为"无"
3. 系统默认安全性页面,确认"默认访问权限" 和"默认启动权限" 中的默认值均无EveryOne (影响正常启动)
4. 客户程序将"身份验证级别" 设为"无" 或者"默认"
组件项目:rr,客户端程序testrrcom
组件创建过程中选择ATL向导的executable(EXE),编绎时用nmake -f rrps.mk生成rrps.dll文件,并用regsvr32 rrps.dll注册。
并把rr.h, rrps.dll拷到testrrcom内,并regsvr32 rrps.dll注册。
并用dcomcnfg配置如第二个回复的配置!本机运行正常,把testrrcom拷到客户机,两台机子用对接线连接
用dcomcnfg配置,运行后创建对象实例成功,却找不到没有查找的接口指针,为什么呀??????有位大哥说要:
在window2000下设置dcom的通信,
第一,确定两台计算机已经注册了你的组件。
第二,安全,最容易的方法是把两天计算机设置成统一的用户名和口令,不然这两天计算机应该在同一个域(或信任域),并且客户计算机有权限访问服务计算机。
1,:要怎样在客户机上注册呀,我就用regsvr32 rrps.dll,是这样吗?
2,我两台机子用对接线连接,用户名(Administrator)相同,但密码不同可以吗?????哪位大哥大姐可以帮忙看一下,不胜感激!
Could you state it a little more briefly?
密码:b,要怎么改???)
hr = CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IDENTIFY, NULL, 0, NULL ); hr = CoCreateInstanceEx(CLSID_Account, NULL, CLSCTX_LOCAL_SERVER ,
IID_IUnknown, (void**)&pUnknown);COSERVERINFO ServerInfo={0,L"hzh",NULL,0};//这里hzh为配置DCOM的机子名
这是我自己写的一个例子,你看看。
COAUTHIDENTITY author_id;
COSERVERINFO server_info;
COAUTHINFO author_info;
MULTI_QI mqi[1];
TCHAR user[] = _T("Administrator");
TCHAR pass[] = _T("jpsoft");//;
BSTR sername = L"192.168.1.53";
HRESULT hr; ZeroMemory(&author_id,sizeof(COAUTHIDENTITY));
author_id.Flags = SEC_WINNT_AUTH_IDENTITY_ANSI;
author_id.User = reinterpret_cast<unsigned short *>(user);
author_id.UserLength = 13;
author_id.Password = reinterpret_cast<unsigned short *>(pass);
author_id.PasswordLength = 6; ZeroMemory(&author_info,sizeof(COAUTHINFO));
author_info.dwAuthnSvc = RPC_C_AUTHN_WINNT;
author_info.dwAuthzSvc = RPC_C_AUTHN_NONE;
author_info.dwAuthnLevel = RPC_C_AUTHN_LEVEL_CALL;
author_info.dwImpersonationLevel = RPC_C_IMP_LEVEL_IMPERSONATE;
author_info.dwCapabilities = EOAC_NONE;
author_info.pAuthIdentityData = &author_id; ZeroMemory(&server_info,sizeof(COSERVERINFO));
server_info.pwszName = reinterpret_cast<unsigned short *>(sername);
server_info.pAuthInfo = &author_info; mqi[0].pIID = &IID_IComCtrl;
mqi[0].pItf = NULL;
hr = CoCreateInstanceEx(LSID_ComCtrl,NULL,CLSCTX_REMOTE_SERVER,&server_info,1,mqi);我开始没有调用CoInitializeSecurity();的以,我以后每次得到一个接口都要自己设置接口上的安全性,很麻烦如下。 m_IComCtrl = (IComCtrl *)mqi[0].pItf;
hr = CoSetProxyBlanket(m_IComCtrl,RPC_C_AUTHN_WINNT,RPC_C_AUTHN_NONE,(OLECHAR *)L"192.168.1.53",RPC_C_AUTHN_LEVEL_CONNECT,RPC_C_IMP_LEVEL_IMPERSONATE,(VOID *)&author_id,EOAC_NONE);
我也是初学COM,我觉得应该用CoInitializeSecurity()初始化COM安全,我正在改,改好了给你看。
一起努力!!!!!!