举例:动态库说明是 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 吗?
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 吗?
但参数c是“输出”用的,它的函数说明中,应该有“需要多大空间”的说明,
或者如何“得到需要多大空间”的说明(比如c传入 NULL )才对啊。
不过,反过来说你的VB代码,cc( )是动态数组;
你在调用API时的“使用前”没有分配数据空间,
应该是“下标越界”的运行时错误才对啊,怎么会是“进程崩溃”呢!
真有点想不明白…………另外,在目前“不清楚需要多大”的情况下,按你的应用场景,应该也不会用到很多空间,
那么你可以事先分配一个“很富足”的空间试试看啊……
比如在调用API前,redim cc(1023)或者 redim cc(4095)等等。
看看能不能正常执行。如果能正常运行,看看它用到的是多大的空间;
是“固定大小”的还是变动的(你要用不同的“输入数”测试)。
若是固定的,按实际需要分配;若是变动的,就使用一个“比最大值略大些”的空间数就行了。
但一般来说,是应该要提示“下标越界”才对呀。不是VB自己用,API直接就往那个0还是啥的地址里写内容了,跳过VB的错误捕捉了吧,应该是这样
但一般来说,是应该要提示“下标越界”才对呀。不是VB自己用,API直接就往那个0还是啥的地址里写内容了,跳过VB的错误捕捉了吧,应该是这样
老马回归了?
我最近都很少来这儿了。你仔细看看楼主的代码,他把 API参数都声明成“Byte类型引用”的;
变量cc() 是动态数组,在调用JM( )前,没有进行“Redim ”的!
这样,在执行 select case JM( aa, bb(0), cc(0),dd) 这一句时,
首先应该是 cc(0) 这儿导致“下标越界”,无法进入API去执行的。
编译时,选择了“取消数组越界检查”,
并且要运行编译后的exe(IDE中运行,始终会进行数组越界检查的)、
而且要API内也没有进行“无效指针”的检查时,才会因访问非法内存导致进程崩溃。
话说……楼主都失踪了,我们还说什么呢…………
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
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