DLLに複数の関数を登録するには

解決


ひで  2004-07-08 18:17:39  No: 53937

複数の関数をひとつのDLLファイルとして提供したいのですが、DEFファイルに定義しても、@2以外で指定した関数は「序数*がダイナミックライブラリ****dllから見つかりませんでした。」とエラーが表示されてしまいます。
何故、DEFファイルで@2以外を指定した物がエラーとなるのかご教授お願いします。
@*の数値を他の関数と入れ替えても同じように、@2以外がエラーとなります。
宜しくお願いします。


たく  2004-07-08 19:29:06  No: 53938

MSDNライブラリの「.DEF ファイルを使った DLL からのエクスポート」
を一読することをお勧めします


ひで  2004-07-09 04:45:23  No: 53939

たくさん  アドバイスありがとうございます。
残念ながら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のエクスポート関数の数字です。・・・・」という文面の意味を私が理解できていないのが、原因かと思うのですが
再度、どなたか対応方法のご教授お願いします。


シャノン  2004-07-09 05:41:47  No: 53940

書き込みを見る限りでは問題ないように思われます。

解決策ではありませんが…思い切って@nを削除しちゃえ☆
@nは必須ではありません。書かなければ VC++ が勝手に番号を振ってくれます。


YuO  2004-07-09 06:49:00  No: 53941

本当に序数が必要な状況でないなら,
シャノンさんの書かれているように序数をリンカに任せる,
というのは有力な選択肢だと思います。

ちなみに,DEFファイルの序数は1からエクスポートする関数の数まで,
ということです。
つまり,一つしかエクスポートしないのであれば@1しか使えません。


ひで  2004-07-09 23:32:18  No: 53942

たくさん、シャノンさん、YuOさん
ありがとうございました。
結果的には私の極単純なミスでした。
呼び出す側のプログラム作成ディレクトリ下のDebugフォルダー内に何故か古いDLLファイルがコピーされており、これを削除することで解決しました。
おそらくLIBファイルとDLLファイルの不一致からあのようなエラーとなっていたのではないかと思います。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加