Подтвердить что ты не робот

Как остановить отмену обработки экспортированной мной 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".

Что я делаю неправильно?

4b9b3361

Ответ 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, - убей-на