Вопрос по плагинам

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Вопрос по плагинам

Сообщение Lumen » 23.09.2006 (Сб) 13:36

Всем привет!
Давненько меня здесь не было...
Вопрос собственно такой: делаю в программе поддержку плагинов.
Каждый плагин экспортирует функцию LoadDll() которая возвращает строку с названием плагина. Вызываю эту функцию спомощью связки LoadLibrary - GetProcAddress - CallWindowProc. Хотел узнать, как можно узнать имя этого плагина?

Заодно второй вопрос. Тоже по плагинам. Почему некоторые плагины (плагины от PEiD) нельзя вызвать с помощью способа указанного выше? Не получается вызвать плагины Crypto Analyzer и Generic OEP Finder...

Спасибо за помощь.
Подпись проходит рефакторинг

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16496
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Вопрос по плагинам

Сообщение Хакер » 23.09.2006 (Сб) 13:53

Lumen писал(а):Каждый плагин экспортирует функцию LoadDll() которая возвращает строку с названием плагина. Вызываю эту функцию спомощью связки LoadLibrary - GetProcAddress - CallWindowProc. Хотел узнать, как можно узнать имя этого плагина?


Странный пост. Сначало ответ на вопрос, потом сам вопрос.

Теперь выстроем в правильной последовательности и получим:

Хотел узнать, как можно узнать имя этого плагина?


Каждый плагин экспортирует функцию LoadDll() которая возвращает строку с названием плагина.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 23.09.2006 (Сб) 13:58

Хакер
Ты наверное не понял. Я не могу разобраться с такой вещью. CallWindowProc возвращает long, а имя плагина - string. Как мне этот string получить?
Подпись проходит рефакторинг

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16496
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 23.09.2006 (Сб) 13:59

Этот Лонг (при условии, что библа написана правильно) является указателем на Стринг. Т.е. можно попробовать CopyMemory например.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 23.09.2006 (Сб) 14:06

А как тогда узнать длину стринга?
Подпись проходит рефакторинг

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16496
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 23.09.2006 (Сб) 14:12

Очень рекоммендую сделать так, чтобы функция LoadDll ничего не возвращала, а имела аргумент LPSTR, в который ты передаёшь пустую 255-символьную строку, а функция записывала бы туда строку, с названием плагина.

Т.е. после вызова функции, ты бы получал имя плагинка как
Код: Выделить всё
PluginName = Left(retPName, InStr(1,retPName, vbNullChar) -1 )


соотв, перед вызывом функции, надо делать
Код: Выделить всё
retPName = String(255,0)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Re: Вопрос по плагинам

Сообщение Lumen » 23.09.2006 (Сб) 14:19

Хакер
Спасибо конечно за помощь, но
Lumen писал(а):плагины от PEiD

Если бы я разрабатывал формат плагинов для PEiD, я бы именно так и сделал. Но это только если бы...
Подпись проходит рефакторинг

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16496
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 23.09.2006 (Сб) 14:21

Если так, то тут нужно знать - что именно возвращается. Ну т.е. примерно разница такая же, как между VarPtr и StrPtr.

В любом случае проблема решается экспериментами. Пробуй и действую :wink:
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 23.09.2006 (Сб) 15:25

Получение строки по указателю (в т.ч. без CopyMemory) в деталях расписано в этой статье: http://vbstreets.ru/VB/Articles/66364.aspx
Изображение

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 23.09.2006 (Сб) 15:40

tyomitch
Прочитал статью и, если честно, ничего не понял. :oops: :oops: :oops:
Не пинайте плз, просто я с этим никогда не сталкивался... Помогите разобраться пожалуйста.
Подпись проходит рефакторинг

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 23.09.2006 (Сб) 15:54

тогда ищи по форуму по слову SysAllocString
Изображение

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 23.09.2006 (Сб) 16:25

