Решил поделится примером создания плагина для MMB, поскольку информация, описывающая методы создания своих плагинов, почти отсутствует, по крайней мере, мне не удалось её найти. Рассмотрим как создавать плагин для MMB в среде PureBasic Предоставленная здесь информация, не претендует на полноту сведений и достоверность, т. к. получена методом проб и ошибок. Как известно плагин для MMB обычная DLLка, но написанная по определённым правилам, которые нужно соблюдать чтобы всё работало нормально. Функции плагина должны использовать соглашение cdecl. Так же должен быть набор специальных функций, необходимых в каждом плагине и используемых для "общения" программы и плагина.
Расмотрим исходный текст примера плагина:
Code
; //// Служебный код плагина! НЕ МОДИФИЦИРОВАТЬ \\\\
; Глобальные переменне Global Prog_WinHandle.l ; Хендл окна программы на MMB Global Prog_Path.s ; Абсолютный путь к проге на MMB Global GetInt.l ; Переменая типа LONG, используемая для хранения инфы переданной прогой (PluginSet) Global SetInt.l ; Переменая типа LONG, хранящая данные, передаваемые в прогу (PluginGet) Global GetStr.s ; Переменая типа STRING, используемая для хранения инфы переданной прогой (PluginSet) Global SetStr.s ; Переменая типа STRING, хранящая данные, передаваемые в прогу (PluginGet)
ProcedureCDLL.s GetInfo() ProcedureReturn "Пример плагина на PureBasic для MMB" EndProcedure
; //// Функции пользователя, вызываемые из проги на MMB \\\\
; Это спец. процедура, вызывемая при доступе к DLL ProcedureDLL AttachProcess(Instance) Static RunOnly If Only<>1 Only = 1 InitAudioCD() UseAudioCD(0) EndIf EndProcedure
ProcedureCDLL CD_Control() State = GetInt & 1 EjectAudioCD(State) EndProcedure
Функции, находящиеся в верху кода - служебные, необходимые для превильного функционирования связки "программа на MMB - плагин". Последние две функции "полезные", вызываемые из проги на MMB. Функция CD_Control открывает и закрывает лоток CD/DVD дисковода по команде из проги, а функция Message, отображает мессагу с текстом, переданным из проги плагину и возвращает текущее время в формате часы:минуты:секунды.
Для создания DLL в PureBasic, нужно открыть новую вкладку и сохранить файл, а затем, в меню "Компилятор", выбрать пункт, "Настройки компилятора".
Пётр, сдк на паскале и с доступны, скорвертнуть под твое пюре не проблема. Ты потерял поцедуру отрисовки окна плагина
Code
void Draw(HDC hDC, int left, int top, int width, int height); // calling drawing of the non-windowed plug-in's rectangle
Так что оно годится только для невизуальных плагинов. Согласно сдк, процедуры PluginGet, PluginSet оперируют с типом интегер -32-разрядные (4-байтовые) а не лонг -Содержит 64-разрядные (8-байтные). Что там будет у тебя со стеком нескажу.
; //// Служебный код плагина! НЕ МОДИФИЦИРОВАТЬ \\\\
; Глобальные переменне Global Prog_WinHandle.l ; Хендл окна программы на MMB Global Prog_Path.s ; Абсолютный путь к проге на MMB Global GetInt.l ; Переменая типа LONG, используемая для хранения инфы переданной прогой (PluginSet) Global SetInt.l ; Переменая типа LONG, хранящая данные, передаваемые в прогу (PluginGet) Global GetStr.s ; Переменая типа STRING, используемая для хранения инфы переданной прогой (PluginSet) Global SetStr.s ; Переменая типа STRING, хранящая данные, передаваемые в прогу (PluginGet)
ProcedureCDLL.s GetInfo() ProcedureReturn "Пример плагина (Draw) на PureBasic для MMB" EndProcedure
; //// Функции пользователя, вызываемые из проги на MMB \\\\
; Это спец. процедура, вызывемая при доступе к DLL ProcedureDLL AttachProcess(Instance) Shared Font, IconID Static RunOnly If Only<>1 Only = 1 Font=CreateFont_(18,0,0,0,0,0,0,0,#RUSSIAN_CHARSET,0,0,0,0,"Arial") EndIf EndProcedure
PluginGet, PluginSet оперируют с типом интегер -32-разрядные (4-байтовые) а не лонг -Содержит 64-разрядные (8-байтные). Что там будет у тебя со стеком нескажу.
Со стеком будет все в порядке - Long целочисленная 4-ёх байтаная переменная.
Со стеком будет все в порядке - Long целочисленная 4-ёх байтаная переменная.
Присмотрелся я и действительно, ничего себе о..тельно. Интересное трактование типов в энтом пюре. Будут воросы по сдк, спрашивай, помогу. Нов общем вполне сойдет.
; //// Служебный код плагина! НЕ МОДИФИЦИРОВАТЬ \\\\
; Глобальные переменне Global Prog_WinHandle.l ; Хендл окна программы на MMB Global Prog_Path.s ; Абсолютный путь к проге на MMB Global GetInt.l ; Переменая типа LONG, используемая для хранения инфы переданной прогой (PluginSet) Global SetInt.l ; Переменая типа LONG, хранящая данные, передаваемые в прогу (PluginGet) Global GetStr.s ; Переменая типа STRING, используемая для хранения инфы переданной прогой (PluginSet) Global SetStr.s ; Переменая типа STRING, хранящая данные, передаваемые в прогу (PluginGet)
ProcedureCDLL.s GetInfo() ProcedureReturn "Плагин работы с портами для MMB" EndProcedure
; Это спец. процедура, вызывемая при доступе к DLL ProcedureDLL AttachProcess(Instance) Static RunOnly If Only<>1 Only = 1
*PB_UpakDLL_Mem=AllocateMemory(80000) ; Выделение 80000 байт памяти UnpackMemory(?DLL, *PB_UpakDLL_Mem) ; Распаковка inpout32.dll *HModule=LoadLibraryM(*PB_UpakDLL_Mem); Загрузка inpout32.dll из памяти If *HModule Global Inp32.pInp32 = GetProcAddressM(*HModule, "Inp32") Global Out32.pOut32 = GetProcAddressM(*HModule, "Out32") EndIf
EndIf EndProcedure
ProcedureCDLL SetAddress() ; Задаем адрес порта Address_IO = GetInt EndProcedure
ProcedureCDLL Set_Data() ; Задаем данные порта Data_IO = GetInt EndProcedure
ProcedureCDLL OutPort() ; Запись данных в выбранный порт If Out32<>0 And Address_IO>0 Out32(Address_IO, Data_IO) EndIf EndProcedure
ProcedureCDLL InpPort() ; Чтение данных из выбранного порта Result = 0 If Inp32 And Address_IO>0 Result = Inp32(Address_IO) EndIf SetInt = Result EndProcedure
Данный плагин позволяет работать с любым из портов компа, скажем, LPT портом. Так как в NT системах, приложения работающие на третьем кольце не имеют привилегий использования ассемблерных инструкций INP и OUT, был использован драйвер inpout32.dll, котрый для уменьшения размера, предварительно сжат и на этапе компиляции, помещен в DLL-файл плагина. При старте плагина, файл inpout32.dll распаковывается в память и от-туда же запускается без создания временного файла на диске.
Для примера, сделал прогу, отображающую текущую температуру процессора с помощью встроенного датчика. Для этого используются порты мат. платы с адресами 661 и 662. Аналогичный метод измерения температуры процессора использован в известных программах, типа Аида, Эверест и др. Правда, будет работать не на всех компах, а лишь на тех, материнские платы которых поддерживают данную функцию.
PS. Для компиляции плагина нужна библиотека PBOSL, которая позволяет загружать DLL не с диска, а из памяти. Скачать можно здесь http://pure-basic.narod.ru/libs/PBOSL_4.30.rar Устанавливается распаковкой содержимого архива в папку со средой PureBasic.
Смотри вложение. Для завершения системных процессов (обычных не касается), нужно чтобы программа получила привилегии отладчика. Для этого необходимо однократно вызвать функцию EnableDebugPrivilege(), но для этого обязательно нужно запустить прогу с правами админа. В случае успеха, она вернет число 1.
А с функцией BSOD() нужно быть по осторожнее, а то появится "синий экран смерти"!
разрыв связи с инетом не пашет, LAN, w7x64. как именно гасится инет? по моему, нужно похимичить, чтобы пахало на всех типах подключения. сперва вычислить устройство, ответственное за инет, потом отключить его, так?
Сейчас разрывается соединение, поднимаемое виндой. Чтобы отключить инет по LAN, нужно либо блокировать сетевой трафик (или фильтровать его) или отключать сетевую карту.
Пример плагина, упаковывающего и распаковывающего ZIP архивы, т. ч. и защищённые паролем. Он создан на основе библиотеки PureZIP. Библиотека довольно мощная и позволяет работать не только с обычными архивами, но и с самораспаковывающимися (запросто можно создать свой аналог WinRARа) но многие функции будет сложно "подружить" с MMB, скажем, слабо представляю как можно передать в MMB структуру, описывающую упакованый файл (там дата создания файла, модификации, имя, размеры упакованного и нет, CRC и многое другое).
Плагин для работы с USB HID устройствами. Пример взаимодействует с USB устройством, созданным на микроконтроллере ATmega8, схема устройства и прошивка для микроконтроллера (файл, "USB_Termo.hex" в папке "Bascom" архива "USB_Termo_ATmega8.rar") прилагается.
Подниму ка я тему. Вот плагин для работы с потами компа. Проверен и нормально работает на Windows x86 2000, XP, 7. В отличии от уже имеющихся на форуме, аналогичных плагинов, этот отличается тем, что не использует библиотеки-посредники, типа inpout32.dll или аналогичные, а сам является такой библиотекой и непосредственно обращается к драйверу pbdriverio.sys. Во вложении есть сам плагин, примеры использования (работа с LPT портом и получение температуры процессора) и исходники плагина. Их кстати, можно использовать как основу если хотите понять как работать с драйверами режима ядра ОС.
А для особо любознательных, выкладываю исходники драйвера режима ядра pbdriverio.sys в месте с DDK и др. файлами, необходимыми для компиляции драйвера.