如题,
说白了,就是,我要传一个BYTE数组给VB调用。但是这个数组是通过safearray作为VARIARNT*的成员作为事件参数传递的。前面已经有两上200分的贴子,除了将老大得100分外。其余分,90%会给提供实例者。如果成功再追加200分。

解决方案 »

  1.   

    我在atl中使用variant传BYTE*是这样操作的:
    ...
    VARIANT vField;
    vField.vt = VT_UI1|VT_BYREF;
    vField.pbVal = (BYTE*)你的数组;
    //事件推出
    Fire_OnTest(vField);
    ...
    在事件函数定义中必须为如下: 
    void Fire_OnTest(const VARIANT FAR& vField)
    {
        ......
    }
      

  2.   

    如果可以的话,明天等我儿子到老家去以后,我有空我们一起研究研究!
    如果可以的话,给我发一个你写的代码,我尝试一下!MFC中能传递,ATL中也应该能传递,呵呵,COM就那么点东西,说白了,ATL和MFC都是封装而已,只是使用了不同的封装宏,不同的封装数据类型!
    [email protected]
      

  3.   

    to xiaohuidong() 你在VB中试过没有?我现在就试。
    to vcleaner(我没做大哥已经很久了.......) 
    不需要我的例子,你随便写一个demo就行。
      

  4.   

    hi,楼主,发消息给我告诉我你的mail,给你发个Sample!
      

  5.   

    已经给楼主发了一个例子,客户端是VB的,ATL写的COM组件!
      

  6.   

    to 楼上,你的com,在idl中是怎么 写的?
      

  7.   

    我帮你UP
    星,你也来帮我呀:
    http://community.csdn.net/Expert/topic/3738/3738214.xml?temp=1.475161E-02
      

  8.   

    看看这个。是atl接收VB中的数组传值.应对你有所有。
    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);
    }
      

  9.   

    这个是从atl导出数组给VB的
    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;
    }
      

  10.   

    IDL这样写;
    [id(1), helpstring("method OnTest")] HRESULT OnTest([in]VARIANT vField);
      

  11.   

    我来接分!hoho!
    给你做个demo让你看看!
      

  12.   

    to 楼上。
    要事件传递variant*给vb并数据正确。[email protected]
      

  13.   

    首先声明你用atl做的如果是无界面接口那么事件中可传Variant,如果有界面也有一种办法就是把它包到一个接口中!
      

  14.   

    to楼上。有界面的是不是就不能传variant*?不一定需要包到接口中。to : XXandOO demo已经收到。
    你的用法,很奇特,赫赫,不好意思这么说。你是传递了一个variant*出去,然后给vb调用,填值,然后在atl里面msgbox.
    这不是我需要的。我是从atl中,传数组到vb中。可能你会要我按照这个例子反过来就可以了。
    可是,我没有成功过。
      

  15.   

    你的idl写的是
    [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);