6

エクスポートするdllがあります

extern "C" __declspec(dllexport) int __stdcall Foo( void );

dllのダンプは示しています

******************************************************************************
Section:             Exports
File Offset:         00001400 (5120)
  Flags:             00000000
  Time Stamp:        00000000
  Major Version:     0000
  Minor Version:     0000

Exports from simple.dll
  3 exported name(s), 3 export addresse(s).  Ordinal base is 1.
  Sorted by Name:
    RVA      Ord. Hint Name
    -------- ---- ---- ----
    00002104    3 0000 std::nothrow
    00001258    2 0001 Foo
    000020F8    1 0002 ___CPPdebugHook

******************************************************************************

私は次のdefファイルから始めました:

LIBRARY simple.dll 
EXPORTS
  Foo

これにより、次のエクスポートを含むlibファイルが作成されました。

Exports
       ordinal    name
                  _Foo

このライブラリにリンクすると、msvcリンカーが_Foo@0が見つからないと文句を言います。この問題を修正するために、defファイルにエイリアスを追加しました。

LIBRARY simple.dll 
EXPORTS
  Foo
  Foo@0=Foo

これにより、エクスポートを含むlibファイルが作成されます

Exports
       ordinal    name
                  _Foo
                  _Foo@0

これで、プロジェクトは問題なくリンクされます。しかし、実行しようとすると、メッセージが表示されます

プロシージャエントリポイントFoo@0がダイナミックリンクライブラリsimple.dllに見つかりませんでした。」

したがって、lib.exeにFoo @ 0はFooのエイリアスであると伝えたとしても、名前で「Foo@0」を読み込もうとするインポートライブラリが作成されるようです。

「Foo@0」を要求したときに、インポートライブラリに「Foo」をロードさせる方法はありますか?

ありがとう、

デビッド

4

1 に答える 1

5

あなたはエイリアスを使おうとする正しい考えを持っていました...

「LIBはエイリアス形式を受け入れないようです(等号の後の部分を単に無視します)。2)DEFファイル__cdecl内のすべての関数を想定します。2番目のポイントは、LIBが生成するインポートライブラリがマップされるという事実にあります。 DLL内の各シンボルは、アンダースコアが前に付いた内部名になります。つまり、インポートライブラリを使用するリンカは、未定義のシンボル_FunctionをDLL内のシンボルFunctionに解決しようとします。__stdcall呼び出し規約を特別に処理する必要はありません。 LIBを使用して__stdcall関数のインポートライブラリを作成できるいくつかの手法がありますが、呼び出し元は名前ではなく通常の呼び出しでしか呼び出すことができませんでした。詳細は演習として残します:-)。(http://wyw.dcweb.cn/stdcall.htm

エイリアスを使用する代わりに、序数を使用します:(例を使用):

LIBRARY simple.dll 
EXPORTS
     Foo
     Foo@0    @2 ;(from your dumpbin)

私のために働いた:)

于 2010-03-30T18:22:26.020 に答える