CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  ATL/ActiveX/COM

50分求解,搞定即结贴。 com 的Exists(VARIANT* Key, VARIANT* pVal) 返回布尔值, vb端出现怪现象(关于Not的运用)。

楼主yellowdragon(无风树自摇)2004-08-04 19:47:40 在 VC/MFC / ATL/ActiveX/COM 提问

下面是方法的实现(VC++):    
   
  //in   the   .h  
  //   This   typedef   defines   the   internal   STL   storage   collection  
  typedef   std::map<CAdapt<CComBSTR>,   CComVariant>   VarMap;  
  //store   key   self   as   ccomvariant  
  typedef   std::map<CAdapt<CComBSTR>,   CComVariant>   VarMap_SaveKeySelf;  
   
  private:  
  VarMap m_coll;  
  VarMap_SaveKeySelf   m_coll_save_key_self;  
   
  //in   the   .cpp  
  STDMETHODIMP   CMakeZTDIC::Exists(   /*   [in]   */   VARIANT*     key,   /*   [out   ,   retval]   */   VARIANT_BOOL*     pVal)  
  {  
  //   TODO:   Add   your   implementation   code   here  
  BEGIN_PROTECT_METHOD();  
   
   
  //   According   to   the   VB   documentation   Index   must    
  //   either   be   numeric   or   a   string  
  if(   V_VT(key)   ==   VT_BSTR   )  
  {  
  CComBSTR   bstrKey(   V_BSTR(key)   );  
  VarMap::iterator   it   =   m_coll.find(bstrKey);  
  if   (it   ==   m_coll.end())  
  {  
  //pVal->vt   =   VT_BOOL;  
  //pVal->boolVal   =   false;  
  *pVal   =   false;  
  }else  
  {  
  //pVal->vt   =   VT_BOOL;  
  //pVal->boolVal     =   true;  
  *pVal   =   true;  
  }  
   
  }else   if   (V_VT(key)   ==   VT_DISPATCH)  
  {  
  TCHAR   szKey1[128];  
  wsprintf(szKey1,   ("Key_%li"),   V_DISPATCH(key)   );  
  CComBSTR   bstrKey(   szKey1   );  
   
  //diferent   key   's   address   should   be   compare   to   point   to   key   's   value  
  CComVariant   compareSource(*key);  
   
  VarMap_SaveKeySelf::iterator   it_self   =   m_coll_save_key_self.begin();  
  VarMap_SaveKeySelf::iterator   end_self   =   m_coll_save_key_self.end();  
   
  for   (int   i   =   0   ;   i<   m_coll_save_key_self.size()   &&   it_self   !=   end_self   ;   i++)  
  {  
  if   ((*it_self).second   ==   compareSource)  
  {  
   
   
  //pVal->vt   =   VT_BOOL;  
  //pVal->boolVal     =   true;  
  *pVal   =   true;  
  return   S_OK;  
  }  
   
  it_self   ++   ;  
  }  
  //pVal->vt   =   VT_BOOL;  
  //pVal->boolVal   =   false;  
  *pVal   =   false;  
   
  }  
   
  //VT_I2   OR   VT_I4   PROCESS   TODO:  
   
  return   S_OK;  
  END_PROTECT_METHOD();  
  }  
  把方法Exists第二个参数改成VARIANT*   pVal   也可。看我在返回值前的注释就知道了。  
   
  在vb6端该com   对象引用,   用NOT   COMReference.Exists(aExistKey),   结果他不起作用,   详细一点如下:  
  Private   sub   commandClick()  
          Dim   ztdicdll   As   New   ZTDICLib.MakeZTDIC   'com   object   reference    
          Dim   strztdllkey,   strZTDLLItem       As   String  
          strztdllkey   =   "FlowID"  
          strztdllkey_notexist   =   "FlowIDNotExist"  
          strZTDLLItem   =   "<Root   name   =   flow   ><Nood   name=   id1>...</Nood></Root>"  
           
          ztdicdll.Add   strztdllkey,   strZTDLLItem   '   add   in   rightly  
   
          If   (Not   (ztdicdll.Exists(strztdllkey)))   Then  
                  Debug.Print   "not   true"   'jump   here   ,   puzzled,   i   think   it   is   wrong  
          Else  
                  Debug.Print   "true"   'should   be   jump   in   here   ,   but   not  
          End   If  
          'ztdicdll.Exists(strztdllkey)   equal   true  
          'ztdicdll.Exists(strztdllkey_notexist)   equal   false  
   
          'why?    
   
  end   sub  
   
  //是哪儿内存泄漏了(胡乱猜)?  
  //是vb   和vc++   数据类型不匹配?    
  //是vb本是有问题(简直是天大的笑话   ~v~     )?        
  问题点数:50、回复次数:8Top

1 楼yellowdragon(无风树自摇)回复于 2004-08-04 19:53:39 得分 0

抱歉第二个参数是VARIANT_BOOL,   主题上写错了,   对不起。其实返回值类型我都是调了,  
  VARIANT_BOOL*     和     VARIANT*   ,   都是那样子,费解?Top

2 楼firmbird(firmbird)回复于 2004-08-04 19:55:49 得分 10

vc和vb中true,false的定义是不一样的Top

3 楼yellowdragon(无风树自摇)回复于 2004-08-04 20:22:38 得分 0

这个我知道,   在VC中是以零和非零,VB中就不太清楚底层如何实现TRUE   OR   FALSE   的?   看来我是要绕个湾才可以吗?   如果直接转化呢?Top

4 楼jim3000(jim)回复于 2004-08-04 21:03:47 得分 40

你把true换成VARIANT_TRUE就应该没问题  
  因为true与   VARIANT_TRUE(-1)所表示的值不一样  
  对于VARIANT_BOOL型的变量,其值最好用VARIANT_TRUE和VARIANT_FALSE,这样,VB识别才没问题  
   
  Top

5 楼yellowdragon(无风树自摇)回复于 2004-08-05 09:20:27 得分 0

let   me   try   a   try   ,   thank   you   in   advanceTop

6 楼yellowdragon(无风树自摇)回复于 2004-08-05 09:32:00 得分 0

http://www.osronline.com/lists_archive/ntdev/thread192.htmlTop

7 楼yellowdragon(无风树自摇)回复于 2004-08-05 09:45:40 得分 0

结。给分。Top

8 楼sinsou(阿良·有谁共鸣)回复于 2004-08-10 17:31:05 得分 0

true和false用1和0就可以,我就是这样返回的  
  在c#中调用没有问题Top

相关问题

  • VB 报表问题 急!!!高分求解!!!!!
  • 一个有趣的VB问题求解
  • 求解 求解 求解
  • 高分求解vb的dhtml工程的dll问题???
  • [300'求解!]**HELP**关于VB+ACCESS、嵌套查询的问题*********。
  • 高分求解 loust 与 vb的 编程资料
  • 100分:求解用VB写的接收带附件的Email?
  • VB的数据库批量录入问题求解
  • 100分求解:PB6.5下如何调用VB开发的DLL。
  • 高分求解关于VB调用C写的Dll问题

关键词

  • vc++
  • vb
  • vc
  • pval
  • strztdllkey
  • variant
  • varmap
  • ztdicdll
  • vt
  • szkey1

得分解答快速导航

  • 帖主:yellowdragon
  • firmbird
  • jim3000

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo