在旧版VB6程序中使用的C ++ DLL中,我使用CURRENCY数据类型返回一些大值。
我用来填充它的代码是:
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
的正确代码是什么?
答案 0 :(得分:1)
VarCyFromI8是最佳解决方案。
http://msdn.microsoft.com/en-us/library/ms644370(v=vs.85).aspx
CURRENCY类型在签名值方面有点棘手;只需使用已存在的东西而不是自己搞乱它。
请注意,在XP之前,技术上不支持64位变体。当然,您可以使用其他VarCyFrom *函数,例如使用DECIMAL或I4。