複数の関数をひとつのDLLファイルとして提供したいのですが、DEFファイルに定義しても、@2以外で指定した関数は「序数*がダイナミックライブラリ****dllから見つかりませんでした。」とエラーが表示されてしまいます。
何故、DEFファイルで@2以外を指定した物がエラーとなるのかご教授お願いします。
@*の数値を他の関数と入れ替えても同じように、@2以外がエラーとなります。
宜しくお願いします。
MSDNライブラリの「.DEF ファイルを使った DLL からのエクスポート」
を一読することをお勧めします
たくさん アドバイスありがとうございます。
残念ながらMSDNを読んだのですが、私のレベルではよく理解できません。
DUMPBINで装飾名を確認したのですが、呼び出される側のソースに記述した装飾名と一致しており、これを使う側のプログラムでも同じ名前で呼び出しています。
試しに、私が所有している書籍「スタンダードVisualC++」(技術評論社)に記載のサンプルソースで以下のような感じで試したのですがやはり結果は同じでした
DLLのソース
#include "stdafx.h"
#include "resource.h"
#include "RegularDLL.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
class CRegularDLLApp : public CWinApp
{
public:
CRegularDLLApp()
{
}
BOOL CRegularDLLApp::InitInstance()
{
CWinApp::InitInstance();
return TRUE;
}
DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(CRegularDLLApp, CWinApp)
END_MESSAGE_MAP()
CRegularDLLApp app;
LRESULT APIENTRY RegularDLLFunction(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CString text = _T("最も簡単な標準 DLL");
AfxMessageBox(text);
return ERROR_SUCCESS;
}
LRESULT APIENTRY RegularDLLFunction2(void)・・・・・・ここから追加分
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CString text = _T("最も簡単な標準2 DLL");
AfxMessageBox(text);
return ERROR_SUCCESS;
}
DEFファイル
LIBRARY "RegularDLL"
EXPORTS
RegularDLLFunction @2
RegularDLLFunction2 @3・・・・・・・追加分
ヘッダーファイル
#ifndef __REGULERDLL_H__
#define __REGULERDLL_H__
#ifdef __cplusplus
extern "C" {
#endif
LRESULT APIENTRY RegularDLLFunction(void);
LRESULT APIENTRY RegularDLLFunction2(void);・・・追加分
#ifdef __cplusplus
}
#endif
#endif /* __REGULERDLL_H__ */
これを呼出し側のプログラムからRegularDLLFunction(void)とRegularDLLFunction2(void)を呼び出して実行すると「序数3がダイナミックライブラリRegulerdllから見つかりませんでした。」と、エラーが出る次第です。
当然、追加前のプログラムは正常に動いており、追加後もコンパイルは問題なく出来ています。
また、追加を行わずに@2を@3に変更しただけでも同じようにエラーが発生します。MSDNに記述されている「序数値は1からNの範囲で指定する必要があります。NはDLLのエクスポート関数の数字です。・・・・」という文面の意味を私が理解できていないのが、原因かと思うのですが
再度、どなたか対応方法のご教授お願いします。
書き込みを見る限りでは問題ないように思われます。
解決策ではありませんが…思い切って@nを削除しちゃえ☆
@nは必須ではありません。書かなければ VC++ が勝手に番号を振ってくれます。
本当に序数が必要な状況でないなら,
シャノンさんの書かれているように序数をリンカに任せる,
というのは有力な選択肢だと思います。
ちなみに,DEFファイルの序数は1からエクスポートする関数の数まで,
ということです。
つまり,一つしかエクスポートしないのであれば@1しか使えません。
たくさん、シャノンさん、YuOさん
ありがとうございました。
結果的には私の極単純なミスでした。
呼び出す側のプログラム作成ディレクトリ下のDebugフォルダー内に何故か古いDLLファイルがコピーされており、これを削除することで解決しました。
おそらくLIBファイルとDLLファイルの不一致からあのようなエラーとなっていたのではないかと思います。
ツイート | ![]() |