如何从构建的DLL中获得清晰的导出函数名?我总是听到原创的名字+胡言乱语

How can i get clear -export function names from built DLL? I always get originalname+gibberish

本文关键字:原创 胡言乱语 DLL 构建 清晰 函数      更新时间:2023-10-16

注意:首先,我使用的是visualstudio 2010。

通常我需要一些导出函数的dll,我需要从外部应用程序使用。。

通常这就是我的dll头的样子。。。

#define DLLAPI extern "C" __declspec(dllexport)
DLLAPI BOOL WINAPI FUNCTION1(...);
DLLAPI BOOL WINAPI FUNCTION2(...);

我不向项目或任何东西添加任何命令,我所做的只是在头文件中导出它们+向源文件ofc中的函数添加DLLAPI。

现在,当我需要从外部应用程序中获取函数名称时,这会给我带来问题,因为它总是像FUNCTION1xa1@assu79sax_或者类似的东西。。。

我看到一个项目,它使用.DEF文件,并使其标题像。。。

// INCLUDE FILE generated by "Pelles C for Windows, version 3.00".
#ifndef _HOOK_H
#define _HOOK_H
#ifdef _HOOK_
#define HOOKAPI  __declspec(dllexport)
#else
#define HOOKAPI  __declspec(dllimport)
#endif /* _HOOK_ */
#ifndef WINAPI
#define WINAPI  __stdcall
#endif
HOOKAPI int WINAPI SampleFunction(int, int);
#endif /* _HOOK_H */

它的.def文件看起来像。。。

EXPORTS
    SetValuesCBT
    SetValuesKey
    SetValuesMouse
    MouseProc
    KeyProc
    CBTProc
SECTIONS
    .shared READ WRITE SHARED

这会导致导出非常清晰的函数名,也就是它们被调用时的名称(正如dumpbin.exe所证明的)btw。如果重要的话,它还有带有以下内容的.pjj文件。。。

# 
# PROJECT FILE generated by "Pelles C for Windows, version 5.00".
# WARNING! DO NOT EDIT THIS FILE.
# 
POC_PROJECT_VERSION = 5.00.1#
POC_PROJECT_TYPE = 1#
POC_PROJECT_ARGUMENTS = #
CC = pocc.exe#
AS = #
RC = porc.exe#
LINK = polink.exe#
SIGN = posign.exe#
CCFLAGS = -Tx86-coff -Ot -W1 -Ze -Gz#
ASFLAGS = -c -nologo -coff -W1 -Cu#
RCFLAGS = -r#
LINKFLAGS = -machine:ix86 -subsystem:windows kernel32.lib user32.lib gdi32.lib comctl32.lib comdlg32.lib advapi32.lib delayimp.lib -dll#
WizCreator = Pelle Orinius#
SIGNFLAGS = -location:CU -store:MY -timeurl:http://timestamp.verisign.com/scripts/timstamp.dll -errkill#
INCLUDE = $(PellesCDir)IncludeWin;$(PellesCDir)Include#
LIB = $(PellesCDir)LibWin;$(PellesCDir)Lib#
.SILENT:
# 
# Build hook.dll.
# 
hook.dll: 
    outputDLL.obj 
    EXPORTS.DEF
    $(LINK) $(LINKFLAGS) -out:"$@" $**
# 
# Build DLL.obj.
# 
outputDLL.obj: 
    DLL.C
    $(CC) $(CCFLAGS) "$!" -Fo"$@"
.EXCLUDEDFILES:

我不知道我应该如何在我的VS2010项目中模仿这一点,所以当我构建dll函数时,名称是简单而精确的?

只需使用上面显示的两个函数创建DEF文件,然后进入链接选项并指定使用此DEF文件。

发件人http://msdn.microsoft.com/en-us/library/34c30xs1%28v=vs.80%29.aspx

/DEF选项通过模块定义文件(.def)连接器只能有一个.def文件指定为LINK。有关的详细信息.def文件,请参阅模块定义文件。在中设置此链接器选项Visual Studio开发环境

  1. 打开项目的"属性页"对话框。有关详细信息,请参阅正在设置Visual C++项目属性
  2. 单击Linker文件夹
  3. 单击"输入"属性页
  4. 修改"模块定义文件"属性

要从开发环境,您应该将它与其他文件,然后将该文件指定为/DEF选项。