如题,
说白了,就是,我要传一个BYTE数组给VB调用。但是这个数组是通过safearray作为VARIARNT*的成员作为事件参数传递的。前面已经有两上200分的贴子,除了将老大得100分外。其余分,90%会给提供实例者。如果成功再追加200分。
说白了,就是,我要传一个BYTE数组给VB调用。但是这个数组是通过safearray作为VARIARNT*的成员作为事件参数传递的。前面已经有两上200分的贴子,除了将老大得100分外。其余分,90%会给提供实例者。如果成功再追加200分。
解决方案 »
- 请各位大牛支招,关于流媒体服务器协议栈的选择
- DLL可不可以封装界面?
- BHO在2003下可以注册但在xp下却不行??
- CreaeInstance 想返回接口函数的指针,为什么必须定义成双指针类型啊。一直理解不了
- 在windows98下怎样使用OpenThread() (我是说怎样代替)
- 在线等待,高分奉送,建议给分!!!
- ReleaseDC和DeleteDC有什么区别?
- MFC/VC版的网友专题时间
- 初来贵地,适逢端午节,先送点礼,望各位以后多多照顾!
- MFC+webbrowser抓取页面动态生成的网页信息
- ODS(_T("XFILE: Acl file xacl.cfg not exists."))什么意思啊??
- QueryInterface问题
...
VARIANT vField;
vField.vt = VT_UI1|VT_BYREF;
vField.pbVal = (BYTE*)你的数组;
//事件推出
Fire_OnTest(vField);
...
在事件函数定义中必须为如下:
void Fire_OnTest(const VARIANT FAR& vField)
{
......
}
如果可以的话,给我发一个你写的代码,我尝试一下!MFC中能传递,ATL中也应该能传递,呵呵,COM就那么点东西,说白了,ATL和MFC都是封装而已,只是使用了不同的封装宏,不同的封装数据类型!
[email protected]
to vcleaner(我没做大哥已经很久了.......)
不需要我的例子,你随便写一个demo就行。
星,你也来帮我呀:
http://community.csdn.net/Expert/topic/3738/3738214.xml?temp=1.475161E-02
idl文件中
[id(2), helpstring("方法SetData")] HRESULT SetData([in] SAFEARRAY(VARIANT)* ppvData, [in] SAFEARRAY(BSTR)* ppsText);cpp文件中
STDMETHODIMP CAtlBKComboBox::SetData(SAFEARRAY** ppvData, SAFEARRAY** ppsText)
{
//这里用CComSafeArray包装了一下,方便使用
CComSafeArray<VARIANT> arrData;
arrData.Attach(*ppvData);
CComSafeArray<BSTR> arrText;
arrText.Attach(*ppsText);
}
idl
[id(3), helpstring("方法GetAllNames")] HRESULT GetAllNames([out,retval] SAFEARRAY(BSTR)* pNames);cpp
STDMETHODIMP CCSimpleCtrl::GetAllNames(SAFEARRAY** ppNames)
{ SAFEARRAYBOUND rgsabounds[] = { {m_names.size(), 0} };
(*ppNames) = ::SafeArrayCreate(VT_BSTR, 1, rgsabounds); //1维 NAMES::const_iterator it = m_names.begin();
for (LONG i=0; it!= m_names.end(); ++it,++i)
{
BSTR bstr;
bstr = ::SysAllocString(it->first.c_str());
ATLASSERT( SUCCEEDED(::SafeArrayPutElement((*ppNames), &i, (void*)bstr)) );
} return S_OK;
}
[id(1), helpstring("method OnTest")] HRESULT OnTest([in]VARIANT vField);
给你做个demo让你看看!
要事件传递variant*给vb并数据正确。[email protected]
你的用法,很奇特,赫赫,不好意思这么说。你是传递了一个variant*出去,然后给vb调用,填值,然后在atl里面msgbox.
这不是我需要的。我是从atl中,传数组到vb中。可能你会要我按照这个例子反过来就可以了。
可是,我没有成功过。
[id(3), helpstring("method Test2")] HRESULT Test2([out]VARIANT *Data);
即是要在atl里得到数组值,所以我这样写,如果要传一个数组给vb,应该写成
[id(3), helpstring("method Test2")] HRESULT Test2([in]VARIANT Data);
或者
[id(3), helpstring("method Test2")] HRESULT Test2([in,out]VARIANT *Data);