Почему extern "C" все еще не может удалить искажение имени в следующем случае - PullRequest
4 голосов
/ 27 марта 2011
extern "C"
{
__declspec(dllexport) LRESULT CALLBACK MTest
}

Используя зависимости, я обнаружил, что есть еще искажение имен, даже используя extern "C".

Ответы [ 3 ]

7 голосов
/ 27 марта 2011

Единственный способ получить по-настоящему недекорированные имена с помощью __declspec (dllexport) - это экспортировать их с соглашением о вызовах __cdecl. CALLBACK становится __stdcall, который украшает "C" форму имени с начальным _ и завершающим @ байтами.

В противном случае вы можете использовать файл .DEF, что является болью. Другой особый способ MSVC - вставить директиву / EXPORT в объектный файл (или передать ее как явный параметр компоновщика)

#pragma comment(linker, "/EXPORT:ExportSymbol=DecoratedName");

Почему-то часть директивы = не указана в справке

4 голосов
/ 27 марта 2011

Это название украшения, а не калечат.Вы должны объявить недекорированное имя в файле DEF, и тогда вы получите поведение, которое вы ищете.

0 голосов
/ 27 марта 2011

Не будучи большим программистом на C ++, первая мысль, которая приходит мне в голову, это ... "вводит ли какой-нибудь из этих макросов LRESULT или CALLBACK стандартную конвенцию вызова?"Есть ли у искаженных имен @NUMBER_OF_BYTES_OF_PARAMATER_LIST или символы, изображающие фактические типы, добавленные к ним?

...