Страница: 1 |
Вопрос: Плагин для Винамп на VB 6. Возможно ли? | Добавлено: 08.01.10 03:48 |
Автор вопроса: ![]() |
Привет всем. Такой вопрос (возможно глупый): В C++ есть такая структура данных:
typedef struct { int version; char *description; int (*init)(); void (*config)(); void (*quit)(); HWND hwndParent; HINSTANCE hDllInstance; } Есть ли и как должен выглядеть если есть её аналог на VB 6? В Си++ практически ничего не понимаю, по-этому предположил что возможно аналог может выглядеть вот так: Private Type Plugin version As Integer description As String inita As Long configa As Long quita As Long hwndParent As Long hDllInstance As Long End Type Сорри, если написал бред. Вообщем эта структура, которую нужно частично заполнить и передать винампу. int version; - Версия структуры (значение 0x10) char *description; - Описание плагина int (*init)(); - Указатель на функцию инициализации void (*config)(); - Указатель на функцию настройки void (*quit)(); - Указатель на функцию финализации HWND hwndParent; - Хэндл главного окна WinAmp Плагин винампа - простая динамическая dll, у которой есть экспортируемая функция winampGetGeneralPurposePlugin. Эта функция вызывается винампом при загрузке плагина, не принимает никаких аргументов а возвращает указатель на вышеописанную структуру. Для компилирования dll с экспортом функций я использую Addin "VB_DLL" для VisualBasic 6.0 (Автор: SCINER) Суть проблемы: Создаю экспортируемую функцию winampGetGeneralPurposePlugin в своей dll и заполняю тип Plugin. Function winampGetGeneralPurposePlugin() With Plug .version = 16 .description = "Test plugin" .inita = GetAddr(AddressOf init) .configa = GetAddr(AddressOf config) .quita = GetAddr(AddressOf quit) End With winampGetGeneralPurposePlugin = VarPtr(Plug) End Function Так как AddressOf можно использовать только в качестве аргумента функции и просто так юзаеться не хочет, прошлось добавить функцию для получения указателя на остальные функции плагина (init, config, quit): Function GetAddr(Fnc) As Long GetAddr = Fnc End Function Компилируем с экспортом функции, закидываем к плагинам винампа, запускаем винамп. Винамп загружает dll, и сразу вылетает с ошибкой, что память по адресу 8000 не может быть записана. (Винам должен заполнить части структуры - hwndParent и hDllInstance) Если убрать из кода winampGetGeneralPurposePlugin = VarPtr(Plug)
то винамп нормально запускается и загружает dll без проблем. С ошибкой не вылетает. Так-же, если указать случайное значение (от болды) вместо VarPtr(Plug) то от запуска к запуску бывает что винамп не вылетает с ошибкой. Вот как-то так. :) Похоже что-то не так со структурой или указателями... Подскажите, может что и возможно сделать. Спасибо! |
Ответы | Всего ответов: 6 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() Вопросов: 2 Ответов: 18 |
Профиль | Цитата | #1 | Добавлено: 08.01.10 03:50 |
Прошу прощения за ужасно оформленное сообщение, я даже сам не ожидал что так получится. |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() Вопросов: 2 Ответов: 18 |
Профиль | Цитата | #2 | Добавлено: 08.01.10 07:39 |
Похоже что функция winampGetGeneralPurposePlugin передаёт всё-таки винампу адрес. Меняя значения передаваемые функцией, можно видеть изменение адреса в который винамп пробует записать... |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() Вопросов: 2 Ответов: 18 |
Профиль | Цитата | #3 | Добавлено: 08.01.10 08:27 |
Так, выяснилось что указатели на внутренние функции плагина (init, config, quit) так-же как и VarPtr(Plug) работают.
Выводится сообщение с hwnd окна винампа. То-есть винамп верно записывает данные. Если в сообщении нажать ОК, винамп вылетает с ошибкой что память не может быть записана. Я ничего не понимаю уже. ![]() |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 87 Ответов: 2795 |
Web-сайт: Профиль | Цитата | #4 | Добавлено: 08.01.10 13:12 |
М. интересно. Продолжайте копать и рассказывайте ![]() |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ICQ: 300-70-6пятьЪ Вопросов: 62 Ответов: 545 |
Web-сайт: Профиль | Цитата | #5 | Добавлено: 08.01.10 13:28 |
товарищи научитесь юзать гугл, прогеру без этого никуда:
http://vbrussian.com/Article.asp?ID=89 http://www.winamp.com/plugin/winamp-vblink/24837 |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() Вопросов: 2 Ответов: 18 |
Профиль | Цитата | #6 | Добавлено: 08.01.10 13:40 |
Спасибо за ссылки, но я это уже читал. Там не то что нужно. Этому плагину нужен специальный класс, библиотека GenWrapper.tlb и тд. Не наши это методы. ![]() |
Страница: 1 |
|