Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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) то от запуска к запуску бывает что винамп не вылетает с

ошибкой.

Вот как-то так. :)

Похоже что-то не так со структурой или указателями...
Подскажите, может что и возможно сделать.

Спасибо!

Ответить

  Ответы Всего ответов: 6  

Номер ответа: 1
Автор ответа:
 Avvelana



Вопросов: 2
Ответов: 18
 Профиль | | #1 Добавлено: 08.01.10 03:50
Прошу прощения за ужасно оформленное сообщение, я даже сам не ожидал что так получится.

Ответить

Номер ответа: 2
Автор ответа:
 Avvelana



Вопросов: 2
Ответов: 18
 Профиль | | #2 Добавлено: 08.01.10 07:39
Похоже что функция winampGetGeneralPurposePlugin передаёт всё-таки винампу адрес. Меняя значения передаваемые функцией, можно видеть изменение адреса в который винамп пробует записать...

Ответить

Номер ответа: 3
Автор ответа:
 Avvelana



Вопросов: 2
Ответов: 18
 Профиль | | #3 Добавлено: 08.01.10 08:27
Так, выяснилось что указатели на внутренние функции плагина (init, config, quit) так-же как и VarPtr(Plug) работают.
  1.  
  2. 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
  3.  
  4. <<<<
  5. ...
  6. >>>>
  7.  
  8. Function init() As Integer
  9. MessageBox Plug.hwndParent, CStr(Plug.hwndParent), "Test dll", MB_OK
  10. init = 0
  11. End Function



Выводится сообщение с hwnd окна винампа. То-есть винамп верно записывает данные.
Если в сообщении нажать ОК, винамп вылетает с ошибкой что память не может быть записана.

Я ничего не понимаю уже. :)

Ответить

Номер ответа: 4
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #4
Добавлено: 08.01.10 13:12
М. интересно. Продолжайте копать и рассказывайте :-D

Ответить

Номер ответа: 5
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #5
Добавлено: 08.01.10 13:28
товарищи научитесь юзать гугл, прогеру без этого никуда:
http://vbrussian.com/Article.asp?ID=89
http://www.winamp.com/plugin/winamp-vblink/24837

Ответить

Номер ответа: 6
Автор ответа:
 Avvelana



Вопросов: 2
Ответов: 18
 Профиль | | #6 Добавлено: 08.01.10 13:40
Спасибо за ссылки, но я это уже читал. Там не то что нужно. Этому плагину нужен специальный класс, библиотека GenWrapper.tlb и тд. Не наши это методы. :) Хочется сделать полноценный плагин без всяких .tlb.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам