Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   {mdm}Zinc (http://www.flasher.ru/forum/showthread.php?t=81193)

MyXus 30.04.2007 00:01

Ну да. Здесь понятно. Просто не хочется мусорить в реестре оставляя левые ключи..
Самое ценное открытие/изобретение (для меня) в этой ветке - возможность испольования kernel32.dll. Супр просто.
А не знаешь еще системных либов такого рода?

alexcon314 30.04.2007 00:58

Если ты спрашиваешь о системных либах widows, то это неконкретный вопрос. Библитоек немало и все содержат массу (тысячи!) очень полезных функций. kernel32, user32, advapi32, gdi32 - все это интересно.
Вообще я пользуюсь справочником Win32 Programmer Reference, где многое изложено о функциях этих библиотек. (есть еще msdn - ресурсы) Правда, зачастую напрямки их подпихивать в цинк не удается в силу специфики формата вызова, но я приладился вроде обертывать их в dll-обертки и уже в таком виде подсовывать в цинк. Пример рядом - пост про то как определить текущую раскладку. На счет того что свупер просто - уточнил бы: супермощно :)

udaaff 30.04.2007 01:15

2 alexcon314
спасибо за помощь!
не мог ты подсказать, где можно найти инфо про эти библиотеки в понятной для человека форме :)

alexcon314 30.04.2007 01:54

Ну... уфф.. ты спросил :)
Полгода назад я боялся слова dll, поверишь? Теперь сам их пишу :). Всю инфу я качал из инета и искал в инете. Какие проблемы?
Ссылок кучи. search. Будут конкретные вопросы - пожалуйста, обращайся.

udaaff 01.05.2007 02:44

:umnik2:
посоветуй с чего начать... в сети дурдом какой-то :)
на каком языке это все пишется?

alexcon314 01.05.2007 09:42

Вложений: 1
К цинку можно подцепить dll, написанные на C++ или на Delphi. Поэтому, для начала нужно обзавестись соответствующими инструментами программирования: MS Visual C++, MS VisualStudio, Borland Delphi или Borland C++ - это наиболее распространенные IDE. Я больше использую С++. Неплохо бы приобрести начальные знания по этим языкам. Как - это на любителя. По мне лучше приобрести книгу в магазине. Правда, с этим у меня проблемы - в моем городе просто нет таких магазинов :). Поэтоиу путь лежит на программерские форумы опять же, где добрые люди выкладывают ссылки на электронные мануалы десятками. Придется волей-неволей повариться в этом соку прилично времени, если новичок. Следует обратить внимание на WinAPI - собственно к нему и надо стремиться, вобщем-то. Это "собрание функций сидящих в винде и в ее библиотеках". Если не хочешь сам их программировать (а это долго) лучше использовать готовые.
Забиваешь для начала "программирование С++" в поиск - и понеслась.
Когда созреешь, забивай в поиск "dll" - и снова понеслась. ЧЕСТНО(!), я не помню таких ссылок, где было бы все и сразу. Инфу нужную таскаешь в основном по крупицам - так уж повелось. В конце концов упираешься в пример работающего исходника какой-нибудь dll-ки. Вот тут я тебе помогу сразу, см. вложение. Тестить dll можно прямо в окне цинка. Там есть Tools->Extension Creator. Цепляешь в этом креаторе dll-ку, он тебе высветит доступные функции, в ней заложенные. На следующей закладке задаешь тестовые аргументы выбранной функции и тип возвращаемого значения, если нужно. Для этого нужно хорошо представлять себе что за функцию ты тестишь. На следующей закладке грузишь dll и жмешь "выполнить". Если все хорошо, получишь от dll достойный ответ. Ну а как из скрипта цеплять dll я уже показывал.
Но лучше начать с готовых виндовых dll-ек типа kernel32 и т.д. Посмотри на них в креаторе. на их функции. Где-то ранее в этой же теме я выкладывал скрипт, вызывающий системный "писк" и скрипт, перемещающий файл - это как раз через kernel32 работает. Главное - найти хороший справочник по этим функциям то есть справочник по ...- да-да... по Win API. См. мой пост 62 выше. Выложить его здесь не могу - он весит прилично. Постараюсь выложить на http://mdm-zinc.narod.ru если будет время ... или опять же - search.
И еще посоветую (во второй раз уже!) - обрати внимание на mdm.System.VBScript, массу примочек можно сделать не прибегая к dll напрямую, а через VB(JS)-скрипты, там все покажется проще.
Вот так примерно. Ты уж извини за пространный ответ.:(
P.S. исходник dll - это проект сделанный в MS VisualStudio 2003. При желании можно его приспособить и под другие IDE

alexcon314 02.05.2007 00:39

Два в одном
 
Вложений: 1
Подумал, почему бы не слить функции "изменить раскладку" и "узнать текущую раскладку" в одну dll?
Код:

var dll = new mdm.DLL("kbl.dll");
createTextField("out1", 1, 20, 20, 200, 20);
out1.type = "dynamic";
out1.border = true;
out1.text = "See result here.";
createTextField("out2", 2, 20, 50, 200, 200);
out2.type = "input";
out2.multiline = true;
out2.border = true;
out2.text = "Type your text here.";
change_kbl.onRelease = function() {
        var parameter = dll.addParameter("integer", "");
        var res = dll.call("integer", "FollowKBL") * 1;
        if (res != 0) {
                out1.text = "Keyboard layout has changed.";
        } else {
                out1.text = "Error has occured.";
        }
        //res=0 if error has occured
        Selection.setFocus(out2);
};
get_kbl.onRelease = function() {
        var parameter = dll.addParameter("string", "");
        var res = dll.call("string", "GetKBL") * 1;
        if (res != 0) {
                out1.text = "Keyboard layout name is " + res;
        } else {
                out1.text = "Error has occured.";
        }
        //res=0 if error has occured
        Selection.setFocus(out2);
};

Это скрипт, иллюстрирующий использование.
Сама dll-ка во вложении. (Положить ее надо рядом с экзешником.)
P.S. Просьба отписаться, если не работает. Интересно все-таки..

udaaff 02.05.2007 02:11

Все работает! Прошлое тоже работало после небольшой корректировки.
Выкачал справочник точно такой как там в хэлпе, буду разбираться, очень интересно. А функцию нельзя никак заставить результат без нолей возвращать? (просто интересно)
Extensions are a fantastic new feature -- это точно.
dll -- это просто напросто сборник процедур и функций -- я правильно понял?
А что к примеру полезного можно сделать при помощи метода System.JScript.execute()?

alexcon314 02.05.2007 08:57

Функция GetKeyBoardLayoutName возвращает именно с нулями, но при "обертывании" в свою dll пишется функция из которой уже она вызывается и возвращаемое значение можно привести к любому виду в самой этой оберточной dll-ке. Это не проблема. Можно заставить ее возвращать вообще "RU" Или "EN".
По поводу VBScript, JSScript я давал ссылку на справочник по скриптам в посте сразу за самым первым примером с раскладкойь (не помню номер, наверно 46-47). Почитай этот мануал, там много интересного. ПРавда, обратную связь с функцией в VB(JS) скрипте не так просто организовать.
Но в принципе это преодолимо, а при определенных условиях и вовсе не имеет значения.
Для примера: в цинке есть косячок (один из первых, с которым мне пришлось столкнуться), состоящия в томБ что RemoveFolder - метод удаляет только (и только) пустую папку, что не приемлемо. Приходилось писать рекурсию. Само по-себе не обременительно, но не приятно. Через соответствующий VBScript этот косячок убирается на раз. Без ковыряний в API-шных функциях. Но что мне особо понравилось (извините, модераторы, за невольное повторение) - это динамическая выгрузка данных в разные форматы - в Word, Excel, HTML (последнее, конечно без всяких скриптов, просто упомянул до кучи:)). Никто не мешает и обработку указанных форматов сделать, хотя это посложнее. И без всяких ActiveX в цинке (они чего-то не очень мне понравились).
Кстати, System.JS(VB)cript.execute() тоже косяка кидает. Проблема решается выгрузкой скрипта на диск и последующим запуском. При выгрузке больших по размеру скриптов, рекомендуется делать построчную выгрузку с помощью .appendFile - метода.
Еще мне понравился запуск command line - утилит. Их много всяких разных и помогают порой серьезно. Например см. мой пост в этой теме "Zinc->Shh->Linux->Bash" (48 пост вроде). Ну нет у винды shh dll-ки, а поди ж ты - работает shh :)!
Но dll, конечно, остается на первом месте.

