Страница: 1 |
|
Вопрос: Плагин для Винамп на VB 6. Возможно ли?
|
Добавлено: 08.01.10 03:48
|
|
Автор вопроса: Avvelana
|
Привет всем. Такой вопрос (возможно глупый): В 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) то от запуска к запуску бывает что винамп не вылетает с
ошибкой.
Вот как-то так. :)
Похоже что-то не так со структурой или указателями...
Подскажите, может что и возможно сделать.
Спасибо!
Ответить
|
Номер ответа: 3 Автор ответа:
Avvelana
 
Вопросов: 2 Ответов: 18
|
Профиль | | #3
|
Добавлено: 08.01.10 08:27
|
Так, выяснилось что указатели на внутренние функции плагина (init, config, quit) так-же как и VarPtr(Plug) работают.
-
- Private Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long
-
- <<<<
- ...
- >>>>
-
- Function init() As Integer
- MessageBox Plug.hwndParent, CStr(Plug.hwndParent), "Test dll", MB_OK
- init = 0
- End Function
Выводится сообщение с hwnd окна винампа. То-есть винамп верно записывает данные.
Если в сообщении нажать ОК, винамп вылетает с ошибкой что память не может быть записана.
Я ничего не понимаю уже.
Ответить
|
Страница: 1 |
Поиск по форуму