LoadLibraryについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Aozora0630
記事: 85
登録日時: 10年前
住所: 日本
連絡を取る:

LoadLibraryについて

#1

投稿記事 by Aozora0630 » 10年前

http://dixq.net/forum/viewtopic.php?f=3&t=16474
この前、↑のトピックでお世話になりました。

早速、作ってみたのですが、dllのロードまでは上手くいくのですが、関数を取得するところでエラーが出てしまいます。

原因を教えて下さい。お願いします。

EXEノコード

コード:

#include <stdio.h>
#include <windows.h>

typedef void (__stdcall *PMFunc)();

int main(){
	HINSTANCE hLib;
	PMFunc MyPMFunc=NULL;
	hLib=LoadLibrary("Hoge.dll");

	if(hLib){
		MyPMFunc=(PMFunc)GetProcAddress(hLib, "_PDll@0");
	}
	else{
		MessageBox(NULL,"Hoge.dllの取得に失敗;\n","",MB_ICONINFORMATION);
	}

	if(MyPMFunc){
		MyPMFunc();
	}
	else{
		MessageBox(NULL,"_PDll@0の取得に失敗;\n","",MB_ICONINFORMATION);
	}

	FreeLibrary(hLib);

	return(getchar());
}


DLLのこーど

コード:

#include <stdio.h>
#include <windows.h>

extern "C" __declspec(dllexport) void __stdcall PDll(){
	MessageBox(NULL,"PDll;\n","",MB_ICONINFORMATION);
}


結果は、「_PDll@0の取得に失敗;」と返されます。
回答お願いします。

使ってるコンパイラ
Borland C++ Compiler

使ってる言語
C++(Visualじゃないです)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: LoadLibraryについて

#2

投稿記事 by みけCAT » 10年前

DLLに本当に_PDLL@0_PDll@0という関数はありますか?
確認したいので、テストに使用したDLLをアップロードしていただけますか?
最後に編集したユーザー みけCAT on 2015年4月03日(金) 12:20 [ 編集 1 回目 ]
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Aozora0630
記事: 85
登録日時: 10年前
住所: 日本
連絡を取る:

Re: LoadLibraryについて

#3

投稿記事 by Aozora0630 » 10年前

Hoge.zip
(45 KiB) ダウンロード数: 239 回
です。
圧縮が面倒くさかったので拡張子をzipからdllに変えてください。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: LoadLibraryについて

#4

投稿記事 by みけCAT » 10年前

Hoge.png
Dependency Walkerの画面
Hoge.png (47.93 KiB) 閲覧数: 5130 回
Dependency Walker (depends.exe) Home Page

やはりPDllという関数はエクスポートされていますが、_PDll@0という関数はエクスポートされていないようですね。
「EXEノコード」の_PDll@0 (2箇所)をPDllに書き換えてこちらで試したところ、正常にダイアログが表示されました。

Windows 7 Home Premium SP1 64bit
gcc (GCC) 4.8.1
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Aozora0630
記事: 85
登録日時: 10年前
住所: 日本
連絡を取る:

Re: LoadLibraryについて

#5

投稿記事 by Aozora0630 » 10年前

おお、そんなツールがあったのですか!
今度から使わせてもらいます。
みけCAT さんが書きました:
Hoge.png
Dependency Walker (depends.exe) Home Page

やはりPDllという関数はエクスポートされていますが、_PDll@0という関数はエクスポートされていないようですね。
「EXEノコード」の_PDll@0 (2箇所)をPDllに書き換えてこちらで試したところ、正常にダイアログが表示されました。

Windows 7 Home Premium SP1 64bit
gcc (GCC) 4.8.1
試しにPDllで書き換えてみましたが、出来なかったので、
_PDllにしたら普通に出来ました。

コンパイラの違いでしょうか?
理由も知りたいので、応えてくださったらうれしいです。

Bull
記事: 149
登録日時: 11年前

Re: LoadLibraryについて

#6

投稿記事 by Bull » 10年前

Aozora0630 さんが書きました:
コンパイラの違いでしょうか?
理由も知りたいので、応えてくださったらうれしいです。
DLLでの関数名はコンパイラーによって違うようです。
VCならご提示のプログラムでうまく行くようです。

@以降は __stdcall 特有でスタックに積むバイト
数をあらわしています。"@0"は引数が無い、"@4"
なら4バイトの引数が一つ、"@8"なら4バイトの引
数が二つないしは8バイトの引数が一つであると言
うことです。はっきりとした、理由は分りませんが、
__stdcall にすると、呼び出された関数でスタック
ポインタを調整するので間違わないようにするため
と、聞いたことがあります。__cdecl(通常の関数)
は呼び出し側がスタックポインタを調整するので
たとえ引数が間違っていても、問題ありません。


.DEFファイルを用意すれば、この"@0"はつかなく
することもできます。

コード:

LIBRARY Hoge.dll
EXPORTS
    PDll

DLL 関数の Visual Basic アプリケーションからの呼び出し方
https://msdn.microsoft.com/ja-jp/library/dt232c9t.aspx

Aozora0630
記事: 85
登録日時: 10年前
住所: 日本
連絡を取る:

Re: LoadLibraryについて

#7

投稿記事 by Aozora0630 » 10年前

ほう、そうだったんですか。
統一して欲しいですね。

回答ありがとう御座いました。

閉鎖

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