ページ 11

DLLについて

Posted: 2011年10月06日(木) 18:22
by スモモ
お世話になっています。
dllの勉強しています。ソースは以下の通りです。
なぜ、結果が1.0にならないか、わかりません。
ご教授のほどお願い致します。

//---------------------------dll----------------------------
dll.h

コード:

 
#include <windows.h>

class C_sys
{
public:
	virtual ~C_sys(){}
	virtual float GetVersion() = 0;
};

dll.cpp

コード:

 
#include "dll.h"
class C_Sys : public C_sys
{
public:
	C_Sys(){}
	~C_Sys(){}
	float GetVersion();
};

float C_Sys::GetVersion()
{
	return 1.0f;
}
C_sys* GetSys()
{
	return (C_sys*)new C_Sys();
}

sys.def

コード:

 
LIBRARY	"sys"
EXPORTS
	GetSys @1
//---------------------------main----------------------------
main.cpp

コード:

#include "dll.h"

void main()
{
	typedef	C_sys* (*func)(void);
	HMODULE hmod = LoadLibrary(name);
	func GetSys = (func)GetProcAddress(hmod, "GetSys");
	C_sys* sys = GetSys();
	printf("%f",sys->GetVersion());
}

非常に稚拙な質問で恐縮なのですが、答えてくださるとうれしいです。

Re: DLLについて

Posted: 2011年10月06日(木) 20:21
by スモモ
結果いつも「-1#INDOO」です。
エラーが起きないか、正しい結果1.0もでません。
非常に稚拙な質問で恐縮なのですが、答えてくださるとうれしいです。

Re: DLLについて

Posted: 2011年10月07日(金) 04:38
by ISLe
こちらでは再現しないです。
1.000000
と表示されます。
Visual C++ 2010 Expressを使いました。

ビルド手順か実行時のファイル配置に問題があるのではないでしょうか。
LoadLibraryやGetProcAddressの戻り値は正常値ですか?

Re: DLLについて

Posted: 2011年10月07日(金) 14:35
by スモモ
ISLe様、ご回答ありがとうございます。

float C_Sys::GetVersion()
{
return 1.0f;
}

1.0fを1.fにすると正常になりました。
コードの書き方の問題かもしれません。
またよろしく、お願い致します。

Re: DLLについて

Posted: 2011年10月08日(土) 00:18
by ISLe
スモモ さんが書きました:1.0fを1.fにすると正常になりました。
コードの書き方の問題かもしれません。
C/C++言語としては1.0fと1.fは同じものですから、それで結果が変わるということはまともなプログラムを書いてもまともに動くこともあれば動かないこともあるということになりますけど。
そんなでは安心してコンパイラ使えませんよ。

DLLのソースコードを書き換えて直ったということは、クラス定義を書き換えたのにDLLをビルドし直してなかったという線が濃厚ですね。

Re: DLLについて

Posted: 2011年10月10日(月) 16:53
by スモモ
ISLe様、ご親切に教えていただきまして、ありがとうございます。

ビルドし直したら「1.0f」も「1.f」も1.0000000出るようになりました。

私まだまだ勉強が足りないようです。

また、宜しくお願いします。