0

例如,如果我有一个导出符号 __ugly_name 的 libtest.dll 文件,我想在源文件和 lib 文件中使用 pretty_name,我可以这样做

    D:\var\tmp\build>type t-dll.c

      main() { pretty_name(); }

    D:\var\tmp\build>type libtest.def

      EXPORTS
        pretty_name == __ugly_name

    D:\var\tmp\build>dlltool -k -m i386 --input-def libtest.def  --dllname libtest.dll --output-lib libtest.dll.a

    D:\var\tmp\build>gcc -o t-dll.exe t-dll.c -L. -ltest

    The result t-dll.exe  reference symbol '__ugly_name' in libtest.dll file.
    VERY GOOD !

But for MS lib.exe, 'pretty_name=__ugly_name' does not do the trick:

D:\var\tmp\build>type libtest.def

  EXPORTS
    pretty_name=__ugly_name

D:\var\tmp\build>cl /nologo /MD /Fet-dll-vc.exe t-dll.c libtest.lib

t-dll-vc.exe still reference non-exist symbol 'pretty_name' in libtest.dll file.

可悲的是。MS lib.exe 是否支持 DLL 符号重定向?谢谢。

4

1 回答 1

0

看起来您的“丑陋”名称被修饰为 stdcall 函数,该函数获取双下划线前缀和 @nn 后缀,其中 nn 是函数调用使用的堆栈字节数。您可以通过在 .def 文件中声明未修饰的名称来重命名它们。因此,如果您的代码当前生成__MyApiFunc@4如下所示创建一个 .def 文件,并使用 link.exe -lib 选项或使用 -link 标志后面的编译器将其包含在内cl ...c_flags... -link -dll -lib:myapi.def ...linkflags...

LIBRARY yourlibname
EXPORTS
    MyApiFunc

基本上,您不需要等号来导出未修饰的名称。您需要对大多数 DLL 执行此操作,因为通常的 Windows 约定是具有未修饰名称的 stdcall 函数。一旦有了这样的 DLL,您就可以从 Visual Basic 和 .Net 中使用,就像普通的 Windows 操作系统提供的 DLL 一样。(假设你确实有 stdcall 函数)。

于 2013-05-24T06:51:41.603 回答