掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
ロード出来るけど関数ポインタが取得できない(DLL) (ID:53543)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
では、解答です。 FormatMessage ではどんな文字列が得られましたか? おそらく「プロシージャが見つかりません」といった類のものでしょう。 つまり、GetProcAddress で取得しようとしている add という関数が DLL 内に見つからない、ということです。 DLL にどんな関数があるかを調べるには、VC++ に付属している Dependency Walker というソフトを使います。VC++ 6.0 なら、スタートメニューの「Microsoft Visual Studio 6.0 ツール」の中にあるでしょう。 これを起動して、ウィンドウに DLL ファイルをドラッグ&ドロップしてみましょう。 ウィンドウの右下に、DLL がエクスポートしている関数一覧が表示されます。さて、add はあるでしょうか? おそらく、_add@8 とかいう関数があるんじゃないでしょうか。 つまり、GetProcAddress ではこの _add@8 という関数名を指定しなければならなかったのです。 しかしこれでは不便ですね。なんとか add で取得できるようにしたいものです。 さて、ここでようやく解答です。 答えは「__declspec( dllexport ) を使わずに DEF ファイルを使う」です。 最初に >どこか良いサイトがあれば教えてください とありますので、お答えしましょう。 本来ならば、最も参考になるサイトはマイクロソフト、MSDN です。 しかしここの資料はわかりやすいとは言えないので、今回はこちら。 Area of VC++ Tips らららのお部屋 http://rararahp.cool.ne.jp/vc/ 左上の「VC++ Tips」から、右上にある「DLL(Win32)」の中、「declspec(dllexport)を使ってエクスポートする」と「DEFファイルを使ってエクスポートする」をよーく読んでみてください。 偶然か必然か、まろさんが最初に提示したのとまったく同じソースコードが見つかります。 偶然でないとしたら、既に参考になるサイトを見つけていたことになりますね。 #いや、これに気づいたのはついさっきです。 #もっと早く言わなかったことを怒らないでくださいね… なお、上記ページには >エクスポートには、declspecを推奨します という一文がありますが、これは必ずしも正しくはありません。 同じページ内に「暗黙的リンク」と「明示的リンク」についての解説があります。暗黙的リンクの場合は declspec の方が楽ですが、今回のように明示的リンクを行なう場合には DEF ファイルのほうがわかりやすいでしょう。 個人的には DEF ファイルを推奨します。 なお、関数ではなくクラスをエクスポートする場合は、暗黙的リンクしか選択肢がないと言っても過言ではありません。 あえて回りくどい解説をしてみましたが、お気に召さなかったらごめんなさいね。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.