Как правильно установить значение CURRENCY в C ++ - PullRequest
1 голос
/ 14 октября 2011

В 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?

1 Ответ

1 голос
/ 14 октября 2011

VarCyFromI8 - лучшее решение.

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

Тип CURRENCY немного сложен в отношении значений со знаком;просто используйте то, что уже есть, а не связывайтесь с ним самостоятельно.

Обратите внимание, что 64-битные варианты технически не поддерживаются до XP.Конечно, вы можете использовать другие функции VarCyFrom *, например, с DECIMAL или I4.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...