我创建了一个进程外服务器,是可运行的服务模式,如何调试 这个COM 服务器?
客户端调用代码:
IClassFactory * m_pClassFactory=NULL; // 类厂接口指针
HRESULT hr=::CoGetClassObject(CLSID_IW3Authen,
CLSCTX_SERVER,
NULL,
IID_IClassFactory,
(void**)&m_pClassFactory);
if (FAILED(hr)) {
MessageBox("class fac created error!");
return FALSE;
}
m_pAuthen = NULL;
hr = m_pClassFactory->CreateInstance(NULL,IID_IIW3Authen,(void**)&m_pAuthen);
if(!SUCCEEDED(hr))
{
MessageBox("can not get the object");
return FALSE;
}
//上述运行非常正常,看起来似乎创建了对象.
//调用接口:
long lcoID;
BSTR checkCode;
m_pAuthen->RegUser(L"coUName",L"coPwd",L"127.0.0.1",L"user1",L"127.0.0.1",&lcoID,&checkCode);
hr = m_pAuthen->CheckUser(lcoID,L"user1",L"127.0.0.1",checkCode);
如此, 我无法调试服务器端的代码.
我在服务器端加上LOG 信息, 爷没有打印出来.说明,客户根本没有调用服务器的代码.
如果是进程内服务器, 上诉调试很是正常.
环境描述:
服务器: 是 可运行的 服务 程序.
客户何服务器都在本机上.
是服务器出问题了,还是我的客户端调用出现问题了?
问题点数:0、回复次数:11Top
1 楼aspnetwuxueyou(SHIP IT)回复于 2004-10-20 17:46:19 得分 0
Start your server firstTop
2 楼aspnetwuxueyou(SHIP IT)回复于 2004-10-20 17:52:03 得分 0
There are samples in Platform SDK 2003
locserver
locclien
Start locserver first with /EmbeddingTop
3 楼phiger(phiger)回复于 2004-10-20 21:48:09 得分 0
如果你的程序是DCOM,把你的DCom服务器启动处于调试状态设好断点,你客户端一调用,就应该会进入你断点
如果是一个COM+程序,那么稍微复杂点,先以Dllhost.exe /ProcessID:appid 启动你的COM程序处于调试状态,appid就是你的COM+的appid
例如:Dllhost.exe /ProcessID:{9CEC476D-83A5-4C2B-AFF1-3E83A147B866}
{9CEC476D-83A5-4C2B-AFF1-3E83A147B866}就是Com+的AppidTop
4 楼lonpine(lonpine)回复于 2004-10-21 09:09:32 得分 0
现在又出现了一个问题,在SERVER 端BUILD 的时候,出现一个提示:
"Service could not be deleted"
不知道问题出在哪里?Top
5 楼lonpine(lonpine)回复于 2004-10-21 09:16:58 得分 0
并且,在服务管理器中,看到服务处于一种 "被禁用" 的状态,
这是一种什么状态?
Top
6 楼aspnetwuxueyou(SHIP IT)回复于 2004-10-21 11:12:20 得分 0
服务没有正常停止Top
7 楼aspnetwuxueyou(SHIP IT)回复于 2004-10-21 11:18:53 得分 0
Q:并且,在服务管理器中,看到服务处于一种 "被禁用" 的状态,
这是一种什么状态?
A:这不是服务所处的一种状态,而是一种配置
QUERY_SERVICE_CONFIG
When to start the service. This member can be one of the following values. Value Meaning
SERVICE_AUTO_START A service started automatically by the service control manager during system startup.
SERVICE_BOOT_START A device driver started by the system loader. This value is valid only for driver services.
SERVICE_DEMAND_START A service started by the service control manager when a process calls the StartService function.
SERVICE_DISABLED A service that cannot be started. Attempts to start the service result in the error code ERROR_SERVICE_DISABLED.
SERVICE_SYSTEM_START A device driver started by the IoInitSystem function. This value is valid only for driver services.
这是服务启动时的配置选项。如果是disabled,那么服务就不启动。Top
8 楼aspnetwuxueyou(SHIP IT)回复于 2004-10-21 11:19:48 得分 0
而服务所处的状态只有:
SERVICE_CONTINUE_PENDING The service continue is pending.
SERVICE_PAUSE_PENDING The service pause is pending.
SERVICE_PAUSED The service is paused.
SERVICE_RUNNING The service is running.
SERVICE_START_PENDING The service is starting.
SERVICE_STOP_PENDING The service is stopping.
SERVICE_STOPPED The service is not running.
Top
9 楼lonpine(lonpine)回复于 2004-10-22 14:38:50 得分 0
谢谢诸位,上述的问题都已经解决了.在本机上的调试完全通过.
但是在跨服务器调用的时候,出现错误.
我的代码实例如下:
HRESULT 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
);
//...
COSERVERINFO ServerInfo2={0,L"1-2ldtkddsbv3qc.",NULL,0};
MULTI_QI MultiQi2={&IID_IUnknown,NULL,NOERROR};
hr=CoCreateInstanceEx(CLSID_IW3Authen,NULL,CLSCTX_REMOTE_SERVER/*CLSCTX_LOCAL_SERVER*/,&ServerInfo2,1,&MultiQi2);
此处,hr返回-2147023174,用ErrorLookup 查询,是RPC服务器不可用.
在服务器上,我已经注册了啊,/Service,/RegServer
为何还是不可用?
Top
10 楼lonpine(lonpine)回复于 2004-10-25 09:19:16 得分 0
以上的问题可能是 PROXY/STUB dll没有注册 造成.
问题是:
我装了新的win sdk,在NMAKE 的时候,提示我MIDL 和NMAKE 的版本不吻合,无法编译.
如何解决啊?