2014-02-11 1 views
1

Чтобы избежать проблемы с кодовым именем кода C++, я использовал extern «C» в своем файле заголовка. Но проблема по-прежнему сохраняется «, когда я строю свой DLL-файл с использованием Borland C++ IDE».Как устранить проблему, возникшую при смене имени даже после использования extern «C»?

Ниже приведен пример кода.

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 
    } 

порядковое значение, заданное для этой функции в четкости файла

RegOpenKeyEx32 @ 243

но, после создания dll я выставил dll с помощью Dll Export Viewer, это порядковое значение изменяется на 85 и имя функции изменено на @ RegOpenKeyEx32 $ qqsp6HKEY__pxcululpp6HKEY__ и функции подогнаны как этот

enter image description here

В том же файле, т.е., others.cpp только некоторые имена функций (5 имен функций) получить Игнорируемые, оставшиеся имена функций одинаковы (не получить имя, искаженное). Я не понял, в чем проблема?

Любая идея, что проблема пожалуйста ответ ...

+0

ли другие.cpp включают others.h? –

+0

@MarcGlisse да это другие.h include in others.cpp – 4ever

+3

У вас нет экстерна «C» вокруг определения функции в others.cpp – cup

ответ

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

Для менее сложных библиотек 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).
  • То же самое относится и к DLL функции INPLACE переименованием по PE расшифровывать/шифровать утилита
  • нужно @ внутри имени функции !!! для моделирования какого-то древнего стиля магии
  • обычно 2-10 функций из 100 несвязываемы
  • не имеет значения, если приложение, использующее DLL, создается MSVC++ или borland.
  • Единственное решения Защиты файл, но я не уверен, как (если вообще возможно) использовать Защиту файл для создания длл на Borland компиляторов
  • на MSVC++ достаточно легко
Смежные вопросы