[FAQ] обращение из ОК к функциям Windows / API [old]

FAQ. Ответы на часто задаваемые вопросы.

Модератор: 4epT

Правила форума
Этот раздел является руководством и тут разрешено оставлять сообщения лишь для уточнения и внесения корректив в существующие материалы. Для вопросов существует ряд других разделов.
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

[FAQ] обращение из ОК к функциям Windows / API [old]

Сообщение piroJOKE »

Обращение к функциям Windows из OpenKore - тема со старого форума.

piroJOKE; 2006-10-12:
Поскольку мужик я темный - мне не ведомо, как вызвать какую-то системную функцию из Перла (то бишь, из OpenKore); а читать доку и вовсе лень.

Поэтому я решил посмотреть, как делают другие, и просто стащить их готовые решения!!

На форуме OpenKore я нашел интересный плагинчег, rowan.pl. По словам автора, самое главное что умеет этот плагин, это извлечь на свет божий окно Ragnarok, когда OpenKore работает в xKore-режиме. То есть... оно там себе бегает-бегает, и тут вдруг какой-то подлец пишет нам в ПМ. Вот, в этот момент свернутое окно Ragnarok само раскрывается, и мы берем немедленно управление в свои руки! Интересно...

Уложил я содержимое архива в папочку plugins. Коре не запускается, говорит, не могу мол изыскать 'auto/Win32/GuiTest/GuiTest.dll'. Хм... В комлекте с плагином был GuiTest.pm, но не было никаких dll-ок. Меня начали терзать смутные сомнения, и я хоть Перлом пользоваццо не умею, все таки запустил от него такой прибамбас как 'ppm'. Эта штука - специальная фигня для установки дополнительных модулей. То есть пишешь... хочу модуль такой-то! а он его загружает из интернета и подключает сразу к системе. Вот, я ему написал 'search guitest'. Он - "да, есть такое, полное название такое-то". Я 'install Win32-Guitest'. Запускаю Kore - все запускается без ошибок. Но, за счет чего? Это у меня на машине оно запускается, потому что я подключил модуль. А у других не запустиццо. Посмотрел я еще раз на ошибку что вылезла у меня в первый раз... И положил dll-ку в одну из папочек в 'plugins'-ах. Вот что у меня получилось:

\plugins\auto <-- эту папку я сделал
\plugins\rowan.pl <-- сам плагин
\plugins\Win32 <-- эта папка была в архиве плагина
\plugins\auto\Win32 <-- моё
\plugins\auto\Win32\GuiTest <-- моё
\plugins\auto\Win32\GuiTest\GuiTest.dll <-- перетащено из Перла
\plugins\Win32\GuiTest.pm <-- было в архиве плагина

Вуаля, всё работает! (Вроде бы, еще толком не проверял...)
gm:
А нам где это брать ? )
piroJOKE:
Эм... а зачем это "брать"? ))) Это лишь пример. ) Хотя, щас еще кое-чего напишу.
Наконец, посмотрев как устроены чужие плагины, обращающиеся к компонентам Винды, я решил состряпать что-нибудь смешное на эту тему.

Я выбрал объект WIN32::API; собственно это то, с чего я вообще начал копать эту тему.
Множество мелких полезняшек. И никаких идей на тему, "как это заставить работать для нас?" ;)

У меня проинсталлирован ActivePerl, поэтому я опять залез в менеджер пакаванов ppm. Диалог в нём:
PPM - Programmer's Package Manager version 3.3.
Copyright (c) 2001 ActiveState Corp. All Rights Reserved.
ActiveState is a division of Sophos.

Entering interactive shell. Using Term::ReadLine::Perl as readline library.

Type 'help' to get started.

ppm> search api
Searching in Active Repositories
1. capitalization [0.03] capitalization
2. CGI-Builder-CgiAppAPI [1.27] CGI-Builder-CgiAppAPI
3. EVDB-API [0.9] EVDB-API
4. Flickr-API [0.08] Flickr-API
5. Net-Flickr-API [1.2] Net-Flickr-API
6. PDF-API2 [0.55] PDF-API2
7. SWISH-API-Remote [0.10] SWISH-API-Remote
8. Text-Capitalize [0.3] Text-Capitalize
9. Text-PDF-API [0.701.4] Text-PDF-API
10. UkrMoney-API [1.01] UkrMoney-API
11. Win32-API [0.41] Win32-API
12. Win32-API-Interface [0.03] Win32-API-Interface
13. Win32-API-OutputDebugString [0.03] Win32-API-OutputDebugString
14. Win32-MprApi [0.02] Win32-MprApi
15. Win32-SAPI4 [0.08] Win32-SAPI4
16. Win32API-File [0.08] Win32API-File
17. Win32API-File-Time [0.005] Win32API-File-Time
18. Win32API-GUID [0.2] Win32API-GUID
19. XML-API [0.09] XML-API
ppm> install Win32-API
...и пошла инсталляция этого модуля. Потом я написал 'quit', и на этом закончил с ppm.

