- ベストアンサー
VBからDLL(VC)を呼び出すと戻り値が不正
- VCで作成したDLLをVBから呼び出すと、正常な値が取得できない問題が発生しています。
- VCの単体実行では正常な値が取得できていることを確認済みですが、VBの戻り値として取得すると不正な値が返ってきます。
- 解決策をご存知の方は教えていただけないでしょうか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
えーっと、私、勘違いしているかも。。。 > VCを単体で実行すると「9.999999」というformatで これは単に format という話で、C側ソースの "printf("CpuUsage:%.02f%\n", CpuUsage);" の結果は、 "CpuUsage:-92559628897359297000000000000000000000000000000000000000000000.00" となるということですね??Σ(・ε・;) これら2つ数値は、表示形式こそ違うものの、値は同一です。(C側ソースの "%.02f" を "%g" に変えると、 XXE+YY の形式で表示されると思います) MsgBox にて、数字の羅列形式で表示する方法なんですが、、、ちょっとすぐにはわかりません。 申し訳ないです。。
その他の回答 (2)
- kocha1979
- ベストアンサー率85% (6/7)
No.2に対する自己補足です。(;´Д`) > VCで作成DLLをVBでCallし戻り値を取得していますが > 正常にとれません。 関数の戻り値は正常にとれていて、C側"printf"関数での表示と、VB側"MsgBox"関数での表示で、表示形式が異なっているだけかと思われます。
- kocha1979
- ベストアンサー率85% (6/7)
> VBの戻り値として取得した場合「-9.25596288973593E+61」となってしまいます。 とは、メッセージボックスでの表示でしょうか?? 質問が微妙に曖昧ですが、試してみました。 環境は VisualStudio .NET 2003 Pro --- DLL側 --- BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } extern "C" __declspec(dllexport) double GetCpuUsage(void) { double CpuUsage = 9.999999; return CpuUsage; } --- VB側 --- Public Class Form1 Inherits System.Windows.Forms.Form Private Declare Function GetCpuUsage Lib "CPUUsage.dll" Alias "GetCpuUsage" () As Double (中略) Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim ret As String ret = GetCpuUsage() MsgBox(ret) End Sub End Class 結果は、メッセージボックスに正しく 9.999999 と表示されますね。
お礼
KOCHA1973さん、アドバイス有難うございます。 環境を記載しておりませんでした申し訳ありません。 環境は、VisualStudio6.0です。 私もKOCHA1973さんと同様にC側の関数戻り値に 9.999999とセットした場合は正常にうまくいく 事を確認できました。 但し、Statistics.max.doubleValueの値を戻り値 にセットするとうまくいきません。 VB側で確認したというのはメッセージボックスで 確認しました。 Statistics.max.doubleValueの値はVB側では受け 取れないのでしょうか? 現在、VB側ではStringで受け取ろうとしており ますが、Double型でも同様の事象が発生しており ます。 Statistics.max.doubleValueで取得した値が 受け渡し可能かどうかご存知ないでしょうか。
お礼
kocha1979さん お礼を言うのが遅くなり大変すいません。 初心者の私には勉強になりました。 結果的には解決できませんでしたが 取り合えずVBでWMIを使用し実装しました。 ありがとうございました。