Страница 1 из 2

C++ в Visual Studio 2008

Добавлено: Пн июл 12, 2010 02:23
VSB
Хочу написать WCX плагин на с++, IDE - MS VS 2008
Проблема: функции из плагина не вызываются вообще, даже GetPackerCaps()

Вот ткма на англ форуме
http://www.ghisler.ch/board/viewtopic.php?t=26840
Что делать?

Добавлено: Пн июл 12, 2010 07:28
MVV
Я скачал твои исходники, посмотрю, вчера не успел просто.


Короче, насколько я понял, при попытке тотала вызывать GetPackerCaps возникает какая-то ошибка, и он выгружает плагин, а в packer caps ставит 0. Осталось разобраться, почему. Я уже и переключать в Multi-Threaded Debug пробовал, все равно.

Кстати, GetPackerCaps тотал вызывает не при установке плагина, а при открытии диалога упаковки файлов.

Добавлено: Пн июл 12, 2010 09:25
MVV
Ага, у тебя в .def-файле не хватало CloseArchive. Как только я добавил ее, сразу все заработало.

Добавлено: Пн июл 12, 2010 10:56
VSB
Точно, спасибо!

Отписался подробнее в той теме

Добавлено: Пн июл 12, 2010 12:25
Моторокер
Список обязательный функций перечислен в writer's reference. Я тоже на чём-то подобном споткнулся, когда начинал писать:
http://www.motorocker.ru/wcx_writers_reference.htm
http://www.motorocker.ru/wcx.dpr.htm

Они должны быть обязательно, даже если не используются.

Добавлено: Пн июл 12, 2010 12:47
VSB
Всё равно не работает.
Может надо как то по особому экспортировать?

Добавлено: Пн июл 12, 2010 13:08
MVV
VSB писал(а):Всё равно не работает.
Может надо как то по особому экспортировать?
Я в теме на оффоруме написал, что у тебя еще не хватает функции ReadHeader.

Добавлено: Пн июл 12, 2010 13:17
VSB
MVV

Кстати, в гайде ошибка по поводу ReadHeaderEx
The following functions of the packer plugin interface support Unicode:

OpenArchiveW
ReadHeaderExW
ProcessFileW
SetChangeVolProcW
SetProcessDataProcW
PackFilesW
DeleteFilesW
StartMemPackW
CanYouHandleThisFileW

The following functions do not exist in a Unicode form and must be implemented as Ansi:

ReadHeader - use ReadHeaderEx
CloseArchive
GetPackerCaps
ConfigurePacker
PackToMem
DoneMemPack
PackSetDefaultParams
ReadHeaderEx

Добавлено: Пн июл 12, 2010 13:19
MVV
Да, действительно, недочетик. Отписался на оффоруме в теме про описания интерфейсов.

Добавлено: Пн июл 12, 2010 13:23
VSB
Кстати, почему обязателен экспорт через EXPORTS и никак через __declspec(dllexport) в декорированом виде?

Добавлено: Пн июл 12, 2010 13:25
VSB
И еще, хотелось бы в гайде видеть также порядок вызовов функций для разных сценариев

Добавлено: Пн июл 12, 2010 14:50
MVV
VSB писал(а):Кстати, почему обязателен экспорт через EXPORTS и никак через __declspec(dllexport) в декорированом виде?
Во-первых, у разных компиляторов декорирование различно - причем, оно может быть различным даже для разных версий одного компилятора - ГОСТа на декорирование не существует. :)
Во-вторых, неважно, какое имя, лишь бы оно было одинаковым для всех плагинов, чтобы можно было легко и быстро получить адрес функции, используя GetProcAddress.
В-третьих, куда приятнее видеть в списке экспортируемых функций читабельные имена, а не кракозябры.
В-четвертых, уже не один десяток лет такая схема используется в ТК.
А экспортировать вроде можно не только через .def-файл (была кажется и какая-то директива для экспорта функции с недекорированным именем).
VSB писал(а):И еще, хотелось бы в гайде видеть также порядок вызовов функций для разных сценариев
Что видеть в гайде - лучше пиши сразу Гислеру здесь. А вообще, есть же примеры плагинов с открытыми исходниками. Было бы желание разобраться в них.

Добавлено: Пн июл 12, 2010 16:14
VSB
Причем тут пример?
просто для отладки полезно знать в каком порядке TC будет вызывать функции

Добавлено: Пн июл 12, 2010 20:01
VSB
А есть ли для VC++ замена этого
http://docwiki.embarcadero.com/RADStudi ... n_Routines

Добавлено: Вт июл 13, 2010 02:17
VSB
Так, вроде нашел
http://msdn.microsoft.com/en-us/library ... S.85).aspx
Теперь осталось разобраться со статической линковкой msvcrt