我在一台机子上运行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();但是结果总是:没有查找的接口指针,为什么呀???

解决方案 »

  1.   

    我服务机和客户机的安全性配置在下面:1. 服务器应用程序,不需要任何安全性配置
    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. 客户程序将"身份验证级别" 设为"无" 或者"默认"
      

  2.   

    再说详细点:
       组件项目: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)相同,但密码不同可以吗?????哪位大哥大姐可以帮忙看一下,不胜感激!
      

  3.   

    Oh, my God, faint!
    Could you state it a little more briefly?
      

  4.   

    你的安全设置里面没有任务关于服务器的用户名和密码,所以如果服务器没有用户名和密码与客户机当调用者的用户名和密码相同的用户是不可能得到接口的。你可以详细设置一下COSERVERINFO结构,就是CoCreateInstanceEx的到数弟2个参数,不要让他的大部分成员为NULL。也可以用CoInitializeSecurity进行设置。
      

  5.   

    谢谢楼上两位大哥,是的,我两台机子若有共同的用户名,密码就可以了! wuyingwsj(雾影)大哥 :下面的哪个位置可以设置服务器的用户名和密码(比如说我用户名:a,
    密码: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的机子名
      

  6.   

    to hzhstar(云)
    这是我自己写的一个例子,你看看。
    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安全,我正在改,改好了给你看。
      

  7.   

    版主为什么不整理一个关于DCOM远程调用的FAQ,最近问的人很多。
      

  8.   

    呵呵,太谢谢 wuyingwsj(雾影) 大哥了,我也试试看,
    一起努力!!!!!!