问题:能够创建代理对象,但不能查询接口指针.
感觉是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();
}
感觉是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();
}
解决方案 »
- WinSocket中recv阻塞模式时收到数据不足指定字节数时的响应??
- VS2008中,Project->Settings->Link在哪里啊?
- 网页源文件获取乱码问题!
- 若线程一直运行,能实现数据的连续采集吗?
- 关于CListCtrl控件内行的的高度和行列线条的颜色控制问题!
- 请问着些代码中的 file: 是做什么的?去掉可以吗 ?
- 求救高手:如何将信息按位存储在缓冲区中。
- 怎样的到汉字的国际码?有例子最好(高分)
- 小可问COM高手,在COM编写过程中,smart 指针有什么特殊的作用?“smart”体现在哪里?
- 对于nonblocking 的 socket,如何判断connect是否成功???
- list control 控件问题
- 怎么hook writefile,readfile最好贴一段原代码
// Query the IWMSBroadcastPublishingPoint interface from
// the newly created publishing point.
hr = pPubPoint->QueryInterface(IID_IWMSBroadcastPublishingPoint,
(void **)&pBCPubPoint);
if (FAILED(hr)) goto EXIT;
真不知道该怎么继续下去了,请高手帮忙解决一下.
感觉就是可访问的权限深度不够,可该怎么设置呢? 还是另有其它原因?
有一段话说[与proxy/stub 注册有关]?怎么理解呢?
因此, 我始终认为铁定与权限(DCOM, Win2003)有关, 可该怎么去考虑呢,从那儿具体入手呢?
SDK里关于DCOM的配置我做了.windows 用户权限那儿没找到什么没特别注意的设置啊?
2. 请在(Server端)建立A用户(同上)
3. Client端以A用户登陆,运行(WMS_SDK)例程, 结果如同你期望的那样,一切顺利:)祝需要的朋友们好运!领悟:
你可在Server加入多个不同的Client, 赋予这些CLient端DCOM服务权限,多个客户端可同时使用Server端的Com服务。如果能对你也有帮助,我很欣慰!
还是要谢谢大家,我只是一个新手!