【发布时间】:2014-09-16 04:01:13
【问题描述】:
我正在将一个 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;
}
【问题讨论】:
-
这可能是您从 C 库中获取值的方式;尤其是如果这是来自 VB6 的端口
-
我将使用 C 库中有关该函数的更多信息来更新我的问题。如果绝对必要,我可以更改 C 代码,但这确实不理想。
-
你的 dllimport 函数是什么样的?您说得对,-180 和 4294967117 的位看起来相同——从 VB6 转换时,您是否忘记将 dllimport 声明从
long更改为integer? -
可能返回的是 32 位数字,而不是 64 位。
-
@JuiCe 正如
the_lotus所说,该函数可能返回一个 32 位值。在 VB6 中,Long是 32 位,但 VB.NETLong是 64 位。 C 函数使用long,根据规范保证为“至少 32 位”。尝试将您的 dllimport 声明更改为ByRef val As Integer并查看它是否有效。
标签: vb.net type-conversion twos-complement