2014-07-24 6 views
2

VB6 응용 프로그램을 VB.net으로 변환 중입니다. 응용 프로그램은 변경할 수없는 기존 C 라이브러리를 사용합니다.길이가 2의 보수를 저장하는 방법

문제 :-180 또는 180 주위의 값이 필요합니다. 내가 기대하는 시간은 180입니다. 그러나 내가 -180 일 때 4294967117 값을 얻습니다. 이것은 C 라이브러리가 2의 보수를 반환하는 것처럼 보이지만 그것을 치료하는 방법을 모르겠습니다. 나는 또한 시도

If GetVal(VAL_A1, tmp) = ERR_VAL_NA Then 
     txtBoxPhaseAngle1.Text = "na" 
    Else 
     txtBoxPhaseAngle1.Text = Convert.ToDouble(tmp) 
    End If 

을 :

이 작동하지 않습니다 VB.net 코드입니다

Dim tmp As Long 

If GetVal(VAL_A1, tmp) = ERR_VAL_NA Then 
    lblAngle(0).Caption = "na" 
Else 
    lblAngle(0).Caption = tmp 
End If 

:

는 작동 VB6 코드
txtBoxPhaseAngle1.Text = Convert.ToInt32(tmp) 

txtBoxPhaseAngle1.Text = tmp 

편집 : 나는 C 함수를 선언하는 방법

: C 코드에서 GetVal 기능에서

Declare Function GetVal Lib "Z:\Devel\RelayAPI\Debug\RelayAPI.dll" (ByVal what As 
Integer, ByRef val As Long) As Byte 

단편은 :

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

C lib에서 값을 얻는 방법이 될 수 있습니다. 이것이 VB6의 포트 인 경우 esp. – Plutonix

+0

C 라이브러리의 함수에 대한 추가 정보로 내 질문을 업데이트합니다. 절대적으로해야한다면 C 코드를 변경할 수 있지만 실제로 이상적은 아닙니다. – JuiCe

+1

dllimport 기능은 어떻게 생겼습니까? 여러분은 -180과 4294967117 비트가 동일하게 보입니다. VB6에서 변환 할 때 dllimport 선언을 'long'에서 'integer'로 변경하는 것을 잊었습니까? – pmcoltrane

답변

2

VB6에서 업그레이드, 당신은 알고 있어야합니다 일부 데이터 유형이 변경되었습니다. VB6에서 Integer은 16 비트이고 Long은 32 비트입니다. VB.NET에서는 Integer이 32 비트이고 Long이 64 비트입니다.

C 함수에서는 spec에 따라 long *val이고 C long은 "적어도 32 비트"이므로 C 함수가 32 비트 정수를 반환하는 것으로 추정됩니다. 그러나 이제 VB.NET은 Long (64 비트) 값으로 생각하고 대신 4294967117으로 해석합니다.

val 매개 변수의 VB.NET 선언을 ByRef val As Integer으로 변경하면 올바른 반환 값이 표시됩니다.