超难!!!再次提问ATL事件向外界(VB)传递safearray参数问题。

UDX协议 2005-01-15 09:59:36
事件声明
[id(3), helpstring("method Test2")] HRESULT Test2([out]VARIANT *Data);
我在其中传递了一个二进制数组。一个buff

这样,在VB中就有这样的一个响应事件
XX_onTest2(Data As Variant)
在这个响应当中,我调用了一个vb中的控件的方法,该方法的参数也是Data As Variant
但他却报错Varialble uses an Automation type not supported in Visual Basic
自己分析认为,控件需要的参数类型和我的atl控件参数类型不是匹配的。
而事实上,至少字面上是一样的。(是否有内容上的区别?)

另问,我在VB中如何访问这个Data?(比如传其它类型。字符串)

我对VB知之甚少,请写过atl控件的高手帮我解释一样。
...全文
336 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
UDX协议 2005-01-21
  • 打赏
  • 举报
回复
事件传递VARIANT *Data,还没有成功。
传 递数组倒是成功了。
wangweixing2000 2005-01-21
  • 打赏
  • 举报
回复
这位老兄问题解决了没有?哈哈!我来帮帮你!
UDX协议 2005-01-20
  • 打赏
  • 举报
回复
VOID Fire_XXX(VARIANT *Data)
{
T* pT = static_cast<T*>(this);
int nConnectionIndex;
CComVariant* pvars = new CComVariant[1];
int nConnections = m_vec.GetSize();

for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++)
{
CComPtr<IUnknown> sp;
sp.Attach (GetInterfaceAt(nConnectionIndex));
IDispatch* pDispatch = reinterpret_cast<IDispatch*>(sp.p);
if (pDispatch != NULL)
{
VariantInit(&pvars[0]);
pvars[0] = Data;
DISPPARAMS disp = { pvars, NULL, 1, 0 };
pDispatch->Invoke(0x2, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL);
VariantClear(&pvars[0]);
}
}
delete[] pvars;

}
sjzxyg 2005-01-20
  • 打赏
  • 举报
回复
当然是了
已经发给你了
XXandOO 2005-01-20
  • 打赏
  • 举报
回复
//Fire_XXX
VARIANT param;
VariantInit(¶m);
V_VT(¶m) = VT_ARRAY|VT_UI1;
V_VARIANTREF(¶m) = ppsa;

VariantClear(&varResult);
pvars[0] = param;
DISPPARAMS disp = { pvars, NULL, 1, 0 };
pDispatch->Invoke(0x3, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL);



//call Fire_XXX
...
CComVariant var;
VariantInit(&var);
hr = Fire_XXX(&var);
...
XXandOO 2005-01-20
  • 打赏
  • 举报
回复
有那么难吗?把你的CProxy_XXXEvents::Fire_XXX(VARIANT * ppsa)函数贴出来看看
UDX协议 2005-01-19
  • 打赏
  • 举报
回复
再顶。
UDX协议 2005-01-19
  • 打赏
  • 举报
回复
楼上,可以吗?
把你的demo发到我的邮箱。
wwwllg@126.com
包括vb的客户端。
是从。atl组件传数组给vb.
sjzxyg 2005-01-19
  • 打赏
  • 举报
回复
我试了,可以的,VB端用动态数组,而不是Variant
mysjc 2005-01-18
  • 打赏
  • 举报
回复
上帝给我双手,就是让我来顶贴的
UDX协议 2005-01-18
  • 打赏
  • 举报
回复
to 回复人: vcleaner

vb调用vc的方法已经是可以的,
我现在是的是事件传递参数。
你发给我的sample对我没有帮助,不过,感谢你的热情,如果有其他例子。请再次发给我。
一找到答案,立即给分。
leebuilder 2005-01-18
  • 打赏
  • 举报
回复
由没有使用VBScrypt来调用ocx的VARIANT *的实例啊,如果有能否给出一个,或者发到我的邮箱中
DotnetLee@126.com,先谢了
老夏Max 2005-01-18
  • 打赏
  • 举报
回复
已经给楼主发了一个例子,客户端是VB的,ATL写的COM组件!
sinall 2005-01-18
  • 打赏
  • 举报
回复
晚上帮你试试。
UDX协议 2005-01-17
  • 打赏
  • 举报
回复
你说的这个我在msdn上已经看过,他是从外面调用方法传递safearray到内部.我已经试过是可以成功的。

问题是,我的和他情况不是一样,我现在是从控件内部传递array到外部。
kingzai 2005-01-17
  • 打赏
  • 举报
回复
HOWTO: Pass Arrays Between Visual Basic and C

Q207931
this can use in ATL.
Q198017 BUG: Unexpected Error Using ATL Interface Wizard to Add Methods
For additional informationon working with Visual C++ DLLs from Visual Basic, click the article numbers below to view the articles in the Microsoft Knowledge Base:
Q188541 INFO: Visual Basic Requirements for Using Exported DLLs
Q171583 HOWTO: Fill a 32-bit VBA Array of UDType via a Visual C++ DLL
Q194609 HOWTO: Pass Array of UDTs with Variable Length Strings to C/C++
Q177218 HOWTO: Return Array to VB from VC++ DLL or OLE Server
seman 2005-01-17
  • 打赏
  • 举报
回复
是不是你的SAFEARRAY中的变量没有使用VARIANT类型
UDX协议 2005-01-17
  • 打赏
  • 举报
回复
to kingzai
不是mfc中。是atl中,mfc的ocx,中传递VARIANT *很容易。
allenq 2005-01-17
  • 打赏
  • 举报
回复
例子也发给我看看吧?谢谢, allenq@163.com
onestation 2005-01-17
  • 打赏
  • 举报
回复
加载更多回复(12)

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