tyomitch
Спасибо нашел.
ЗЫ: Не могу не процитировать одного форумчанина, столкнувшегося с похожей проблемой. Он прямо мои мысли прочитал:
A.A.Z. писал(а):А, As Long! Да еще и ByVal! Да еще и sz! :shock: А в API-Viewer'е ByRef pOleChar As Byte :? Спасибо! :D
Подпись проходит рефакторинг

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 23.09.2006 (Сб) 18:20

Сорри, похоже я совсем отупел:
Вот функция, которая возвращает имя плагина:
Код: Выделить всё
Public Function GetPluginName(plPath As String) As String
Dim hLib As Long, hProc As Long, stext As Long
hLib = LoadLibrary(plPath)
hProc = GetProcAddress(hLib, "LoadDll")
stext = CallWindowProc(hProc, Form1.hwnd, "", 0, 0)
GetPluginName = StrConv(SysAllocString(ByVal stext), vbFromUnicode)
End Function

Плиз, объясните, что я не так делаю...
Подпись проходит рефакторинг

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 23.09.2006 (Сб) 18:26

Lumen писал(а):Плиз, объясните, что я не так делаю...

Библиотеку не выгружаешь.
Параметры функции передаёшь.
Вызываешь SysAllocString, не зная, является ли возвращённый из LoadDLL указатель LPSTR (тогда SysAllocStringByteLen) или же LPWSTR.
Конвертируешь его потом зачем-то.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 23.09.2006 (Сб) 18:43

GSerg
Добавил FreeLibrary.
В Plugins SDK написано, что указатель LPSTR.
Тогда как правильно?
Подпись проходит рефакторинг

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 23.09.2006 (Сб) 18:50

Мне кажется, как правильно, было сказано выше.

Private Declare Function SysAllocStringByteLen Lib "oleaut32.dll" (ByRef m_pBase As Any, ByVal uint As Long) As String

MsgBox SysAllocStringByteLen(stext, lstrlen(stext))
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 23.09.2006 (Сб) 19:05

Уже лучше (потому что теперь возвращает что-то, отличное от пустой строки)
Возвращает моя функция что-то вроде этого
Œ`TÎT
Что теперь не так?
Чё-та у меня вообще какой-то ступор...
на всякий случай вот код функции немного исправленный:
Код: Выделить всё
Public Function GetPluginName(plPath As String) As String
Dim hLib As Long, hProc As Long, stext As Long
hLib = LoadLibrary(plPath)
hProc = GetProcAddress(hLib, "LoadDll")
stext = CallWindowProc(hProc, 0, "", 0, 0)
GetPluginName = SysAllocStringByteLen(stext, lstrlen(stext))
FreeLibrary hLib
End Function
Подпись проходит рефакторинг

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 23.09.2006 (Сб) 19:07

Что за забавные параметры у callwindowproc?
И, конечно, byval stext, если в декларации byref as any.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 23.09.2006 (Сб) 19:33

Большое спасибо. Вроде разобрался.
Подпись проходит рефакторинг

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Re: Вопрос по плагинам

Сообщение Lumen » 23.09.2006 (Сб) 19:47

А по второй части вопроса никто не подскажет?
Lumen писал(а):Всем привет!
Заодно второй вопрос. Тоже по плагинам. Почему некоторые плагины (плагины от PEiD) нельзя вызвать с помощью способа указанного выше? Не получается вызвать плагины Crypto Analyzer и Generic OEP Finder...
Спасибо за помощь.
Подпись проходит рефакторинг

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 14.12.2006 (Чт) 19:41

Сорри за некрофилию, но...
В общем такая история: довёл наконец до ума получение имени плагина, всё прекрасно работало до одного "прекрасного" дня, когда я решил переустановить систему. Переустановил. На новой системе запускаю свою программу, а имена плагинов опять некорректно отображаются. Точнее не все. Некоторые нормально, а от имен других осталась только одна буква... Система осталась той же (SP2). Что это может быть? Подскажите, пожалуйста, буду благодарен за любую информацию...
Подпись проходит рефакторинг


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 16

    TopList