VB6与DLL函数 数组传递的问题

edeshe 2011-04-13 10:40:30
用VC6编写了一个DLL。DLL中有一个函数 需要根据VB6传过来的几个数据生成一个数组,而后把数组的值传回给VB6.具体代码如下:

// 整数转BCD码,4位数转存后为2个字节 比如1234 转存后为两个字节 低字节高4位为3 低4位为4 高字节高4位为1 低4位为2
extern "C" _declspec(dllexport) char _stdcall int2b(int shu , unsigned char *outArr )
{
unsigned char E1,E2,E3,E4 ;
int shu2;
E4=int(shu/1000);
shu2=shu-E4 * 1000;
E3=int(shu2/100);
shu2=shu2-E3 * 100;
E2=int(shu2/10);
shu2=shu2-E2 * 10;
E1=shu2;
outArr[0]= (E2<<4) | (E1&15);
outArr[1] =(E4<<4) | (E3&15);
return 1;
}

VB6中的调用代码如下:

Dim sz(10) As Byte
Dim BH As Long
DIM I AS LONG
FOR I=0 TO 10
sz(I)=0
NEXT I
BH = 1234
A = int2b(BH, sz(0))

以上代码得到的结果却是sz(0)=86 sz(1)=185

在VC中调试此代码得到的结果是第一个值为&H34=52,第二个值是&H12=18 为什么VB6调用DLL中的此函数后,得到的结果却不对呢。
另外还发现,如果把函数

extern "C" _declspec(dllexport) char _stdcall int2b(int shu , unsigned char *outArr )
{
outArr[0]=39;(当然这个数随意)
outArr[1]=231;(当然这个数随意)
return 1;
}

VB调用此函数后的数是与函数中的赋值是一致的.

请问是何原因。
...全文
125 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2011-04-13
  • 打赏
  • 举报
回复
求BCD码没必要用C DLL这么复杂的技术吧。
Private Sub Command1_Click()
Dim bb() As Byte
bb = int2bcd(&H1234)
Debug.Print "bb(0)=&h" + Right("0" + Hex(bb(0)), 2) + ",bb(1)=&h" + Right("0" + Hex(bb(1)), 2)
End Sub
'整数转BCD码,4位数转存后为2个字节 比如4660=&h1234 转存后为两个字节 低字节高4位为3 低4位为4 高字节高4位为1 低4位为2
Public Function int2bcd(i As Integer) As Byte()
Dim b() As Byte
Dim h As String * 4
ReDim b(1)
h = Right("000" + Hex(i), 4)
b(0) = CByte("&h" + Right(h, 2))
b(1) = CByte("&h" + Left(h, 2))
int2bcd = b
End Function

输出
bb(0)=&h34,bb(1)=&h12

至于“为客户提供一个DLL,目的是为了把我们的一些核心的信息封装起来。所以必须用c编写”
知不知道从防破解的角度来看,C DLL比VB NativeCode更好破解?
现在还是人类 2011-04-13
  • 打赏
  • 举报
回复
这问题还没解决吗?不是问过了吗?
edeshe 2011-04-13
  • 打赏
  • 举报
回复
解决了,谢谢大家,是我的引用此函数的另一个函数的VB声明中BYVAL省略后系统自动用了BYREF导致的错误。谢谢。
捧剑者 2011-04-13
  • 打赏
  • 举报
回复
在moudle中加上以下声明:
declare function int2b lib "libname.dll" ( byval shu as long, outArr as any) as byte

调用时以这种方式调用:
A = int2b(BH, sz(0))

经过试验,在vb中得出52和18的结果。
检查一下你使用的dll是不是你在vc中最终生成的那个。
现在还是人类 2011-04-13
  • 打赏
  • 举报
回复
1、VC的变量运算要求很严格,即使VC的代码看起来和VB的差不多,但计算的结果也不见得一样。
因为VC中没有那么只能的数据转换过程,而且变量的定义初始值也不一样,VB的是&H00,VC的
是0xFF,这也都可能是导致运算结果不对的因素。
2、VC理解接VB传递过来的是个内存指针,而不是什么数组的概念,所以在VC中操作的是指针地址里
的值,而不是VB数组结构。在这个过程中,之所以用到指针的指针,主要是方便接口程序重新分配
内存,然后不至于改变原来指针的地址才这样运用。

你可以在VC里尝试单步调试,先看看VC代码运算的结果是否正确,如果结果正确,再看看要返回数据
的指针地址是多少,然后在VB中调用完VC的函数取得的指针地址也显示出来看看,看看是否是VC返回
的相同的内存地址,这样一层一层调试,总会发现问题所在的。
edeshe 2011-04-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 supermanking 的回复:]
这问题还没解决吗?不是问过了吗?
[/Quote]

大哥,木有呀。是不是在DLL将数组转给VB的时候,中间进行的类型转换,导致了这个问题。

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