DLLについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
スモモ

DLLについて

#1

投稿記事 by スモモ » 14年前

お世話になっています。
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について

#2

投稿記事 by スモモ » 14年前

結果いつも「-1#INDOO」です。
エラーが起きないか、正しい結果1.0もでません。
非常に稚拙な質問で恐縮なのですが、答えてくださるとうれしいです。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: DLLについて

#3

投稿記事 by ISLe » 14年前

こちらでは再現しないです。
1.000000
と表示されます。
Visual C++ 2010 Expressを使いました。

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

スモモ
記事: 2
登録日時: 14年前
住所: 埼玉県さいたま市南区

Re: DLLについて

#4

投稿記事 by スモモ » 14年前

ISLe様、ご回答ありがとうございます。

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

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

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: DLLについて

#5

投稿記事 by ISLe » 14年前

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

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

スモモ
記事: 2
登録日時: 14年前
住所: 埼玉県さいたま市南区

Re: DLLについて

#6

投稿記事 by スモモ » 14年前

ISLe様、ご親切に教えていただきまして、ありがとうございます。

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

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る