
お世話になります。
VCで作成DLLをVBでCallし戻り値を取得していますが
正常にとれません。
VCを単体で実行すると「9.999999」というformatで
値が入っている事は確認済みですがVBの戻り値として
取得した場合「-9.25596288973593E+61」となってしま
います。
ご存知の方ご教授頂けないでしょうか。
******* Cソース ******
/*cpu使用率取得関数*/
double GetCpuUsage()
{
HQUERY hQuery;
HCOUNTER hCounter;
PDH_RAW_COUNTER Counters[COUNTERS_SIZE];
PDH_STATISTICS Statistics;
int CurrentCounter;
int CurrentNum;
double CpuUsage;
PdhOpenQuery(NULL, 0, &hQuery);
PdhAddCounter(hQuery, "\\Processor(0#0)\\% Processor Time", 0, &hCounter);
PdhCollectQueryData(hQuery);
PdhGetRawCounterValue(hCounter, NULL, &Counters[0]);
CurrentCounter = 1;
CurrentNum = 2;
Sleep(1000);
PdhCollectQueryData(hQuery);
PdhGetRawCounterValue(hCounter, NULL, &Counters[CurrentCounter]);
CurrentCounter++;
if(CurrentCounter >= COUNTERS_SIZE) CurrentCounter = 0;
PdhComputeCounterStatistics(
hCounter,
PDH_FMT_DOUBLE,
(CurrentNum < COUNTERS_SIZE) ? 0 : CurrentCounter,
CurrentNum,
Counters,
&Statistics);
CpuUsage = Statistics.max.doubleValue;
printf("CpuUsage:%.02f%\n",CpuUsage);
PdhCloseQuery(hQuery);
/* CPU使用率を戻り値にセットする。 */
return CpuUsage;
}
****** VBソース ******
Option Explicit
Private Declare Function GetCpuUsage Lib "C:\GetCpuUsage.dll" Alias "_GetCpuUsage@0" () As Double
Private Sub Command1_Click()
Dim ret As String
Dim ret2 As Long
ret = GetCpuUsage()
MsgBox ret
End Sub
No.2ベストアンサー
- 回答日時:
えーっと、私、勘違いしているかも。
。。> VCを単体で実行すると「9.999999」というformatで
これは単に format という話で、C側ソースの
"printf("CpuUsage:%.02f%\n", CpuUsage);"
の結果は、
"CpuUsage:-92559628897359297000000000000000000000000000000000000000000000.00"
となるということですね??Σ(・ε・;)
これら2つ数値は、表示形式こそ違うものの、値は同一です。(C側ソースの "%.02f" を "%g" に変えると、 XXE+YY の形式で表示されると思います)
MsgBox にて、数字の羅列形式で表示する方法なんですが、、、ちょっとすぐにはわかりません。
申し訳ないです。。
kocha1979さん
お礼を言うのが遅くなり大変すいません。
初心者の私には勉強になりました。
結果的には解決できませんでしたが
取り合えずVBでWMIを使用し実装しました。
ありがとうございました。
No.3
- 回答日時:
No.2に対する自己補足です。
(;´Д`)> VCで作成DLLをVBでCallし戻り値を取得していますが
> 正常にとれません。
関数の戻り値は正常にとれていて、C側"printf"関数での表示と、VB側"MsgBox"関数での表示で、表示形式が異なっているだけかと思われます。
No.1
- 回答日時:
> 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で取得した値が
受け渡し可能かどうかご存知ないでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.NETで DataRow()を利用して...
-
VBAでActiveDirectoryのユーザ...
-
エクセルVBAで範囲内での位置取...
-
count(*)で取得した値をJAVAの...
-
利用者側のMACアドレスを取得し...
-
like演算子内に変数って使えな...
-
ListView 項目の選択/選択解除...
-
VBでFTPサーバ側のファイルの更...
-
VBA:小数点以下の数字を取得で...
-
asp.netでtextboxの値を取得
-
動的SQLのCOUNTのとり方
-
VBA Shapesの座標からセル位置...
-
C言語におけるコンピュータ名・...
-
getParameter と getAttribut...
-
Spreadの選択行の取得について
-
リストビュー:先頭行のアイテ...
-
CATALINA_HOMEの取得方法について
-
URIでのページの移動について
-
ListViewで複数選択された項目...
-
C言語でマウスカーソルハンド...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NETで DataRow()を利用して...
-
PHP8でWarning:Undefined varia...
-
データ数をカウントしたいのですが
-
VBAでActiveDirectoryのユーザ...
-
ListView 項目の選択/選択解除...
-
count(*)で取得した値をJAVAの...
-
利用者側のMACアドレスを取得し...
-
Flexgridで選択行の列の値を取...
-
VBA:小数点以下の数字を取得で...
-
JavaScriptにおいてコンピュー...
-
Spreadの選択行の取得について
-
ASP(vbscript)におけるクライア...
-
エクセルVBAで複数選択できるよ...
-
asp.netでtextboxの値を取得
-
コンボボックス表示文字列を取...
-
現在時刻をミリ秒まで取得
-
EXCELのリストボックスを選択し...
-
Excel VBA でログインしてい...
-
URIでのページの移動について
-
VBA リストボックス内の値を複...
おすすめ情報