我有一个用vc写的函数,要做成dll供vb使用,我在vc里的声明是extern "C"  float*  __stdcall  MeasureOnetime(BSTR port);
不知道在vb里应该怎么声明,我要返回一个float型的数组

解决方案 »

  1.   

    Declare Function MeasureOnetime(Byval port As String) As Long
    VB 中无法直接操作指针,所以应该用 CopyMemory 将数据复制到一个 Single 数组中,还需要将指针释放(没试过这种用法)。最好不要将返回值定义为指针类型,这样指针的申请/释放不在一起很容易由于不匹配而崩溃。
    参考通常 API 做法,将参数声明为指针,外部申请/外部释放。
    extern "C" void __stdcall MeasureOnetime(BSTR port, float* ptr, int nCount);
        //通常应该传递缓冲区大小
    Declare Sub MeasureOnetime(Byval port As String, ByVal ptr As Long, ByVal nCount As Long)'调用
    Dim port As String
    Dim aData(100-1) As Single
    ...
    MeasureOnetime port, VarPtr(aData(0)), 100
      

  2.   

    你就定一个数组,然后直接把数组赋值的了阿
    dim Arr() as single
    Arr=你的数组
      

  3.   

    根本不明白 VC 和 VB 数组的差别!
      

  4.   

    我也来说说我的看法。楼主可以尝试使用类似一些API的做法,传入一个已初始化的数组的第一个元素的指针,以及此数组长度,再在函数内部将数组填充完成。如果你这个函数接口无法改变了,那么就比较麻烦了;因为你返回的仅是一个指针,而不知道这个指针所指向的数组的元素数量(也就是指向的内存块的长度)。那么,在VB的这边就无法为它初始化一个合适长度的数组,并使用CopyMemory复制那块内存到数组所在内存中。除非是自己根据这个指针,访问那一块内存,找到一个内存块结束标志,从而得出此块内存的长度,再复制内存。当然,这需要你对返回的内存块的结构很清楚才行。不过我还是建议改一下接口,因为你当前这个接口我觉得真的很不适合VB来使用(其它语言我不清楚,也许有办法吧)