環境は、
VC++6.0 ダイアログベースアプリケーション WinXP
です。
DLLを2つ含むアプリケーションを作成しました。
プロジェクトの「Debug」「Release」のフォルダに、
デバッグモード、リリースモードそれぞれで作成した
・CommPort.dll
・CommPort.lib
・Sonar.dll
・Sonar.lib
を持ってきます。
VCの「プロジェクト」⇒「設定」⇒「リンク」⇒「オブジェクト/ライブラリ モジュール」に
Release/CommPort.lib Release/Sonar.lib WSOCK32.LIB
と記述しました。
上記の状態で、「Debug」「Release」のEXEファイルを実行すれば問題なく実行できま
す。
しかし、「Release」のEXEファイルだけを別のディレクトリにコピーして持って行き
実行すると、以下のダイアログが現れ、実行できませんでした。
タイトル:oriva.exe - コンポーネントが見つかりません
本文 :CommPort.dllが見つからなかったため、このアプリケーションを開始できま
せんでした。アプリケーションをインストールし直すとこの問題は解決される場合があ
ります。
DLLをそのディレクトリに持ってくれば実行は可能です。
しかし、EXEファイルのみで実行できるようにしたいのですが、方法はありますか?
コンパイル時に設定するものなどがあれば教えて頂きたいのですが・・・
>EXEファイルのみで実行できるようにしたいのですが
不可能です。
DLLとはそういうものですから。
DLLでなくスタティックライブラリを使うようにすればいいでしょう。
(Win32 Static Libraryからプロジェクトを作成して、生成されたXXX.LIBをリンクする)
質問の意図が、exeと違う位置にDLLを置いても実行できるようにしたい ということで
あれば、
http://forums.microsoft.com/msdn-ja/ShowPost.aspx?PostID=1066344&SiteID=7
を参考にしてみてください。
>不可能です。
>DLLとはそういうものですから。
了解しました。ありがとうございます。
>DLLでなくスタティックライブラリを使うようにすればいいでしょう。
>(Win32 Static Libraryからプロジェクトを作成して、生成されたXXX.LIBをリンクす
る)
この方法ならxxx.LIBをリンクして生成されたEXEファイルだけで実行が可能ということ
ですか?
ちなみにDLLの場合、外からコールされる関数には、
例えばBOOL CComA_Open(void);という関数を外から実行したい場合、
DLL_EXPORT BOOL __stdcall CComA_Open(void);
と宣言する必要がありますが、
Win32 Static Libraryでは同じような決まりはありますか?
>質問の意図が、exeと違う位置にDLLを置いても実行できるようにしたい ということで
>あれば、
違います。
実際アプリを使用するときはEXEファイルのみなので、
DLLなど複数のファイルが必要となるとユーザーが面倒だと思いまして・・・
>Win32 Static Libraryでは同じような決まりはありますか?
とりあえず、検索してみては?
「Win32 Static Library」でGoogle検索してみると
一番上のサイト(=MSDN)に詳しい解説がありますよ。
http://msdn2.microsoft.com/ja-jp/library/ms235627(VS.80).aspx
ただし、IDEはVC++6を対象に書かれていないので、そこらへんは
柔軟に対応してください。
>とりあえず、検索してみては?
すいません。安易に質問してしまいました。
今、検索しています。
もし、どうしてもわからないことがでてきたら新スレをたてて質問させていただきま
す。やれるだけやってみます。
「Win32 Static Library」は作成したことがなかったので
その存在を知っただけでも幅が広がりました。
ありがとうございました。