举例:动态库说明是  int ABC(int a, unsigned char b*,unsigned char *c,int *d)入参是  a , b(约定11字节)     出参是   c , d   关键是出参并没有说明是多少字节的。d 个值就是说明cc()的字节个数我是这样声明的
Public Declare Function JM Lib "TZhuZhanDLL.dll" (ByVal a As Long, _
                                                      ByRef b As Byte, _
                                                       ByRef c As Byte, _
                                                      ByRef d As Long) As Long 用的时候, 那个d 怎么怎么定义,我知道那个d 是传的地址, 也是 dim forD as long 这样吗? dim aa as long 
dim bb(10) as byte   '约定是11个字节
dim cc() as byte        '没有约定
dim dd as long         '没有约定,这个值就是说明cc()的字节个数aa=1
for i =0 to 10
bb(i) = i+10      '我随便弄得
next
bb(
select case JM( aa, bb(0), cc(0),dd)
case 0
'成功
case1
'失败
end select现在又是一运行到这里VB就奔溃退出,我监视也监视不了。我不明白的是,在动态库没有说明出参的字节数的情况下,怎么去取值。怎么去定义那个 d  ,用byref 吗?

解决方案 »

  1.   

    按 “函数原型”,你在VB6中的API声明和对应的调用方式,是理论上没有问题。
    但参数c是“输出”用的,它的函数说明中,应该有“需要多大空间”的说明,
      或者如何“得到需要多大空间”的说明(比如c传入 NULL )才对啊。
    不过,反过来说你的VB代码,cc( )是动态数组;
      你在调用API时的“使用前”没有分配数据空间,
      应该是“下标越界”的运行时错误才对啊,怎么会是“进程崩溃”呢!
    真有点想不明白…………另外,在目前“不清楚需要多大”的情况下,按你的应用场景,应该也不会用到很多空间,
     那么你可以事先分配一个“很富足”的空间试试看啊……
    比如在调用API前,redim cc(1023)或者 redim cc(4095)等等。
    看看能不能正常执行。如果能正常运行,看看它用到的是多大的空间;
    是“固定大小”的还是变动的(你要用不同的“输入数”测试)。
    若是固定的,按实际需要分配;若是变动的,就使用一个“比最大值略大些”的空间数就行了。
      

  2.   


    但一般来说,是应该要提示“下标越界”才对呀。不是VB自己用,API直接就往那个0还是啥的地址里写内容了,跳过VB的错误捕捉了吧,应该是这样
      

  3.   


    但一般来说,是应该要提示“下标越界”才对呀。不是VB自己用,API直接就往那个0还是啥的地址里写内容了,跳过VB的错误捕捉了吧,应该是这样
    老马回归了? 
    我最近都很少来这儿了。你仔细看看楼主的代码,他把 API参数都声明成“Byte类型引用”的;
     变量cc() 是动态数组,在调用JM( )前,没有进行“Redim ”的!
    这样,在执行 select case JM( aa, bb(0), cc(0),dd) 这一句时,
     首先应该是 cc(0) 这儿导致“下标越界”,无法进入API去执行的。
      

  4.   

    这种“进程崩溃”,只有一种可能会发生:
     编译时,选择了“取消数组越界检查”,
     并且要运行编译后的exe(IDE中运行,始终会进行数组越界检查的)、
     而且要API内也没有进行“无效指针”的检查时,才会因访问非法内存导致进程崩溃。
    话说……楼主都失踪了,我们还说什么呢…………
      

  5.   

    可能是函数声明错了;C语言函数声明:
    int ABC(int a, unsigned char *b,unsigned char *c,int *d)VB6函数声明:
    Public Declare Function JM Lib "TZhuZhanDLL.dll" (ByVal a As Long, _
                                                          ByRef b As String, _
                                                           ByRef c As String, _
                                                          ByRef d As Long) As Long 参考:
    https://blog.csdn.net/milaoshu1020/article/details/89057300
      

  6.   

    更新一下,String类型的应该用ByVal;C语言函数声明:
    int ABC(int a, unsigned char *b,unsigned char *c,int *d)VB6函数声明:
    Public Declare Function JM Lib "TZhuZhanDLL.dll" (ByVal a As Long, _
                                                          ByVal b As String, _
                                                           ByVal c As String, _
                                                          ByRef d As Long) As Long 参考:
    https://blog.csdn.net/milaoshu1020/article/details/89057300