Reputation: 3468
I am calling a C++ function from VB6. In which I need to pass variable of Currency datatype. But in C++ we do not have such datatype. what should I use in C++ function to make the compatibility with currency datatype?
Upvotes: 1
Views: 2483
Reputation: 72504
The VB6s currency type is roughly the same as the CY
type from C++ (assuming a Microsoft compiler)
Internally it is an 8-byte integer which is scaled by a factor of 10,000, giving you 4 digits after the decimal separator.
Depending on the compiler you can directly use the CY
type or pass a VARIANT
and use myVariant.cyVal
(which is of the CY
type).
If you don't have the VARIANT
and CY
type available (they are not part of the C++ standard) your C++ function has to accept a 64-bit integer and you have to divide the value by 10,000 to get the correct value. (Either use __int64
or long long
, again depending on the compiler)
Upvotes: 2
Reputation: 30398
I believe Visual C++ has a native 64-bit integer type __int64 (also known as CY), which is roughly equivalent to VB6 Currency? Although in your C++ code you will "see" the value as 10,000 times larger than the value you "see" in VB6. Either divide by 10,000 in the C++ to get the correct value, or work with the scaled value to keep the precision.
For other C++ compilers Bruce McKinney's bible Hardcore Visual Basic recommends something like this, so does MSDN:
typedef union _LARGE_INTEGER {
struct {
DWORD LowPart;
LONG HighPart;
};
LONGLONG QuadPart; // In Visual C++, a typedef to __int64
} LARGE_INTEGER;
See here for more details.
Upvotes: 2
Reputation: 24299
Just take the currency
type and multiply it by 100, then pass it to C++ as a long
integer. When you needs results back, do the reverse.
There will be no loss of precision, and the code is very simple.
Upvotes: 0
Reputation: 170489
I guess the best bet is to pass it as a VARIANT and manually handle the VARIANT in the C++ code.
Upvotes: 2