VB6与DLL函数 数组传递的问题
用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调用此函数后的数是与函数中的赋值是一致的.
请问是何原因。
[解决办法]
求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位为2Public Function int2bcd(i As Integer) As Byte()Dim b() As ByteDim 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 = bEnd Function
[解决办法]
非要“钻牛角尖”搞清楚的话,在C函数中插入“__asm int 3;”然后在VS里面运行,进入调试环境按Alt+8键显示每句C对应的汇编,单步执行调试。
[解决办法]
在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中最终生成的那个。