2011-10-14 2 views
1

레거시 VB6 프로그램에서 사용되는 C++ DLL에서 큰 값을 반환하려면 CURRENCY 데이터 형식을 사용합니다.C++에서 CURRENCY 값을 올바르게 설정하는 방법

CURRENCY INT64toCURRENCY(INT64 int64) 
{ 
    CURRENCY ret; 
    ret.int64 = int64 * 10000; 
    return ret; 
} 

정수 오버 플로우가 여기에 발생할 수있는, 그러나 이것은 적어도 문제 : 코드는 음수 작동하지 않습니다, INT64toCURRENCY(-1)가 나타납니다

나는 그것을 채우기 위해 사용하고 코드는 다음입니다 VB2 = 4 294 967 295이고, 이는 2 -1이다.

그러나 cout << INT64toCURRENCY(-1).int64은 -10000으로 추정됩니다.

은 VB6 프로그램은 기본적으로 이것이다 :

Public Declare Function My_Fun Lib "My_Lib.dll" _ 
(ByVal param As Boolean) As Currency 
Dim c As Currency 
c = My_Fun(True) 

My_Fun 여기에 문제가 무엇

extern "C" CURRENCY __stdcall My_Fun(VARIANT_BOOL param) 
{ 
    return INT64toCURRENCY(-1); 
} 

로 정의 CURRENCY에 서명 64 비트 정수를 변환하는 올바른 코드 것입니다 ?

+2

VB6 ?! 좋은 하나님, 남자 ... –

+0

@JohnDibling : "legacy";-) 추가 –

+0

C++ 코드를 호출하는 VB 코드를 추가 할 수 있습니까? VB 코드가 반환 된 값의 상위 dword를 부호있는 32 비트 수량으로 처리하는 것처럼 보입니다. VB에서 CURRENCY가 올바르게 작동합니까? 디버거에서 (아마도 어셈블리 언어로)이 단계를 수행하면 해결 방법이 아니라면 어떤 일이 벌어지고 있는지 명확해야합니다. –

답변

1

VarCyFromI8이 최상의 솔루션입니다.

http://msdn.microsoft.com/en-us/library/ms644370(v=vs.85).aspx

통화 유형 서명 값에 관해서 까다로울이고; 혼자서 혼란스럽게하기보다는 이미있는 것을 사용하십시오.

XP가 될 때까지는 64 비트 변형이 기술적으로 지원되지 않습니다. 물론 다른 VarCyFrom * 함수를 사용할 수도 있습니다 (예 : DECIMAL 또는 I4).

+0

minumum에서는 두 가지 접근 방식간에 다른 점이 있는지 알려줍니다. – adzm

+0

실은 나는 당신이 열거 한 것처럼 이것이 효과가 없었던 것이 놀랍습니다. vb에서 -1 통화 변형을 보내 다르게 표시되는지 확인할 수도 있습니다. – adzm

+0

나는 그것을했다, 정확하게 받았다! 나는 무언가가 전송 중 내 가치를 망쳐 놓고 있다고 생각한다 ... –

관련 문제