こんにちは。ハロと申します。
早速ですが、質問です。
私はDLLを明示的リンクでロードして、
その関数を使用するモジュールを作成しています。
リリースモードでは実行できるのですが、
デバッグモードだと関数をロードすることができません。
リリースとデバッグではなにが違うのでしょうか?
わかる方がいらっしゃればご教授ください。お願いします。
[プロジェクト]-[設定]-[リンク]のオブジェクト/ライブラリモジュールは、
デバッグモードとリリースモードでそれぞれ別ですので個別に指定する必要が
あります。
DLLの中身をデバッグできないという意味でしたら、デバッグの[追加するDLL]に
追加する必要があります。
Rinsetさんレスありがとうございます。
試してみましたが関係ない様でした。
DLLをロードしているソースはこんな感じです↓
// DLL 呼び出し
m_hDll = AfxLoadLibrary( LOADDLL_NAME );
if( m_hDll != NULL ) // ロード成功
{
LDLL = (LLC_SEARCHIF)::GetProcAddress( m_hDll, LDFNC_NAME );
if( LDLL == NULL )
{
::MessageBox( NULL, 関数取得失敗, W_CAPTION,
MB_OK | MB_ICONEXCLAMATION | MB_TOPMOST );
return( FALSE ); // 異常終了
}
}
else
{
::MessageBox( NULL, DLLロード失敗, W_CAPTION,
MB_OK | MB_ICONEXCLAMATION | MB_TOPMOST );
m_hDllLC = NULL;
return( FALSE ); // 異常終了
}
リリースだと成功するのですが、デバックで起動すると
関数取得失敗が帰ってきてしまいます。
なぜなんでしょう?
1.アプリケーションがロードされたディレクトリ
2.カレント ディレクトリ
3.Windows システム ディレクトリ
4.Windows ディレクトリ
5.PATH 環境変数に設定されているディレクトリ
のどこかに、対象となるDLLがありますか?
リリース版のフォルダ(Release)にDLLをコピーしたけど
デバッグ版のフォルダ(Debug)にはDLLをコピーしていないのかな?
関数取得失敗ということはDLLは見つかっているようです。
デバッグ版のフォルダ(Debug)等に
まだ関数をEXPORTしていない古いDLLが置き去りにされているとか…
kuさん、dairygoodsさんレスありがとうございます。
dllはカレントディレクトリにあります。
デバックのフォルダのDllは最新版でした。
う~んなにが悪いんだろう?
VCのツールのDependencyWalkerでそのDLLを開くと
DLL内の関数の一覧が見れると思います。
その中に「LDFNC_NAME」があれば良いんだと思いますが・・・?
詳しくないのではずしていたらごめんなさい。
DebugとReleaseでLDFNC_NAMEが違うなんてことはないですよね?
あと、
DebugとReleaseで呼んでいるDLLは同じですか?
Debug時のDLLが別のバージョンのVCでデバッグ用に
作られたものだとすると、動かない気がします。
みなさんレスありがとうございました。
なんとか解決できました。
原因は、初心者的なミスで申し訳ないのですが、
メニュー[プロジェクト]-[設定]のデバック時に
.defファイルをビルドしないにチェックが入っていました。
見落としていました。本当に申し訳ないです。
みなさんありがとうございました。
でもなんでチェックが入っていたのかは謎です?