C/C ++ управляет экспортом определенным образом

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

[email protected]@[email protected]@Z

Есть ли способ сделать это?

0
nl ja de
Дайте ему имя, имеющее такое же количество символов, измените имя в конечном исполняемом файле DLL с помощью низкоуровневого редактора файлов. Я предлагаю XdrawGdiXstopX234XXZ . Затем просто измените X.
добавлено автор David Schwartz, источник
Дайте ему имя, имеющее такое же количество символов, измените имя в конечном исполняемом файле DLL с помощью низкоуровневого редактора файлов. Я предлагаю XdrawGdiXstopX234XXZ . Затем просто измените X.
добавлено автор David Schwartz, источник
Будьте осторожны - C ++ ABI не всегда соглашаются друг с другом, а имя символа - только один из способов, которым они не согласны.
добавлено автор Yakk - Adam Nevraumont, источник
Будьте осторожны - C ++ ABI не всегда соглашаются друг с другом, а имя символа - только один из способов, которым они не согласны.
добавлено автор Yakk - Adam Nevraumont, источник
В чем конкретно нуждается конкретный мотивирующий этот вопрос?
добавлено автор Basile Starynkevitch, источник
В чем конкретно нуждается конкретный мотивирующий этот вопрос?
добавлено автор Basile Starynkevitch, источник
Ах, умный, я попробую это :)
добавлено автор Eric Lindgren, источник
Ах, умный, я попробую это :)
добавлено автор Eric Lindgren, источник

3 ответы

Вы можете это сделать, но вам нужно написать файл DEF.

foo.h:

extern "C" declspec(dllexport) void foo(int);

foo.def:

EXPORTS
    [email protected]@[email protected]@Z=_foo

( _foo - экспортированное имя функции).

Не забудьте указать файл DEF при связывании DLL, конечно.

Подробнее см. документацию по файлам DEF .

2
добавлено
Как указано в URL-адресе, который вы указали ... «Существуют три способа экспорта определения, перечисленные в рекомендуемом порядке использования: ключевое слово __declspec (dllexport) в исходном коде. Оператор EXPORTS в файле .def. Спецификация An/EXPORT в команда LINK ". Файл DEF является только одним из доступных методов! И дополнительно, второй выбор!
добавлено автор mox, источник
Попробуйте включить его в кавычки, как в "? DrawGdi @ stop @ 234 @@ Z" = foo ?
добавлено автор Harry Johnston, источник
@mox: Да, но это просто экспорт символа. Согласно документу, файл DEF является единственным, который позволяет вам указать internalname , отличный от externalname .
добавлено автор rodrigo, источник
Я использую Visual Studio 2012, пытаюсь скомпилировать с помощью extern "C" declspec (dllexport) void foo (int); , но он не хочет работать, поэтому я изменил его на extern «C» void foo (int); и мои .def-файлы выглядят как EXPORTS? drawGdi @ stop @ 234 @@ Z = foo , однако экспорт становится ? drawGdi оставив отдых.
добавлено автор Eric Lindgren, источник

Не можете ли вы объявить свою функцию, например,

 class myclass;
 extern "C" void my_function(int,myclass&);

Затем он должен быть экспортирован как my_function (по крайней мере, в системах Posix, я думаю, что это то же самое в Windows, но я не знаю).

Если вы компилируете с помощью GCC, вы можете использовать этикетки Asm . Тогда любое имя, приемлемое для ассемблера, должно быть в порядке.

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

1
добавлено
когда я вижу std :: string в экспортируемой функции DLL, в моем представлении есть красный флаг : Danger! cf. этот вопрос: stackoverflow.com/questions/3564985/…
добавлено автор Stephane Rolland, источник
Этот std :: string & был только примером. Предложите любой другой C ++ (но не C) тип, который подходит для обсуждения ....
добавлено автор Basile Starynkevitch, источник
Чтобы угодить Стефану Ролланду, я сделал его myclass & ...
добавлено автор Basile Starynkevitch, источник
@EricLindgren: Windows не разрешает ? в именах файлов. Это не проблема C/C ++, а Windows.
добавлено автор Skalli, источник
Да, это тоже должно работать на Windows.
добавлено автор TheMathemagician, источник
Это должно быть именно имя, которое я написал, оно, похоже, не позволяет «@» и «?» во имя
добавлено автор Eric Lindgren, источник

Не можете ли вы объявить свою функцию, например,

 class myclass;
 extern "C" void my_function(int,myclass&);

Затем он должен быть экспортирован как my_function (по крайней мере, в системах Posix, я думаю, что это то же самое в Windows, но я не знаю).

Если вы компилируете с помощью GCC, вы можете использовать этикетки Asm . Тогда любое имя, приемлемое для ассемблера, должно быть в порядке.

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

1
добавлено
когда я вижу std :: string в экспортируемой функции DLL, в моем представлении есть красный флаг : Danger! cf. этот вопрос: stackoverflow.com/questions/3564985/…
добавлено автор Stephane Rolland, источник
Этот std :: string & был только примером. Предложите любой другой C ++ (но не C) тип, который подходит для обсуждения ....
добавлено автор Basile Starynkevitch, источник
Чтобы угодить Стефану Ролланду, я сделал его myclass & ...
добавлено автор Basile Starynkevitch, источник
@EricLindgren: Windows не разрешает ? в именах файлов. Это не проблема C/C ++, а Windows.
добавлено автор Skalli, источник
Да, это тоже должно работать на Windows.
добавлено автор TheMathemagician, источник
Это должно быть именно имя, которое я написал, оно, похоже, не позволяет «@» и «?» во имя
добавлено автор Eric Lindgren, источник
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

Про Windows
Про Windows
941 участник(ов)

Microsoft Windows и всё, что с этим связано. Список интересных групп и каналов: https://github.com/goq/telegram-list

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest