Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何正确设置C+中的货币值+; 在一个从传统VB6程序中使用的C++ DLL中,我使用数据类型返回一些大的值。_C++_Vb6_Type Conversion_Currency - Fatal编程技术网

如何正确设置C+中的货币值+; 在一个从传统VB6程序中使用的C++ DLL中,我使用数据类型返回一些大的值。

如何正确设置C+中的货币值+; 在一个从传统VB6程序中使用的C++ DLL中,我使用数据类型返回一些大的值。,c++,vb6,type-conversion,currency,C++,Vb6,Type Conversion,Currency,我用来填充它的代码是: CURRENCY INT64toCURRENCY(INT64 int64) { CURRENCY ret; ret.int64 = int64 * 10000; return ret; } 这里可能会出现整数溢出,但这是最小的问题:代码不适用于负数,INT64toCURRENCY(-1)在VB6中显示为4294967295,即232–1 然而,coutVarCyFromI8是最好的解决方案 货币类型对于有符号的值来说有点棘手;只要使用已经存在

我用来填充它的代码是:

CURRENCY INT64toCURRENCY(INT64 int64) 
{
    CURRENCY ret;
    ret.int64 = int64 * 10000;
    return ret;
}
这里可能会出现整数溢出,但这是最小的问题:代码不适用于负数,
INT64toCURRENCY(-1)
在VB6中显示为4294967295,即232–1


然而,
coutVarCyFromI8是最好的解决方案

货币类型对于有符号的值来说有点棘手;只要使用已经存在的东西,而不是自己去搞乱它


请注意,64位变体在XP之前不受技术支持。当然,您可以使用其他VarCyFrom*函数,例如十进制或I4

VarCyFromI8是最好的解决方案

货币类型对于有符号的值来说有点棘手;只要使用已经存在的东西,而不是自己去搞乱它


请注意,64位变体在XP之前不受技术支持。当然,您可以使用其他VarCyFrom*函数,例如十进制或I4

@JohnDibling:增加了“遗产”;-)您能添加调用C++代码的VB代码吗?看起来VB代码将返回值的高dword视为有符号的32位量。VB中的货币是否正常工作?如果您在调试器中单步执行此操作(可能是用汇编语言),应该可以清楚地知道发生了什么,如果不是如何修复它的话。@SteveTownsend:我根据您的要求添加了更多代码。我认为货币在VB6中工作正常。我还没有尝试调试汇编代码,尽管我怀疑它对我来说意义重大。上的Microsoft文档可能有用。这实际上是VB5版本,因为文档从未针对VB6进行过更新,但对于VB6,信息都是准确的。@JohnDibling:添加了“遗留”;-)您能添加调用C++代码的VB代码吗?看起来VB代码将返回值的高dword视为有符号的32位量。VB中的货币是否正常工作?如果您在调试器中单步执行此操作(可能是用汇编语言),应该可以清楚地知道发生了什么,如果不是如何修复它的话。@SteveTownsend:我根据您的要求添加了更多代码。我认为货币在VB6中工作正常。我还没有尝试调试汇编代码,尽管我怀疑它对我来说意义重大。上的Microsoft文档可能有用。这实际上是VB5版本,因为该文档从未针对VB6进行过更新,但VB6的信息都是准确的。至少它会让您知道这两种方法之间是否有任何不同。事实上,我很惊讶这没有按照您列出的方式工作。您也可以尝试从vb发送-1货币变量,看看它是否有不同的表示方式。我做到了,它被正确地接收到了!我认为在传输过程中,我的价值观被打乱了……至少它会让你知道这两种方法之间是否有什么不同。事实上,我很惊讶这没有像你所列的那样起作用。您也可以尝试从vb发送-1货币变量,看看它是否有不同的表示方式。我做到了,它被正确地接收到了!我想在传输过程中,我的价值观被打乱了。。。
Public Declare Function My_Fun Lib "My_Lib.dll" _
(ByVal param As Boolean) As Currency
Dim c As Currency
c = My_Fun(True)
extern "C" CURRENCY __stdcall My_Fun(VARIANT_BOOL param)
{
    return INT64toCURRENCY(-1);
}