Экспортирование функций под Visual C++

Место, где разработчики плагинов могут поделиться своим опытом.
Post Reply
Shmuel
Posts: 6068
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 301 times

Экспортирование функций под Visual C++

Post by Shmuel »

До сих пор обходился GCC, сейчас пробую Visual C++.
GCC позволяет передать линкеру -Wl,--kill-at , при этом __stdcall функции будут экспортироваться под своими нормальными именами, как в исходниках. Для VC++ что-то не получается найти такой способ, функции экспортируются наподобие _OpenW@4.
Знаю, что это лечится def-файлом, но вопрос: есть ли способ обойтись без def-файла?

User avatar
HaRT
Moderator
Posts: 9336
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 100 times
Been thanked: 213 times

Экспортирование функций под Visual C++

Post by HaRT »

Shmuel wrote:
Thu 19 Mar, 2020 20:59
есть ли способ обойтись без def-файла?
А они обрамлены в extern "C" { /* your functions here */ }?
Last edited by HaRT on Thu 19 Mar, 2020 21:51, edited 1 time in total.
Фар есть инструмент, а не нянька. © 2009 DrKnS

User avatar
DrKnS
Posts: 5571
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 7 times
Been thanked: 291 times

Экспортирование функций под Visual C++

Post by DrKnS »

/EXPORT (передать линкеру или прагмой прямо в коде).

Shmuel
Posts: 6068
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 301 times

Экспортирование функций под Visual C++

Post by Shmuel »

HaRT, да, обрамлены.

DrKnS, для каждой экспортируемой функции? Если да, то может есть у вас какой-то (препроцессорный) макрос, чтобы меньше засорять код?

User avatar
DrKnS
Posts: 5571
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 7 times
Been thanked: 291 times

Экспортирование функций под Visual C++

Post by DrKnS »

#define EXPORT_THIS __pragma(comment(linker, "/EXPORT:" __FUNCTION__ "=" __FUNCDNAME__))

Shmuel
Posts: 6068
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 301 times

Экспортирование функций под Visual C++

Post by Shmuel »

DrKnS, спасибо, оно сработало: проверил на одной функции, поставил макрос после открывающей скобки { - это правильно?
И также нежелательный момент - функция была экспортирована дважды: как в оригинальном виде, так и как _funcname@4.

User avatar
DrKnS
Posts: 5571
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 7 times
Been thanked: 291 times

Экспортирование функций под Visual C++

Post by DrKnS »

Shmuel wrote:
Thu 19 Mar, 2020 23:04
после открывающей скобки { - это правильно?
Да.
функция была экспортирована дважды
Сейчас проверил (dumpbin /exports <dll name>) - у меня один раз.

Shmuel
Posts: 6068
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 301 times

Экспортирование функций под Visual C++

Post by Shmuel »

DrKnS wrote:
Thu 19 Mar, 2020 23:11
Сейчас проверил (dumpbin /exports <dll name>) - у меня один раз.
Сделал то же самое - экспортируется дважды. Может потому, что в режиме DEBUG, а в RELEASE по-другому?

Shmuel
Posts: 6068
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 301 times

Экспортирование функций под Visual C++

Post by Shmuel »

Или может быть надо в этом случае убрать __declspec(dllexport) ?

User avatar
DrKnS
Posts: 5571
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 7 times
Been thanked: 291 times

Экспортирование функций под Visual C++

Post by DrKnS »

Дважды - это в смысле 2 строки в выводе dumpbin или что-то типа func = @blablabla(_func@4)?

Shmuel
Posts: 6068
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 301 times

Экспортирование функций под Visual C++

Post by Shmuel »

Code: Select all

          1    0 000C3BCA IcpStartApplication = @ILT+11205(_IcpStartApplication@4)
        <пропущено>
        257  100 000C3BCA _IcpStartApplication@4 = @ILT+11205(_IcpStartApplication@4)

User avatar
DrKnS
Posts: 5571
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 7 times
Been thanked: 291 times

Экспортирование функций под Visual C++

Post by DrKnS »

test.zip
(38.62 KiB) Downloaded 12 times

User avatar
DrKnS
Posts: 5571
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 7 times
Been thanked: 291 times

Экспортирование функций под Visual C++

Post by DrKnS »

Может у вас там где-то выше по тексту (или в другом файле) декларация с __declspec(dllexport) осталась?

Shmuel
Posts: 6068
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 301 times

Экспортирование функций под Visual C++

Post by Shmuel »

1. Ваш тестовый комплект у меня сработал правильно - с одним экспортом. Так что дальше - дело техники.
2. __declspec(dllexport) вроде убрал, но не помогло. Завтра разберусь.
Спасибо!

Post Reply

Return to “Разработка плагинов”