在VB中用数组的第一个数据填入进行接受,注意COM中的int在VB中都对应long,是4byte。

解决方案 »

  1.   

    下面的文章对IDL中简单参数传递基本介绍到了,
    包括自定义结构、数组、字符串、枚举等。仔细看看吧。一、COM接口所支持的数据类型表一:各种语言平台支持的数据类型的比较Visual C++      Visual Basic       Java            大小signed char        Not Surported      byte          1unsigned char           Byte          Not Surported      1unsigned char           Character      char          2-Unicodeshort              Integer           short              2unsigned short          Not Surported      Not Surported     2int           Long          int           4unsigned int       Not Surported      Not Surported     4__int64            Not Surported      long          8unsigned __int64     Not Surported      Not Surported     8float              Single            float              4double             Double            double              8BSTR          String             java.lang.String     AutomationBOOL          Boolean            boolean            BooleanVARIANT            Variant            com.ms.com.Variant     Variant Far *IUnknown      object             com.ms.com.IUnknown     IDispatch *DATE          Date          com.ms.com.Variant  DateCURRENCY      Currency      com.ms.com.Variant     Currency表二:IDL语言的基本类型IDL基本类型     说明boolean            具有True或False值的数据项byte          保证无改变传输的8位数据项char          8位无符号字符数据项double             64位浮点数float              32位浮点数handle_t      可以被RPC绑定或数据序列化使用的原始句柄hyper              可以被声明为有符号或无符号的64位整数int           可以被声明为有符号或无符号的32位整数long          可以被声明为有符号或无符号的32位整数short              可以被声明为有符号或无符号的16位整数small              可以被声明为有符号或无符号的8位整数wchar_t            16位宽字符型二、Win32 SDK中定义的数据类型在COM接口中的使用    一般来说,Win32 SDK中的很多数据类型是无法在COM接口中使用的,我推荐大家使
    用自定义数据类型来替换它们,这样比较灵活。我在开发中经常使用的一些数据类型如
    下:IDL类型名       IDL原型     Win32数据类型及其作用S_Handle      int      各种句柄S_Color            int       RGBA颜色S_Pointer      int      各种指针S_EnumPosition          int       POSITION(MFC:枚举位置)S_DWORD            int       DWORDS_WORD             short         WORD三、字符串在接口中的定义与使用    为了保证接口方法的平台兼容性,接口参数中的字符串一般都要设计成BSTR,这样
    你设计的接口就可以直接在VB、Delphi等平台下调用了。但是在VC中,MFC对LPCTSTR的
    支持要比BSTR好的多,程序员使用Win9X平台的API函数入口也一般都习惯采用
    LPCTSTR,而且MFC提供了的CString类也是以LPCTSTR为基础的,因此在组件对象内部的
    实现机制上,我还是推荐大家使用CString或LPCTSTR。下面,我们以两个具体的接口方
    法为例,来介绍一下CString与BSTR在接口实现上的用法。// 接口定义[helpstring("获取名称")]     HRESULT GetName( [out]BSTR * pName );[helpstring("设置名称")]     HRESULT SetName( [in]BSTR strName );// 设置名称STDMETHODIMP CDemo::SetName( BSTR strName ){     AFX_MANAGE_STATE(AfxGetStaticModuleState())     m_strName =     LPCTSTR( _bstr_t( strName ,true ) );     return S_OK;}// 获取名称STDMETHODIMP C_Demo::GetName( BSTR * pName ){     AFX_MANAGE_STATE(AfxGetStaticModuleState())     if( pName )     {         *pName = m_strName.AllocSysString();         return S_OK;     }     return E_FAIL;}    从上面可以看出,向接口BSTR字串参数写,使用CString的AllocSysString函数;
    而读接口BSTR字串参数,则使用_bstr_t函数,要注意第二个参数要传true。四、在COM接口中使用自定义数据类型    COM支持的自定义数据类型主要包括两种:结构和枚举。自定义结构在COM中声明的方法与普通C语言声明结构的方式相同,一般使用typedef
    struct语法。需要注意的是,一般在接口中需要传递自定义结构数据的时候要统统采用
    引用方式传递结构指针,其IDL参数前缀如下定义:     [in,ref] 或     [out,ref]自定义枚举的声明方法与普通C语言基本相同,不过你可以强制指定MIDL调度代码以32
    位实体数据结构来传输枚举类型。默认方式下,枚举类型以16位方式传送。具体声明方
    法如下:     typedef [v1_enum] enum五、IDL中方向属性、返回值与缺省值的指定IDL规定了三种方向属性,它们分别是[in]、[out]和[in,out]。在C/S体系下,这三种
    模式标记了服务器对客户机参量数据的不同使用方式,主要是基于数据传输性能和数据
    访问的安全性考虑而设计的。in属性将对指定的参数数据进行写保护,并把它作为激活方法的请求消息的一部分传递
    给服务器。in是IDL的默认方向。out属性则表示函数调用完成后数据在响应消息中返回给客户,注意此属性必须应用在
    指针变量中,一般用标记此属性的指针变量来返回数据。当用户希望以返回值的方式获
    得数据时,可以追加retval属性,这时在VB中,此参量将作为函数的返回值。标记
    retval时,要注意该参数必须是方法的最后一个参数。in,out属性表示在指针参数指定位置处的数据,必须作为请求消息的一部分传递给服务
    器,然后在响应消息中传递回客户。在服务器端,如果必要的话函数将释放并重新分配
    一个新缓冲区;而在客户端,系统拷贝由函数返回的新数据,覆盖掉原有数据,并且客
    户将最终释放这块内存。当调用方希望所获数据内存地址不变时,应该使用此属性,但
    需要说明的是,它将牺牲一些数据流量和性能。有时候我们希望某些参数存在接口方法默认的缺省值。这时,我们可以使用
    defaultvalue属性来指定它。    有关语法清参考MSDN,在本文中就不多说了。六、关于参数数组的使用    IDL中内建了对于参数数组的支持,常用的是定长数组、一致性数组、变长数组和
    开放数组四大类。    1.定长数组:直接拷贝定长数组全部元素,应用机会较少。    2.一致性数组:一致性数组一般用在[in]属性的参数中。参数声明方法如下:    HRESULT Method( [in]int nCount, [in,size_is(nCount)]int * aData );一致性数组在客户端的调用方法如下:     int  nCount = 7;     int aData[] = { 1,2,3,4,5,6,7 }     ;     pInterface->Method( nCount, aData );一致性数组,还可以直接嵌入自定义结构中,但必须放在结构所有元素的最后,并且每
    个结构只能有一个自定义数组元素。     typedef struct tagARRAY     {         int               nCount;          [size_is(nCount)]   int *     aData;     }S_Array;    HRESULT Method( S_Array * pArray );    3.变长数组:使服务端返回给客户程序的数组元素数目可以少于预定值。变长数组
    编译时就规定了数组的边界,但实际传送的数组范围是运行时才确定的。这种做法可以
    减少数据的通信流量,多用在[out]、[in,out]属性的参数中。其参数声明方法如下:    HRESULT Method( [out]int * pCount, [out,length_is(*pCount)]int
    aData[1024] );变长数组在客户端的调用方法如下:     int     nCount;     int     aData[1024];     pInterface->Method( &nCount, aData );    4.开放数组:取消了变长数组预定值的限制。多用在[out]、[in,out]属性的参数
    中。其参数声明方法如下:    HRESULT Method( [in]int nMax, [out]int * pCount,
    [out,size_is(nMax),length_is(*pCount)]int * aData );变长数组在客户端的调用方法如下:     int     nCount;     int     aData[1024];     pInterface->Method( 1024, &nCount, aData );    5.VB客户端对数组的使用       注意要将数组的第一个元素传递给相应的接口方法而不是传递数组名。这种方
    法可以在VB中传递用户自定义类型的数组。
      

  2.   

    vrman,我已经准备给你50分了,不过你能不能告诉我你是在哪儿找到这篇文章的,我还想仔细看看!