创建了一个进程外服务器如何调试 这个COM 服务器

来源:互联网 发布:unity3d 动画制作 编辑:程序博客网 时间:2024/06/15 03:50

我创建了一个进程外服务器,是可运行的服务模式,如何调试 这个COM 服务器?

楼主lonpine(lonpine)2004-10-20 17:26:00 在 VC/MFC / ATL/ActiveX/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   的版本不吻合,无法编译.  
  如何解决啊?