从使用stdcall的DLL创建一个MSVC导入库

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文件开始:

我从以下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

现在项目链接没有任何问题。然而,当我尝试运行它时,我收到了以下信息:“在simple.dll动态链接库中找不到Foo@0过程入口点”。因此,即使我告诉lib.exe Foo@0是Foo的别名,它仍然创建一个导入库,试图按名称加载“Foo@0”。有没有办法在要求“Foo@0”时让导入库加载“Foo”呢?谢谢,David
1个回答

5

你尝试使用别名是正确的想法...

"看起来LIB不接受别名形式(它将简单地忽略等号后面的部分);2)它假定DEF文件中的所有函数都是__cdecl。第二点在于,它生成的导入库将把DLL中的每个符号映射到一个带有下划线前缀的内部名称,即,使用导入库的链接器将尝试将未定义的符号_Function解析为DLL中的符号Function。它没有特别关注__stdcall调用约定。通过一些技巧,我们可以使用LIB为__stdcall函数生成导入库,但调用者只能按序号而非按名称调用它们。细节留给读者自行思考 :-)." (http://wyw.dcweb.cn/stdcall.htm)

不要使用别名,而应该使用序号(使用您的示例):

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

对我很有用 :)

2
非常好用!正是我所需要的。微软让创建导入库变得如此困难,这真是太棒了。谢谢!! - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接