Заставить указатель на функцию C работать с механикой вызова на основе стека в стиле C в C ++ - PullRequest
3 голосов
/ 24 мая 2011

Я хочу вызвать функцию чистого стиля C из библиотеки DLL в моей программе на C ++. Я попытался привести указатель на свою функцию, используя reinterpret_cast к __cdecl, и все же соглашение о вызовах _stdcall, похоже, сохраняется. Я новичок в программировании на Windows C ++.

Редактировать Код из комментария

reinterpret_cast< Error ( __cdecl*)(int,int)> (GetProcAddress(Mydll::GetInstance()->ReturnDLLInstance(), "add"))(1,10) 

мой звонок. Фактический синтаксис функции, кажется, был объявлен как

Error __cdecl add(int,int);

Отладчик выдает мне ошибку Ошибка проверки времени выполнения # 0 . Я работаю в Windows-C ++

Ответы [ 4 ]

8 голосов
/ 24 мая 2011

Я полагаю, что решение вашего вопроса 'extern "C" {...'

См. http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.3

6 голосов
/ 24 мая 2011

Обычно для этого нужно использовать extern "C" ...

--- c_code.h ---

void func(int arg);
void (*func_ptr)(int arg);

--- cpp_code.cpp ---

extern "C" void func(int arg);
extern "C" void (*func_ptr)(int arg);

int main()
{
    func(20);
    *func_ptr(20);
}
3 голосов
/ 24 мая 2011

Здесь работают две вещи.

Первая - соглашение о вызовах.Соглашение о вызовах является частью Application Binary Interface (ABI), который решает, ответственен ли вызывающий или вызываемый объект за очистку стека.Если вы хотите, чтобы ваши функции работали правильно, вам нужно использовать одно и то же соглашение о вызовах.В WIN32 API это обычно __stdcall, хотя C обычно использует __cdecl.

Другая проблема - искажение имени.Поскольку аргументы функции являются частью сигнатуры функции в C ++ (чтобы обеспечить перегрузку функции), эта информация включена в таблицу символов вашего объектного кода.Обычно это будет куча дополнительных странных персонажей.C не нужно выполнять манипулирование именами, поскольку он не допускает перегрузки функций.

Иногда в C ++ вы хотите вызывать функции C (т.е. символы функций C, скомпилированные C, а не компилятором C ++).В таком случае вам нужно определить функцию в блоке extern "C" {}.

Надеюсь, это поможет вам

0 голосов
/ 26 мая 2011
...