我正在将VB6应用程序转换为VB.net。该应用程序使用我无法更改的现有C库。
问题:我期待-180
或180
附近的值。我期待的时间180
,它的工作原理。但是当我期待-180
时,我会得到值4294967117
。这似乎是C库正在返回2的补码,但我不知道如何对待它。
这是 VB6 代码:
Dim tmp As Long
If GetVal(VAL_A1, tmp) = ERR_VAL_NA Then
lblAngle(0).Caption = "na"
Else
lblAngle(0).Caption = tmp
End If
这是 VB.net 代码不起作用:
If GetVal(VAL_A1, tmp) = ERR_VAL_NA Then
txtBoxPhaseAngle1.Text = "na"
Else
txtBoxPhaseAngle1.Text = Convert.ToDouble(tmp)
End If
我也尝试过:
txtBoxPhaseAngle1.Text = Convert.ToInt32(tmp)
txtBoxPhaseAngle1.Text = tmp
编辑:
我如何声明C函数:
Declare Function GetVal Lib "Z:\Devel\RelayAPI\Debug\RelayAPI.dll" (ByVal what As
Integer, ByRef val As Long) As Byte
C代码中GetVal
函数的片段:
BYTE __stdcall GetVal(WORD what, long *val){
DWORD relaydate;
BYTE tmpb;
DWORD tmpd;
long tmp;
...
switch(what){
case VAL_A1:
tmpb=RelayAPI_Scaled;
if(tmpd<6){
*val=(short)((WORD)mon[38]+((WORD)mon[39]<<8));
}else{
*val=(short)((WORD)mon[32]+((WORD)mon[33]<<8));
}
break;
break;
}
答案 0 :(得分:2)
从VB6升级时,您需要注意某些数据类型已更改。在VB6中,Integer
是16位,Long
是32位。但是,在VB.NET中,Integer
为32位,Long
为64位。
在C函数中,您有long *val
,而C long
是&#34;至少32位&#34;根据规范,所以可能你的C函数返回一个32位整数。但是,VB.NET现在认为它是Long
(64位)值,并将其解释为 - 4294967117
而不是-180
。
如果将val
参数的VB.NET声明更改为ByRef val As Integer
,则可能会看到正确的返回值。