初めまして。
VC初心者です。
タイトルが~についてになってしまいましたがお許し下さい。
(日本語が苦手なので)
現在、あるゲームのDLLのソースを入手したので、
勉強してみようと思っています。
内容はCで書かれているのである程度は理解したのですが、
そのゲームは起動のオプションで、
使用するディレクトリを換えられるのですが、
(ディレクトリ毎にDLLが置かれています)
DLLをビルドすると、そのマシンでは
DLLの作成されたフォルダ配下のDLLをロードしてしまいます。
(ビルドしていないマシンでは問題無く動作します)
ゲームの実行ファイルから、ビルドする前のように動的にロードするには
どうすれば良いでしょうか。
初歩的な質問かもしれませんが、教えて頂けないでしょうか。
よろしくお願い致します。
よく内容がわからないのですが、
要するに指定パスの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;
}
大まかにこんなもんですかね...
※実際問題
//アドレスの取得(hogehoge内foo_func関数)
foo = (DLL_FUNC)GetProcAddress(hDLL,_foo_func@4);
if(!foo) return -1; //失敗
はまずい
失敗したとき
if(!foo)
{
FreeLibrary(hDLL);
return -1; //失敗
}
です。
ちゃんと作るときは
try catch とか 括弧組み とかで もっとスマートに書くべきですね...