piroJOKE; 2006-10-12:
gm:Поскольку мужик я темный - мне не ведомо, как вызвать какую-то системную функцию из Перла (то бишь, из 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 <-- было в архиве плагина
Вуаля, всё работает! (Вроде бы, еще толком не проверял...)
piroJOKE:А нам где это брать ? )
Эм... а зачем это "брать"? ))) Это лишь пример. ) Хотя, щас еще кое-чего напишу.
Наконец, посмотрев как устроены чужие плагины, обращающиеся к компонентам Винды, я решил состряпать что-нибудь смешное на эту тему.
Я выбрал объект WIN32::API; собственно это то, с чего я вообще начал копать эту тему.
Множество мелких полезняшек. И никаких идей на тему, "как это заставить работать для нас?"
У меня проинсталлирован ActivePerl, поэтому я опять залез в менеджер пакаванов ppm. Диалог в нём:...и пошла инсталляция этого модуля. Потом я написал 'quit', и на этом закончил с 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
Потом я взял 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"; } }