У меня есть DLL, написанная на C ++, и я хочу подавить искажение имени для нескольких экспортируемых методов. Эти методы являются глобальными и не являются членами какого-либо класса. Есть ли способ добиться этого?
Кстати: я использую VS2008.
У меня есть DLL, написанная на C ++, и я хочу подавить искажение имени для нескольких экспортируемых методов. Эти методы являются глобальными и не являются членами какого-либо класса. Есть ли способ добиться этого?
Кстати: я использую VS2008.
bradtgmurray прав, но для компиляторов Visual C ++ вам все равно нужно явно экспортировать свою функцию. Но использование файла .DEF, предложенного Сержем - appTranslator, - неправильный способ сделать это.
Использование инструкции declspec (dllexport / dllimport), которая работает как для кода C, так и для кода C ++, независимо от того, декорирована она или нет (тогда как .DEF ограничен C, если вы не хотите украсить свой код вручную).
Итак, правильный способ экспорта недекорированных функций в Visual C ++ - это комбинировать идиому экспорта C, как отвечает bradtgmurray, и ключевое слово dllimport / dllexport.
В качестве примера я создал на Visual C ++ пустой проект DLL и написал две функции: одну назвали CPP, потому что она была оформлена, а другую - C, потому что это не так. Код такой:
// Exported header
#ifdef MY_DLL_EXPORTS
#define MY_DLL_API __declspec(dllexport)
#else
#define MY_DLL_API __declspec(dllimport)
#endif
// Decorated function export : ?myCppFunction@@YAHF@Z
MY_DLL_API int myCppFunction(short v) ;
// Undecorated function export : myCFunction
extern "C"
{
MY_DLL_API int myCFunction(short v) ;
} ;
Думаю, вы уже знаете, но для полноты картины макрос MY_DLL_API должен быть определен в make-файле DLL (то есть VCPROJ), но не пользователями DLL.
Код на C ++ легко написать, но для полноты картины я напишу его ниже:
// Decorated function code
MY_DLL_API int myCppFunction(short v)
{
return 42 * v ;
}
extern "C"
{
// Undecorated function code
MY_DLL_API int myCFunction(short v)
{
return 42 * v ;
}
} ;
Заключите определения функций в extern "C" {}
extern "C" {
void foo() {}
}
См. http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html
Вы можете избежать всех манипуляций (C ++, cdecl, stdcall, ...) для экспортируемых функций, используя файл .def с разделом EXPORTS. Просто создайте файл MyDll.def и добавьте его в свой проект:
LIBRARY "MyDLL"
EXPORTS
Foo
Bar
На самом деле, скорее всего, мастер уже создал для вас файл def. Вам достаточно заполнить раздел ЭКСПОРТ.