Получить искаженное имя функции из C ++ DLL - PullRequest
1 голос
/ 01 июля 2011

У меня есть функция, объявленная как __declspec(dllexport) void TakeInput();

DLL, имеющая эту функцию, экспортируется в C #. Я получаю ошибку при выполнении вызова функции для этой функции, поскольку точка входа не найдена в коде c #.

Поиск в Google показывает, что проблема с правильной точкой входа не указана. Мне нужно будет указать искаженное имя для этой функции.

Итак, я хотел бы знать, как я могу получить искаженное имя этой функции?

Ответы [ 3 ]

4 голосов
/ 01 июля 2011

, чтобы избежать искажения имени, используйте extern "C"

extern "C" __declspec(dllexport) void TakeInput();

Подробнее: Использование extern для указания связи

0 голосов
/ 01 июля 2011

Вместо того, чтобы пытаться вычислить искаженное имя, я предлагаю просто экспортировать искаженное имя. Для этого нужно сделать две вещи:

  1. Отключить искажение имени в C ++ с помощью связи C для вашей функции. Это можно сделать с помощью extern "C".

  2. Убедитесь, что ваша функция использует соглашение о вызове C. Это значение по умолчанию (по крайней мере, в Microsoft Visual Studio), но его можно изменить, используя /Gr (который включает __fastcall соглашение о вызовах) и /Gz (который переключает __stdcall соглашение о вызовах) переключатели командной строки. Вы можете применить соглашение о вызовах C, используя __cdecl, например:

Итак, чтобы ваша функция экспортировалась как TakeInput, используйте:

extern "C" __declspec(dllexport) void __cdecl TakeInput();
0 голосов
/ 01 июля 2011

Вы можете использовать DependancyWalker (http://www.dependencywalker.com) или другой инструмент, который отображает экспорт DLL, чтобы получить искаженное имя, если вы действительно этого хотите, но лучше всего делать то, что предложил Армен.

...