alexcon314 02.05.2007 15:30

Выгрузка в Word
 
Если я Вам еще не надоел :), позволю себе привести пример работы с VBScript. В системе должен быть установлен Word, чтобы все работало.
Код:

// имитация динамического массива данных; например, массив - результат выборки из БД MySql
var dataArray:Array = new Array();
for (var i = 0; i <= 100; i++) {
        dataArray.push({field1:i + " a", field2:i + " b", field3:i + " c", field4:i + " d", field5:i + " e", field6:i + " f", field7:i + " g", field8:i + " h"});
}
//создаем документ, таблицу, элеметарное форматирование
var vbcode:String = "";
vbcode += "Set objWord = CreateObject(\"Word.Application\")\r";
vbcode += "objWord.Visible = True\r";
vbcode += "Set objDoc = objWord.Documents.Add()\r";
vbcode += "objWord.Activate()\r";
vbcode += "objDoc.Select\r";
vbcode += "objDoc.Application.Selection.PageSetup.Orientation = 1\r";
vbcode += "objDoc.Application.Selection.PageSetup.LeftMargin = 30\r";
vbcode += "Set objRange= objDoc.Range()\r";
vbcode += "objDoc.Tables.Add objRange,1,8\r";
vbcode += "Set objTable = objDoc.Tables (1)\r";
vbcode += "objTable.Range.Style = \"Сетка таблицы\"\r";
for (var i = 1; i <= 8; i++) {
        vbcode += "objTable.Columns(" + i + ").Width =80\r";
}
vbcode += "objTable.Rows.Height = 16\r";
vbcode += "objTable.Rows.Add ()\r";
for (var i = 1; i <= 8; i++) {
        vbcode += "objTable.Cell(1, " + i + ").Range.Text = \"Колонка " + i + "\"\r";
}
vbcode += "objDoc.Tables (1).Rows(1).HeadingFormat = True\r";
mdm.FileSystem.saveFile(mdm.System.Paths.appData + "toWord.vbs", vbcode);
vbcode = "";
//заполняем таблицу
for (var i = 0; i <= 100; i++) {
        vbcode += "objTable.Rows.Add ()\r";
        for (var j = 1; j <= 8; j++) {
                vbcode += "objTable.Cell(" + (i + 2) + ", " + j + ").Range.Text = \"" + dataArray[i]["field" + j] + "\"\r";
        }
        mdm.FileSystem.appendFile(mdm.System.Paths.appData + "toWord.vbs", vbcode);
        vbcode = "";
}
go.onRelease = function() {
        mdm.System.exec(mdm.System.Paths.appData + "toWord.vbs");
};

Аналогично можно поступить с Excel'ем и с HTML. Форматирование текста - средствами VBA. Не привожу из экономии места.


Часовой пояс GMT +4, время: 19:57.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.