Как остановить отмену обработки экспортированной мной DLL-функции?
Я пытаюсь создать 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 по-прежнему экспортирует функцию с именем: "_GetName @0".
Что я делаю неправильно?
Ответы
Ответ 1
Небольшая коррекция - для разрешения разрешающего имени клиентом
extern "C"
должен быть как на стороне экспорта, так и при импорте.
extern "C" уменьшит имя proc до: "_GetName".
Более того, вы можете принудительно использовать любое имя с помощью раздела ЭКСПОРТ в файле .def
Ответ 2
Это нормально для экспорта DLL с помощью соглашения __stdcall
. @N
указывает количество байтов, которое функция принимает в своих аргументах - в вашем случае, ноль.
Обратите внимание, что страница MSDN при экспорте из DLL специально говорит "использовать соглашение о вызове __stdcall" при использовании "ключевого слова __declspec (dllexport ) в определении функции".
Ответ 3
правильный ответ следующий:
extern "C" int MyFunc(int param);
и
int MyFunc(int param);
- это два объявления, которые используют разные внутренние имена, сначала - в стиле C, второй - в стиле С++.
внутреннее именование, требуемое для инструментов сборки, чтобы определить, какие функции функции получают, какой тип возвращает и т.д., поскольку С++ сложнее (oop, перегруженные, виртуальные функции и т.д.) - он использует более сложное именование. вызывающее соглашение также влияет на именования c и С++.
оба эти стили именования применяются при использовании __declspec (dllexport) таким же образом.
если вы хотите опустить управление именами экспортируемой процедуры, добавьте файл определения модуля в свой проект, введите его (в этом случае вам не требуется declspec dllexport):
LIBRARY mylib
EXPORTS
MyFunc
это опускает явное украшение имен (примеры ниже).
_MyFunc (c style, __cdecl)
[email protected] (c style, __stdcall)
[email protected]@[email protected] (c++ style, __cdecl)
[email protected]@[email protected] (c++ style, __stdcall)
Ответ 4
Вы можете использовать переключатель компоновщика "-Wl,-kill-at", чтобы отключить управление именами.
Например, в Code:: Blocks в настройках пользовательского компоновщика добавьте:
-Wl, - убей-на
Ответ 5
__ Cdecl
http://msdn.microsoft.com/en-us/library/zkwh89ks(VS.71).aspx