EXE起動時のDLLのロードについての質問

[戻る]
TAKU 2000/01/16(日) 02:43:00
初めまして。
VC初心者です。
タイトルが〜についてになってしまいましたがお許し下さい。
(日本語が苦手なので)

現在、あるゲームのDLLのソースを入手したので、
勉強してみようと思っています。
内容はCで書かれているのである程度は理解したのですが、
そのゲームは起動のオプションで、
使用するディレクトリを換えられるのですが、
(ディレクトリ毎にDLLが置かれています)
DLLをビルドすると、そのマシンでは
DLLの作成されたフォルダ配下のDLLをロードしてしまいます。
(ビルドしていないマシンでは問題無く動作します)
ゲームの実行ファイルから、ビルドする前のように動的にロードするには
どうすれば良いでしょうか。
初歩的な質問かもしれませんが、教えて頂けないでしょうか。
よろしくお願い致します。

じゃぶろー [E-Mail] [HomePage] 2000/09/07(木) 16:54:02
よく内容がわからないのですが、
要するに指定パスのDLLを動的にロードしたい
ってことですよね?

「LoadLibrary」というAPIが用意されているので
その辺のライブラリを参照すれば特に問題なくできるのではないでしょうか?

簡単に書くと
typedef int (CALLBACK* DLL_FUNC)(long A);

int main()
{
   HINSTANCE hDLL;
   DLL_FUNC  foo;

   //DLLのマップ
   hDLL = LoadLibrary("C:\hogehoge.dll");
   if(!hDLL)   return -1;   //失敗

   //アドレスの取得(hogehoge内foo_func関数)
   foo = (DLL_FUNC)GetProcAddress(hDLL,"_foo_func@4");
   if(!foo)   return -1;   //失敗

   //関数呼び出し
   cout << foo(0) << endl;

   //DLLマップ開放
   FreeLibrary(hDLL);

   return 0;
}

大まかにこんなもんですかね...

じゃぶろー 2000/09/07(木) 16:58:38
※実際問題

   //アドレスの取得(hogehoge内foo_func関数)
   foo = (DLL_FUNC)GetProcAddress(hDLL,"_foo_func@4");
   if(!foo)   return -1;   //失敗

はまずい
失敗したとき

   if(!foo)
   {
      FreeLibrary(hDLL);
      return -1;   //失敗
   }   

です。

ちゃんと作るときは
try catch とか 括弧組み とかで もっとスマートに書くべきですね...
 

古いスレッドには追加発言できません。