VC6 で通貨型のプロパティ値をもつ OCX を作りました。
OCX 内でその値に 1000500 と入れているのに、
その OCX を使った VB6 で作ったプログラムで、そのプロパティを
参照すると 100.05 となってしまいます。
プロパティ名: kingaku
内部名: m_kingaku
m_kingaku は CURRENCY m_kingaku; と定義され、
1000500 を kingaku に入れる際は
m_kingaku.int64 = 1000500; としています。
何故 1/10000 の値になってしまうのか分かりません。
ご存知の方、教えてください。
> m_kingaku.int64 = 1000500; としています。
上記行が原因かと思います。
VC側では、VarCyFrom**系 APIを使って格納してみては如何でしょう。
MSDNライブラリで、通貨型の項を読んでみるとわかるかと思いますが、
通貨型は、小数以下4桁を格納できるとはいえ、内部保持形式としては
「符号付き64bit整数型」に過ぎないのです。
例えば、VBのヘルプで確認してみると、
》 10,000 倍されて整数として記憶された、15 桁の整数部分と
》 4 桁の小数部分を持つ固定小数点数です。
と記述されていますし、SDKの CURRENCY 型の項であれば、
》 10,000 でスケールされた 2 の補数形式の整数値として
》 インプリメントされます
とあります。
つまり、右から4桁目に小数がある物として扱われる事になっているので、
内部的に 1000500 という値が格納された通貨型値は、実際に取得する
際には、100.0500 という値として認識されます。
回答ありがとうございます。
m_kingaku.int64 = 1000500; としていた部分を
VarCyFromUI4(1000500, &m_kingaku); と置き換えたところ、
VB 側で kingaku を参照しても 1000500 となることを
確認できました!
m_kingaku のそれぞれの要素を見ると
Lo: 0x54582F40
Hi: 0x00000002
int64: 0x0000000254582F40
となり、1000500 の 10000 倍した値がセットされていました。
あらためて MSDN を読み、通貨型についてよく分かりました。
魔界の仮面弁士さん、ありがとうございます。
ツイート | ![]() |