50分求解,搞定即结贴。 com 的Exists(VARIANT* Key, VARIANT* pVal) 返回布尔值, vb端出现怪现象(关于Not的运用)。
下面是方法的实现(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




