Plugin к winamp'у
От: Evgi1980  
Дата: 08.01.07 07:31
Оценка:
Имеются 2 проекта, создающих один и тот же плагин (general) к винампу gen_tray.dll
При этом gen_tray.dll, получаемая проектом из gen_tray_1.rar — рабочая, т.е. ее можно увидеть запустив винамп, зайдя в Options/Plug-ins/General Purpose.
А gen_tray.dll, получаемая проектом из gen_tray_2.rar — не рабочая, ее не видно из винампа, хотя проекты ничем друг от друга не отличаются (один код, да и настройки проекта вроде одни и те же).
Помогите, пожалуйста, разобраться в чем причина.

http://www.rsdn.ru:80/File/62366/Projects.rar
Re: Plugin к winamp'у
От: Evgi1980  
Дата: 08.01.07 09:49
Оценка:
Если сменить расширение .cpp файлов второго проекта на .с и собрать dll, то winamp начинает ее видеть.
Почему?
Re[2]: Plugin к winamp'у
От: LeonCrew Беларусь  
Дата: 08.01.07 19:38
Оценка:
Здравствуйте, Evgi1980, Вы писали:

E>Если сменить расширение .cpp файлов второго проекта на .с и собрать dll, то winamp начинает ее видеть.

E>Почему?

Проект не смотрел, но скорее всего это поведение компилятора в названиях функций.

Дело в том, что в стандарте С внешяя функция не меняет своего названия (как она была задана в С, так и будет отображена в DLL, если явно не указать инное). Внутренняя функция в С имеет такоеже название, но впереди стоит символ подчеркивания.

В С++ немного инной подход. По умолчанию компилятор "уродует" название функции "дописывая" название спецсимволами означающее размер аргументов, вид вызова и т.д.

Из чего следует, что в С проекте явно не указано как транслировать название функции в DLL и при смене расширения на cpp имя "уродуется". Чтобы этого избежать, следует определить функцию так:

extern "C" тип_возврата название_функции(аргументы);

В MSVC рекомендованно:

extern "C" тип_возврата __declspec(dllexport) __stdcall название_функции(аргументы);
Re[3]: Plugin к winamp'у
От: Evgi1980  
Дата: 08.01.07 21:18
Оценка:
Здравствуйте, LeonCrew.
Спасибо, все заработало.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.