注意:首先,我正在使用Visual Studio 2010。

通常我需要具有一些导出功能的dll,我需要从外部应用程序使用。

通常这就是我的dll标头的样子...

#define DLLAPI extern "C" __declspec(dllexport)

DLLAPI BOOL WINAPI FUNCTION1(...);
DLLAPI BOOL WINAPI FUNCTION2(...);


我没有在项目中添加任何命令,也没有添加任何命令,我要做的就是将它们导出到头文件中,并将DLLAPI添加到源文件ofc中的函数中。

现在,当我需要从外部应用程序获取函数名称时,这使我感到麻烦,因为它总是像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证明)。如果有问题,它还会包含带有以下内容的.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)\Include\Win;$(PellesCDir)\Include#
LIB = $(PellesCDir)\Lib\Win;$(PellesCDir)\Lib#

.SILENT:

#
# Build hook.dll.
#
hook.dll: \
    output\DLL.obj \
    EXPORTS.DEF
    $(LINK) $(LINKFLAGS) -out:"$@" $**

#
# Build DLL.obj.
#
output\DLL.obj: \
    DLL.C
    $(CC) $(CCFLAGS) "$!" -Fo"$@"

.EXCLUDEDFILES:


我不知道我该如何在VS 2010项目中模拟这一点,因此在我构建dll函数名称时既简单又精确?

最佳答案

如上所示,仅使用两个函数创建DEF文件,然后进入链接选项并指定使用此def文件。

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


  / DEF选项传递一个
  模块定义文件(.def)
  链接器。只能有一个.def文件
  指定为LINK。有关详细信息
  .def文件,请参阅模块定义
  文件。要在以下位置设置此链接器选项
  Visual Studio开发
  环境
  
  
  打开项目的“属性页”对话框。有关详细信息,请参见
  设置Visual C ++项目属性。
  单击链接器文件夹。
  单击输入属性页面。
  修改模块定义文件属性。
  
  
  要从内部指定.def文件
  开发环境,你应该
  将其与其他项目一起添加到项目中
  文件,然后将文件指定给
  / DEF选项。

关于c++ - 如何从内置的DLL中获取清晰的-export函数名称?我总是得到原名+胡言乱语,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6396474/

10-14 11:30
查看更多