即使在使用extern“C”后,如何解决名称损坏问题?

时间:2014-02-11 06:58:06

标签: c++ c dll name-mangling borland-c++

为了避免名称重写C ++代码的问题,我在头文件中使用了extern“C”。但是,当我使用Borland C ++ IDE 构建我的dll文件时,问题仍然存在“”。

以下是我的示例代码。

Others.h文件

#define H_EXPORT WINAPI  

  #ifdef __cplusplus

  extern "C" {

  #endif

  long H_EXPORT RegOpenKeyEx32( DWORD hKey,LPCSTR lpSubKey,DWORD ulOptions,REGSAM   samDesired,DWORD FAR *phkResult);

  #ifdef __cplusplus

  }

  #endif

Others.cpp文件

  #define C_EXPORT WINAPI _export
  //The function has been define like this

  long C_EXPORT RegOpenKeyEx32( HKEY      hKey,
                              LPCSTR     lpSubKey,
                              DWORD      ulOptions,
                              REGSAM     samDesired,
                              PHKEY      phkResult)
  {

   //some code
  }

def文件中为该函数指定的序数值是

RegOpenKeyEx32 @ 243

但是,在构建dll后,我使用Dll Export Viewer暴露了dll,它的序号值更改为85,函数名称更改为 @ RegOpenKeyEx32 $ qqsp6HKEY__pxcululpp6HKEY __ ,函数被修改为 p>

enter image description here

在同一个文件中,其他.cpp只有一些函数名称(5个函数名称)被破坏,其余的函数名称相同(没有得到名称损坏)。我不明白这是什么问题?

知道问题是什么,请回复......

2 个答案:

答案 0 :(得分:1)

您必须使用extern "C"作为声明和定义。

您可以修改Others.cpp文件,如下所示

#define C_EXPORT WINAPI _export

#ifdef __cplusplus
extern "C" {
#endif
long C_EXPORT RegOpenKeyEx32(HKEY    hKey,
                             LPCSTR  lpSubKey,
                             DWORD   ulOptions,
                             REGSAM  samDesired,
                             PHKEY   phkResult)
{
    //some code
}
#ifdef __cplusplus
} // extern "C"
#endif

答案 1 :(得分:1)

对于由borland构建的不太复杂的DLL,这对我有用:

#define FX_ENTRY extern "C" __declspec(dllexport)
#define FX_CALL  __stdcall

FX_ENTRY void FX_CALL exported_function1()
 {
 // do something
 };

FX_ENTRY void FX_CALL exported_function2()
 {
 // do something
 };
  • 以及我使用的BDS2006虽然陈旧但无论如何
  • 我无法绕过这个更复杂的DLL(超过50个函数)。
  • 即使可以导入正确并非所有功能的名称
  • 也不是静态导入,也不是动态(通过winapi)。
  • 同样适用于 PE解码/编码实用程序
  • 重命名的DLL函数 inplace
  • 需要@里面的功能名称!模拟一些古老的修剪风格
  • 通常来自100的2-10个函数是不可链接的
  • 如果使用DLL的App是由MSVC ++或borland构建的,则
  • 无关紧要。
  • 唯一的解决方案是def文件,但我不确定如何(如果可能的话)在Borland编译器上使用def文件进行dll创建
  • 在MSVC ++上很容易