问题:能够创建代理对象,但不能查询接口指针. 
感觉是DCOM权限问题, 但本人才识疏浅, 始终不得要领. 
劳请告之! 代码: 
#define _WIN32_DCOM     // Enables DCOM extensions. 
#include  <windows.h> 
#include  <atlbase.h> 
#include "msxml6.h" 
#include "wmsserver.h" void main() 

// Declare variables and interfaces. 
IWMSServer                    *pServer = NULL; IWMSPublishingPoints          *pPubPoints = NULL; 
IWMSPublishingPoint           *pPubPoint  = NULL; 
IWMSBroadcastPublishingPoint  *pBCPubPoint = NULL; HRESULT         hr; 
COSERVERINFO    cs; 
MULTI_QI        mqi; CComBSTR        bstrFile; 
CComBSTR        bstrName; 
CComVariant     varIndex; 
// Initialize the COM library. 
hr = CoInitialize(NULL); // 
DWORD  dwAuthnSvc, dwAuthzSvc, dwAuthLvl, dwCaps;  
COAUTHIDENTITY cai; 
cai.User = L"Administrator"; 
cai.UserLength = wcslen(cai.User); 
cai.Domain = L""; 
cai.DomainLength = 0; 
cai.Password = L"cyber"; 
cai.PasswordLength = wcslen(cai.Password); 
cai.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE; 
COAUTHINFO cainfo = {RPC_C_AUTHN_WINNT, 0, 0, RPC_C_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_IMP_LEVEL_IMPERSONATE, &cai, EOAC_NONE}; // Create a COSERVERINFO structure containing information about 
// the computer on which to create the IWMSServer interface. 
ZeroMemory(&cs, sizeof(cs)); 
cs.pwszName = L"192.168.2.136"; 
cs.pAuthInfo = &cainfo; // Create a MULTI_QI structure to hold an IUnknown pointer 
// to an IWMSServer interface. 
ZeroMemory(&mqi, sizeof(mqi)); 
mqi.pIID = &IID_IWMSServer; 
mqi.pItf = NULL; 
mqi.hr = 0; // Retrieve a pointer to the IWMSServer interface. 
hr = CoCreateInstanceEx(CLSID_WMSServer, 
NULL, 
CLSCTX_SERVER, 
&cs, 
1, 
&mqi); 
if (FAILED(hr)) goto EXIT;  // The MULTI_QI structure contains an IUnknown pointer. Call 
// QueryInterface to retrieve a pointer to IWMSServer. 
hr = mqi.pItf->QueryInterface(IID_IWMSServer, (void**)&pServer); 
//hr = mqi.pItf->QueryInterface(IID_IWMSServer, 
 //(void**) &pServer); 
if (FAILED(hr)) goto EXIT; // 
hr = CoQueryProxyBlanket(pServer, &dwAuthnSvc, &dwAuthzSvc, NULL, &dwAuthLvl,\ 
NULL, NULL, &dwCaps); 
if (FAILED(hr)) goto EXIT; // 
hr = CoSetProxyBlanket(pServer, dwAuthnSvc, dwAuthzSvc, NULL, dwAuthLvl,\ 
RPC_C_IMP_LEVEL_IMPERSONATE, &cai, dwCaps); 
if (FAILED(hr)) goto EXIT; // 
hr = pServer->get_PublishingPoints(&pPubPoints); 
if (FAILED(hr)) goto EXIT; // 
hr = CoQueryProxyBlanket(pPubPoints, &dwAuthnSvc, &dwAuthzSvc, NULL, &dwAuthLvl,\ 
NULL, NULL, &dwCaps); 
if (FAILED(hr)) goto EXIT; // 
hr = CoSetProxyBlanket(pPubPoints, dwAuthnSvc, dwAuthzSvc, NULL, dwAuthLvl,\ 
RPC_C_IMP_LEVEL_IMPERSONATE, &cai, dwCaps); 
if (FAILED(hr)) goto EXIT; 
     
// 
varIndex = "pub"; 
hr = pPubPoints->Remove(varIndex); 
//if (FAILED(hr)) goto EXIT; // 
bstrName = "pub"; 
bstrFile = "http://192.168.2.188:8080"; 
hr = pPubPoints->Add(bstrName, WMS_PUBLISHING_POINT_BROADCAST, 
 bstrFile, &pPubPoint); 
if (FAILED(hr)) goto EXIT; // 
hr = CoQueryProxyBlanket(pPubPoint, &dwAuthnSvc, &dwAuthzSvc, NULL, &dwAuthLvl,\ 
NULL, NULL, &dwCaps); 
if (FAILED(hr)) goto EXIT; // 
hr = CoSetProxyBlanket(pPubPoint, dwAuthnSvc, dwAuthzSvc, NULL, dwAuthLvl,\ 
RPC_C_IMP_LEVEL_IMPERSONATE, &cai, dwCaps); 
if (FAILED(hr)) goto EXIT; // Query the IWMSBroadcastPublishingPoint interface from 
// the newly created publishing point. 
hr = pPubPoint->QueryInterface(IID_IWMSBroadcastPublishingPoint, 
  (void **)&pBCPubPoint); 
if (FAILED(hr)) goto EXIT; 
EXIT: 
// TODO: Release temporary COM objects and uninitialize COM. 
if(pServer)pServer->Release(); 
if(pPubPoints)pPubPoints->Release(); 
if(pPubPoint)pPubPoint->Release(); 
if(pBCPubPoint)pBCPubPoint->Release(); CoUninitialize(); 
}

解决方案 »

  1.   

    是二次查询新接口时出现访问拒绝提示
    // Query the IWMSBroadcastPublishingPoint interface from  
    // the newly created publishing point.  
    hr = pPubPoint->QueryInterface(IID_IWMSBroadcastPublishingPoint,  
      (void **)&pBCPubPoint);  
    if (FAILED(hr)) goto EXIT;  
      

  2.   

    看了不少关于DCOM权限的帖子,但这个类型的却没有一条.
    真不知道该怎么继续下去了,请高手帮忙解决一下.
      

  3.   

    pServer指针方法是可以调用的,就是说远程已经激活,也可以访问.
    感觉就是可访问的权限深度不够,可该怎么设置呢? 还是另有其它原因?
      

  4.   

    跟中,英文系统有没有关系?
    有一段话说[与proxy/stub 注册有关]?怎么理解呢?
      

  5.   

    客户机与服务器(Both win2003)使用相同的用户名和密码, 怎么操作都没有关系, 正确按照要求执行下去.
    因此, 我始终认为铁定与权限(DCOM, Win2003)有关, 可该怎么去考虑呢,从那儿具体入手呢?
    SDK里关于DCOM的配置我做了.windows 用户权限那儿没找到什么没特别注意的设置啊? 
      

  6.   

    今天已经摸索出来了:)1. 请在(client端)建立A用户(USer:你自定, Pass:你自定)
    2. 请在(Server端)建立A用户(同上)
    3. Client端以A用户登陆,运行(WMS_SDK)例程, 结果如同你期望的那样,一切顺利:)祝需要的朋友们好运!领悟:
    你可在Server加入多个不同的Client, 赋予这些CLient端DCOM服务权限,多个客户端可同时使用Server端的Com服务。如果能对你也有帮助,我很欣慰!
    还是要谢谢大家,我只是一个新手!