Потом я взял rowan.pl, и вычистил его так, что от него остался лишь хук на перехват pm-сообщения, и пустая процедура реакции на него.
Затем я заглянул на сайт http://dada.perl.it/#api , где живет автор этого пакавана (win32::api), и скачал оттуда архив, в котором были и всякие примеры.

Мне понравился примерчег ejectcd.pl, который выдвигает каретку CD-привода. Хо-хо. ))) Вот он:

Код: Выделить всё

#perl -w
use strict;

use Win32::API;

my $mciSendString = new Win32::API(
    "winmm",
    "mciSendString",
    ['P', 'P', 'N', 'N'], 'N'
)
or die "Can't import the mciSendString API:\n$!";

doMM("close cdaudio");
doMM("open cdaudio shareable");
doMM("set cdaudio door open");
doMM("close cdaudio");

sub doMM {
    my($cmd) = @_;
    my $ret = "\0" x 1025;
    my $rc = $mciSendString->Call($cmd, $ret, 1024, 0);
    if($rc == 0) {
        $ret =~ s/\0*$//;
        return $ret;
    } else {
        return "error '$cmd': $rc";
    }
}
....
Последний раз редактировалось piroJOKE Вт дек 25, 2007 1:37 pm, всего редактировалось 4 раза.
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

...
Я выкусил из него всё, и засунул в пустышку плагина. Переименовал там всё что нужно, и вот что получилось (я назвал это pm2cd.pl) :

Код: Выделить всё

#crazy cd on pm

package pm2cd;

use strict;
use Plugins;
use Globals;

use Win32::API;

Plugins::register('pm2cd', 'cool cd ejecting system on pm', \&Unload);

my $hooks = Plugins::addHooks(['packet_privMsg', \&processPM, undef]);

my $mciSendString = new Win32::API(
    "winmm",
    "mciSendString",
    ['P', 'P', 'N', 'N'], 'N'
)
or die "Can't import the mciSendString API:\n$!";

sub cdXXX {
	doMM("close cdaudio");
	doMM("open cdaudio shareable");
	doMM("set cdaudio door open");
	doMM("close cdaudio");
}

sub doMM {
    my($cmd) = @_;
    my $ret = "\0" x 1025;
    my $rc = $mciSendString->Call($cmd, $ret, 1024, 0);
    if($rc == 0) {
        $ret =~ s/\0*$//;
        return $ret;
    } else {
        return "error '$cmd': $rc";
    }
}

sub Unload {
	Plugins::delHooks($hooks);
}

sub processPM {
	cdXXX;
}

1;
Но это еще не всё. Эта штука реально требует скомпилированную api.dll. Но эта dll-ка приехала к нам, в каталог Перла, во премя установки компоненты через ppm. Я лишь вытащил ее оттуда, предварительно найдя ее файл поиском. )) Дальше я разложил все файлы в те места, которые подсмотрел на примере rowan.pl и в примерах от win32-api. Вот что получилось:

\plugins\pm2cd.pl
\plugins\auto\Win32\API\API.dll
\plugins\Win32\API.pm
\plugins\Win32\API\Callback.pm
\plugins\Win32\API\Struct.pm
\plugins\Win32\API\Type.pm

Теперь проверка. Запустил локальный сервер, запустил Kore, запустил клиент... Написал в PM подопытному, и о чудо! CD с грохотом открылся!!! @_@

Итак, мы сделали оооооооооочень полезный плагин pm2cd, которым можно разве что попугать нупов. ))

Остается вопрос, зачем же я всё этот тут написал. А вот зачем. Обратите внимание! Я умею программировать более чем посредственно, но воспользовался чужими примерами, скомбинировал их, и добился кое-какого результата. Вы тоже так можете. )) Спасибо за внимание! ))
_____________________________
ЗЫ: Вот наш готовый плагин, его можно просто развернуть в папку plugins : upload/pm2cd-pl.zip
ЗЗЫ: Ложка дёгтя! Обратите внимание, я подсовываю вам скомпилированную dll-ку. А вдруг я обманываю вас, и там троян? Как же этого избежать? А вот как: ставьте себе ActivePerl, и сами скачивайте нужные бинарные модули (если вы не доверяете месту, откуда скачиваете или афтару ;) ).
ЗЗЗЫ: На самом деле, я *****ся, чтобы заставить всё это работать больше недели... О_о
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Аватара пользователя
DeniZka
Разработчик
Сообщения: 410
Зарегистрирован: Ср ноя 15, 2006 6:36 pm
Сервер RO:: rRO AsgardRO
Откуда: Mos-Cow Citadel
Контактная информация:

Сообщение DeniZka »

piroJOKE
Спасибо, архи-полезная информация для меня, да и для SVиNщиков тоже.
Изображение
1t 1$ t00 900d d4y 2 d1e

?(???)?(???)?( ?Д?)?
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

Может она и "архи", но я вот тута типо скомпилил пример dll-ки на purebasic'е,
и как эту скомпиленную хрень к плагину OpenKore подключить, ума не приложу!
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Ответить