В C ++ DLL, которая используется из устаревшей программы VB6, я использую тип данных CURRENCY , чтобы возвращать некоторые большие значения.
Код, который я использую для его заполнения:this:
CURRENCY INT64toCURRENCY(INT64 int64)
{
CURRENCY ret;
ret.int64 = int64 * 10000;
return ret;
}
Здесь может возникнуть целочисленное переполнение, но это наименьшая проблема: код не работает для отрицательных чисел, INT64toCURRENCY(-1)
появляется в VB6 как 4 294 967 295, что равно 2 32 –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);
}
В чем здесь проблема и какой правильный код для преобразования 64-разрядного целого числа со знаком в CURRENCY
?