重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

お世話になります。
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

A 回答 (3件)

えーっと、私、勘違いしているかも。

。。

> VCを単体で実行すると「9.999999」というformatで

これは単に format という話で、C側ソースの

"printf("CpuUsage:%.02f%\n", CpuUsage);"

の結果は、

"CpuUsage:-92559628897359297000000000000000000000000000000000000000000000.00"

となるということですね??Σ(・ε・;)

これら2つ数値は、表示形式こそ違うものの、値は同一です。(C側ソースの "%.02f" を "%g" に変えると、 XXE+YY の形式で表示されると思います)

MsgBox にて、数字の羅列形式で表示する方法なんですが、、、ちょっとすぐにはわかりません。

申し訳ないです。。
    • good
    • 0
この回答へのお礼

kocha1979さん
お礼を言うのが遅くなり大変すいません。
初心者の私には勉強になりました。
結果的には解決できませんでしたが
取り合えずVBでWMIを使用し実装しました。

ありがとうございました。

お礼日時:2005/09/09 11:41

No.2に対する自己補足です。

(;´Д`)

> VCで作成DLLをVBでCallし戻り値を取得していますが
> 正常にとれません。

関数の戻り値は正常にとれていて、C側"printf"関数での表示と、VB側"MsgBox"関数での表示で、表示形式が異なっているだけかと思われます。
    • good
    • 0

> 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 と表示されますね。
    • good
    • 0
この回答へのお礼

KOCHA1973さん、アドバイス有難うございます。
環境を記載しておりませんでした申し訳ありません。
環境は、VisualStudio6.0です。
私もKOCHA1973さんと同様にC側の関数戻り値に
9.999999とセットした場合は正常にうまくいく
事を確認できました。
但し、Statistics.max.doubleValueの値を戻り値
にセットするとうまくいきません。
VB側で確認したというのはメッセージボックスで
確認しました。
Statistics.max.doubleValueの値はVB側では受け
取れないのでしょうか?
現在、VB側ではStringで受け取ろうとしており
ますが、Double型でも同様の事象が発生しており
ます。
Statistics.max.doubleValueで取得した値が
受け渡し可能かどうかご存知ないでしょうか。

お礼日時:2005/08/23 11:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!