2014-01-04 4 views
5

Возможно ли вызвать функцию в C++ DLL из кода C? Функция не объявлена ​​extern "C". Уродливая зависящая от платформы взлома, которая работает только с Visual Studio, прекрасна.Вызов функции C++ из C без использования extern «C»

Вызывающие соглашения не должны быть серьезной проблемой, но как я могу справиться с изменением имени.? Например, с помощью Visual Studio функция C++ с подписью void f() имеет искаженное имя [email protected]@YAXXZ и это не является юридическим идентификатором C.

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

+0

«Уродливая зависящая от платформы взлома, которая работает только с Visual Studio, прекрасна». Нет, это не так ( –

ответ

3

Для заставить ваш компилятор статически связывать функцию с другим экспортированным именем, может оказаться сложным. Но вы всегда можете загрузить DLL с помощью LoadLibrary, а затем использовать GetProcAddress.

+0

Это работает! Спасибо! – user763305

1

Я не вижу никакого чистого решения, кроме создания дополнительной dll, написанной на C++, и отображения всех интерфейсов через extern «C».

7

Включите функцию отклонения в другую функцию C++ и объявите ее с помощью extern "C". Не нужно создавать для него специальную DLL, просто включите в свой проект один файл C++.

+0

При работе с GetProcAddress это правильное решение. адаптироваться к изменениям в вызывающем соглашении DLL (в случае, когда создатель когда-либо меняет его), а также не полагается на жестко закодированные ручные имена. Просьба сделать это так. – Speed8ump

2

Вы можете исследовать

LoadLibrary("path to dll"); 

загрузить DLL и

GetProcAddress("[email protected]@YAXXZ"); 

, чтобы захватить указатель на функцию извне заявленной функции.

0

Вы можете скомпилировать свой C-код с использованием того же C++-компилятора, который они использовали, тогда ваши C-функции будут искажены с использованием того же механизма, и все будет легко связываться, и никто не заметит никакой разницы.

Если вы должны использовать другой компилятор, вам придется вручную загрузить DLL с помощью LoadLibrary и каждой функции с помощью GetProcAddress.

+1

Мне нужно скомпилировать код C, используя Visual Studio C, и он не управляет именами так же, как компилятор Visual Studio C++. – user763305

+0

@ user763305 есть еще компилятор VS C? Я думал, что они использовали один и тот же код для всех кодов C и C++ в настоящее время с другим флаг (скомпилировать как код C или C++ [/ Tc или /Tp](http://msdn.microsoft.com/en-us/library/032xwy55.aspx)) – gbjbaanb

+0

Вы переносите ht будет правильным, но в любом случае мне нужно скомпилировать с/Tc, а имя mangling отличается с/Tc и/Tp. – user763305

Смежные вопросы