2011-10-14 21 views
1

在從傳統VB6程序使用的C++ DLL中,我使用CURRENCY數據類型來返回一些較大的值。如何在C++中正確設置CURRENCY值

我使用,以填補它的代碼是這樣的:

CURRENCY INT64toCURRENCY(INT64 int64) 
{ 
    CURRENCY ret; 
    ret.int64 = int64 * 10000; 
    return ret; 
} 

的整數溢出可能會出現在這裏,但這個是最問題:代碼不爲負數的工作,INT64toCURRENCY(-1)出現在VB6爲4 294 967 295,即2 -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

+2

VB6 ?!好神,男人...... –

+0

@JohnDibling:增加了「傳統」;-) –

+0

你可以添加你的調用C++代碼的VB代碼嗎?它看起來像VB代碼將返回值的高位dword視爲有符號的32位數量。 CURRENCY在VB中可以正常工作嗎?如果你在調試器(也許是彙編語言)中通過它,它應該足夠清楚發生了什麼,如果不是如何解決它。 –

回答

1

VarCyFromI8是最好的解決方案。

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

貨幣類型是有點麻煩與問候到符號值;只是使用已經存在的東西,而不是自己動手。

請注意,64位變種在技術上不支持到XP。當然,您可以使用其他VarCyFrom *函數,例如DECIMAL或I4。

+0

至少它會讓你知道這兩種方法之間是否有任何不同。 – adzm

+0

其實我很驚訝這不是你列出的工作。您也可以嘗試從vb發送-1貨幣變量以查看它是否以不同方式表示。 – adzm

+0

我做了,它被正確接收!我認爲在傳播過程中有些東西與我的價值觀混淆了...... –