代码之家  ›  专栏  ›  技术社区  ›  Slapout

如何停止DLL导出函数的名称管理?

  •  28
  • Slapout  · 技术社区  · 15 年前

    我正在尝试创建一个DLL,它导出一个名为“getname”的函数。我希望其他代码能够调用这个函数而不必知道损坏的函数名。

    我的头文件如下:

    #ifdef __cplusplus
    #define EXPORT extern "C" __declspec (dllexport)
    #else
    #define EXPORT __declspec (dllexport)
    #endif
    
    EXPORT TCHAR * CALLBACK GetName();
    

    我的代码如下:

    #include <windows.h>
    #include "PluginOne.h"
    
    int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
    {
         return TRUE ;
    }
    
    EXPORT TCHAR * CALLBACK GetName()
    {
        return TEXT("Test Name");
    }
    

    当我构建时,dll仍然导出名为“u getname@0”的函数。

    我做错什么了?

    4 回复  |  直到 10 年前
        1
  •  23
  •   Dewfy    15 年前

    小校正-用于通过clinet成功解析名称

    extern "C"
    

    必须和进口一样在出口方面。

    extern“c”将proc的名称减少为:“u getname”。

    在.def文件的导出部分的帮助下,您可以强制使用任何名称。

        2
  •  9
  •   Mark Rushakoff    15 年前

    这对于使用 __stdcall 公约。这个 @N indicates the number of bytes that the function takes in its arguments --在你的例子中,零。

    注意 the MSDN page on Exporting from a DLL 具体来说,在函数定义中使用关键字declspec(dllexport)时,要“使用”stdcall调用约定。

        3
  •  5
  •   sn0w    12 年前

    正确答案如下:

    extern "C" int MyFunc(int param);
    

    int MyFunc(int param);
    

    两个声明使用不同的内部命名,第一个是C样式,第二个是C++风格。

    生成工具需要内部命名来确定哪些参数函数接收、什么类型返回等等,因为C++更复杂(OOP、重载、虚拟函数等)-它使用更复杂的命名。调用约定也会影响C和C++的命名。

    当以相同的方式使用uu declspec(dllexport)时,这两种类型的命名都会被应用。

    如果要忽略导出例程的名称管理,请将模块定义文件添加到项目中,然后键入该文件(在这种情况下,不需要declspec dllexport):

    LIBRARY mylib
    EXPORTS
      MyFunc
    

    这将省略显式名称装饰(示例如下)。

    _MyFunc (c style, __cdecl)
    _MyFunc@4 (c style, __stdcall)
    ?MyFunc@@YAHH@Z (c++ style, __cdecl)
    ?MyFunc@@YGHH@Z (c++ style, __stdcall)
    
        4
  •  1
  •   vga None    11 年前

    您可以使用“-wl,-kill at”链接器开关禁用名称管理。

    例如,在代码::块中,在自定义链接器设置中,添加: - WL,杀死

    推荐文章