VB调用DLL出错,一个很简的DLL调用,今天不知是怎么回事,总是不对。

//VC编写的OS_POWER.DLL的部份代码如下:
BYTE v_BFrom_val ;
BYTE v_BTo_val ;

void WINAPI ConfigTestParameter(BYTE bTestType ,BYTE bFromVal ,BYTE bToVal ,BYTE bChannelState)
{
if (1 == bTestType) //循环测试
v_BFrom_val = bFromVal ;
v_BTo_val = bToVal ;
v_iArrayLen = 352 ; //回读88组数据,没有检测的通道全为零
}
else if(2 == bTestType) //单脚单独测试
{
v_BTest_Type = 0x55 ;
v_BTo_val = bToVal ;
v_iArrayLen = 1 * 4 ;
}
else if(3 == bTestType) //单脚单独特殊测试
{
v_BTest_Type = 0x22 ;
v_BFrom_val = bFromVal ;
v_iArrayLen = 1 * 4 * 2 ;
}
else
{
MessageBox(NULL ,"请正确选择测试类型!" ,"提示: " ,MB_OK) ;
return;
}
}
BYTE WINAPI BackNum1()
{

return v_BFrom_val;
}

BYTE WINAPI BackNum2()
{

return v_BTo_val;
}
VB声明:
Declare Sub ConfigTestParameter Lib "OS_POWER_Dll.dll" (ByVal bTestType As Byte, ByVal bFromVal As Byte, ByVal bToVal As Byte, ByVal bChannelState As Byte)
Declare Function BackNum1 Lib "OS_POWER_Dll.dll" () As Byte
Declare Function BackNum2 Lib "OS_POWER_Dll.dll" () As Byte

VB调用:
Private Sub cmdOutput_Click()
Call ConfigTestParameter(1, Val(Text1.Text), Val(Text2.Text), Val(Text3.Text))
Print BackNum1 ‘获取DLL里的v_BFrom_val值
Print BackNum2 ‘获取DLL里的v_BTo_val
End Sub

当在Text1.Text 输入 2, Text2.Text 输入 20时,为什么获取的DLL的v_BTo_val值总是0呢,不是Text2.Text里的20啊,不知是何解啊.

盯了半天,快成斗鸡眼了,总算找出来了,
是你VC错误
输入2的时候 返回的是第三个参数的值,你text3没输入东西,自然是0了追问

我程序没有返回Text3的值啊,在DLL里,第一个参数是常量,第二个参数VAL(Text1)传递进去,赋给了v_BFrom_val,第三个参数VAL(TEXT2)传递进去,赋给了v_BTo_val啊,第四个参数VAL(TEXT3)在这部份代码里,没用到啊.烦请再帮忙分析下.

追答

Print BackNum1 ‘获取DLL里的v_BFrom_val值
Print BackNum2
VB在没有定义变量时,你用了 VB自动初始化 其职就是0

BackNum1 =ConfigTestParameter(1, Val(Text1.Text), Val(Text2.Text), Val(Text3.Text))
Print BackNum1

这样试试,我没见什么函数返回俩值的

追问

BackNum1 和BackNum2不是变量啊,是调用的DLL里的函数啊。VB是可以这样调用DLL函数的,我以前都是这样调用的,没有任何问题。这个问题把我搞郁闷了。

追答

那你别偷懒了 val换cbyte吧

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-11-15
问题可能是出在类型强制转换方面,把VC中的两个全局变量定义成int再试试看。追问

不是变量类型的问题,v_BFrom_val的值可以正确输出啊,只是v_BTo_val总是输出零.

追答

如果v_BFrom_val是正确的,而v_BTo_val总是零,那就比较费解了。
看不出问题,帮你顶吧……
会不会是调用方式的问题?stdcall、cdecl、pascal三种方式的压栈顺序是不同的。在dll中用MessageBox把入参都打出来看看吧。

追问

不是调用方式的问题.如果是调用方式的问题的话,那v_BFrom_val应该也不正确啊,这个问题很纠结啊.

第2个回答  2011-11-15
你会不会, 调用 可笑追问

这里不是来听你说风凉话的,你自己才不会,请不要乱叫.
通常说别人可笑的人,自己是非常讨人"可笑"的.
鉴定完毕!

追答

你不会调用 ,别逞强,还不承认

相似回答