请教DCOM的客户端和组件端如何配置?初学COM,敬请帮助。

解决方案 »

  1.   

    转录一部分: 使用DCOM,客户端和服务器要如何进行网络配置? 由 Romain 于 October 15, 1999 21:50:47:
    正文内容: 1,确认你的COMPONENT不是in-process dll
    2,确认你的95能用DCOM,
    看一下:
    HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\OLE\
    的ENABLEDCOM 是否为Y。
    3确认你的95和NT能够网络通讯。
    4,修改你的Component注册CODE,用CLSCTX_ALL: 
    CoRegisterClassObject(clsid,***,CLSCTX_ALL,***,***)
    5,客户端call CoCreateInstance时,用CLSCTX_ALL or 
    CLSCTX_REMOTE_SERVER.
    6,如果还不行,则CALL COM时,干脆写上你的SERVER名,
    用:CoCreateInstanceEx(CLSID,NULL,CLSCTX_REMOTE_SERVER,
    &ServerInfo,1,&mqi);
    其中ServerInfo是:
    COSERVERINFO ServerInfo;
    memset(&ServerInfo,0,sizeof(ServerInfo));
    ServerInfo.pwszName=L"MyRemoteServer";
    7,如果还不行,估计是Security问题,但出现的错误已不是"can't find RPC server". 
      

  2.   

    现在产生的问题是,系统提示没有访问权限。然后我到服务器端查看系统事件,
    提示:
    2002/05/26 17:26:09 
    启动DCOM 服务器的访问被拒绝
    服务器 {B693798-10BF-430C-A26F-E6DEE2EB9BA} 
    用户名 Unavailable/Unavailable SID=Unavailable.那么应该在服务器上怎样配置安全配置呢?
    thank you!
      

  3.   

    第一步:
    如果你建立组件时候使用的是exe,则在组件的实现类的构造函数中加入初始化安全性函数调用,如下:HRESULT hr = 0;
    hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL);如果建立组件时使用的是exe(Service),则在组件的实现类中,你可以看见一个名为CServiceModule的类,在他的Run函数中,使用如下的代码替换原来函数中的相应部分:    CSecurityDescriptor sd;
        sd.InitializeFromThreadToken();
    /*
        hr = CoInitializeSecurity(sd, -1, NULL, NULL,
    RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
    */
    hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL);注意,注释部分是系统原来生成的函数,我们不使用它,注释下面的是我们的。第二步:
    在调用组件的客户端服务程序中,进行如下编码:
    CoInitialize(NULL);
    HRESULT hr = 0;
    第一步:
    如果你建立组件时候使用的是exe,则在组件的实现类的构造函数中加入初始化安全性函数调用,如下:HRESULT hr = 0;
    hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL);如果建立组件时使用的是exe(Service),则在组件的实现类中,你可以看见一个名为CServiceModule的类,在他的Run函数中,使用如下的代码替换原来函数中的相应部分:    CSecurityDescriptor sd;
        sd.InitializeFromThreadToken();
    /*
        hr = CoInitializeSecurity(sd, -1, NULL, NULL,
    RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
    */
    hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL);注意,注释部分是系统原来生成的函数,我们不使用它,注释下面的是我们的。第二步:
    在调用组件的客户端服务程序中,进行如下编码:
    CoInitialize(NULL);
    HRESULT hr = 0;
    hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL);
    此后,必须使用CoCreateInstanceEx创建组件,进行如下设置:COAUTHIDENTITY AuthorIdentity;
    AuthorIdentity.Domain = L"工作组";
    AuthorIdentity.DomainLength = wcslen(L"工作组");
    AuthorIdentity.User = L"服务器端的一个用户名称";
    AuthorIdentity.UserLength = wcslen(L"服务器端的一个用户名称");
    AuthorIdentity.Password = L"相应用户密码";
    AuthorIdentity.PasswordLength = wcslen(L"相应用户密码");
    AuthorIdentity.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;COAUTHINFO AuthorInfo;
    AuthorInfo.dwAuthnSvc = RPC_C_AUTHN_WINNT;
    AuthorInfo.dwAuthzSvc = RPC_C_AUTHN_NONE;
    AuthorInfo.pwszServerPrincName = NULL;
    AuthorInfo.dwAuthnLevel = RPC_C_AUTHN_LEVEL_CONNECT;
    AuthorInfo.dwImpersonationLevel = RPC_C_IMP_LEVEL_IMPERSONATE;
    AuthorInfo.pAuthIdentityData = &AuthorIdentity;
    AuthorInfo.dwCapabilities = EOAC_NONE;COSERVERINFO ServerInfo;
    ServerInfo.dwReserved1 = 0;
    ServerInfo.dwReserved2 = 0;
    ServerInfo.pAuthInfo = &AuthorInfo;
    ServerInfo.pwszName = L"组件所在的服务器名称";第三步:
    在存放组件的服务器上,建立一个用户,比如test,隶属于Users,密码:1234。第四步:
    在服务器上注册组件,假设你的组件名字是atltest.exe,生成组件时候,在工程目录下面有一个atltestps.mk文件,你应该使用nmake -f atltestps.mk生成一个atltestps.dll文件。注册如下:
    atltest.exe /regserver
    regsvr32 atltestps.dll第五步:
    使用dcomcnfg.exe配置组件:在“应用程序”中,选中你的组件,选择“属性”,在弹出的对话框中,选择“安全性”,选中“使用自定义访问权限”,然后选择“编辑”,将Everyone用户添加进来;  然后,再选择“使用自定义启动权限”,选择“编辑”,将Everyone用户添加进来。这样,就OK了。