| Беларусь, рогачёв |
Методика организации командной работы над Flash-проектом
"Компилятор флэш-файлов"
Представьте себе, что у вас есть большой проект с большим количеством не очень сложных флэш-роликов, которые должны быть достаточно "легкими", не требовать никаких дополнительных файлов для своей загрузки (весь флэш-ролик в одном *.swf-файле).
Но все-таки есть некоторые вещи, которые вы хотите менять одним махом во всех этих флэш-роликах, например, какие-то цвета, язык или что-нибудь еще.
Понятно, что в этом случае очень неудобно каждый раз вручную перекомпилировать все 50 флэш-роликов, особенно это чревато соблазном сохранять результаты прошлых компиляций, а это, в свою очередь, опасно тем, что некоторые последние изменения могут не попасть в сборку.
Именно для такого проекта " компилятор флэш-роликов". Ведь в любой среде разработки (Java, C/C++ и др.) обязательно есть command-line компилятор, которым удобно в командном режиме собирать большие проекты. Во Flash MX такого компилятора нет.
Как же работает наш компилятор? Это отдельная Windows-программа, которая активно использует Win32 API. Она умеет:
- открывать разные *.fla-файлы с помощью функции ShellExecute() ;
- находить окно с флэш-роликом по его заголовку,
- посылать разные клавиатурные сообщения в его окна (имитация действий пользователя),
- закрывать вспомогательные окна с запросами подтверждениями (таким же способом).
Ниже приведен откоментированный код этого компилятора на C с применением WinAPI (компилировался при помощи Microsoft Visual C++ 6.0).
Фактически, наша программа просто делает вид, что пользователь открыл некоторый файл во Флэш МХ и выбрал из меню пункт File / Publish или пункт Control / Test Movie. Чтобы воспользоваться этим " компилятором ", вам нужно будет взять приведенный ниже код (написанный на С для пущей переносимости) и либо откомпилировать его при помощи Microsoft Visual C++ 6.0, как поступали мы, либо (возможно, внеся некоторые изменения) воспользоваться другим С- компилятором. (Надо учесть, что наша программа использует WinAPI и рассчитана только на работу под Windows. Если вы работаете на Макинтоше, вам придется написать свой вариант "флэш- компилятора ".) После того, как вы соберете программу, вы получите приложение командной строки, которому можно будет передать первым аргументом полное имя *.fla-файла, который вы хотите откомпилировать, а вторым - слово compile или publish. Во втором случае будет произведена публикация файла с теми настройками, которые вы выбрали. Затем составьте пакетный файл (*.bat-файл), который будет компилировать все нужные вам ролики.
#include "stdafx.h"
#define WINVER 0x0500
// чтобы можно было использовать функции Windows 2000
#include "windows.h"
#include "winuser.h"
#include "shellapi.h"
int main(int argc, char* argv[])
{
const int PUBLISH_MENU_ID = 40057;
// Номера получены из MSSPY
const int COMPILE_MENU_ID = 33371;
// с помощью этой утилиты были определены
const int CLOSE_CHILD_ID = 57602;
// идентификаторы интересующих нас пунктов меню
const int SAVE_ID = 57603;
if (argc != 3) {
// проверка на корректность исходных значений
puts ("First parameter: full .fla file name to compile,");
puts ("Second parameter: \"publish\" or \"compile\"");
return 0;
}
int MENU_ID = (!strcmp (argv[2], "publish")) ? PUBLISH_MENU_ID :
COMPILE_MENU_ID;
// в зависимости от пожеланий пользователя либо компилируем
// (ctrl-Enter), либо публикуем (ctrl-F12)
char buffer[200] = "Macromedia Flash MX - [";
char buffer1[200] = "Macromedia Flash MX - ";
// два варианта заголовка окна: иногда бывает так, а иногда иначе
char tmpbuf[200] = "";
char one[2] = " ";
for (int i = 0; i < strlen (argv[1]); i++) {
// формируем возможные названия окон
if (argv[1][i] == '\\') {
strcpy (tmpbuf, "");
continue;
}
else {
one[0] = argv[1][i];
strcat (tmpbuf, one);
}
}
strcat (buffer, tmpbuf);
strcat (buffer1, tmpbuf);
strcat (buffer, "]");
LPCSTR window_name = (LPCSTR) buffer;
//сформировали заголовки
LPCSTR window_name1 = (LPCSTR) buffer1;
WORD low = (WORD)MENU_ID,
// младший байт - идентификатор меню,
// старший должен быть равен 1.
high = 1; //accelerator
char param[400];
strcpy (param, "\"");
strcat (param, argv[1]);
strcat (param, "\"");
printf ("%s\n", param);
puts ("Trying to open file");
//открываем нужный *.fla-файл
ShellExecute (0, "open", param, NULL, NULL, SW_SHOW);
HWND h = 0, h1 = 0;
puts ("Trying to find the main window");
do {
Sleep (100);
h = FindWindow ("SmartSketchMDIFrame", window_name);
//ищем окно
h1 = FindWindow ("SmartSketchMDIFrame", window_name1);
} while (!h && !h1);
if (!h) h = h1; //нашли одно или другое окно
puts ("Sending commands");
// посылаем сообщение о компиляции или публикации
SendMessage (h, WM_COMMAND, MAKEWPARAM (low, high), NULL);
//сейчас мы закроем все ненужные окна
low = (WORD)CLOSE_CHILD_ID;
puts ("Closing child windows");
if (MENU_ID == COMPILE_MENU_ID)
// если была компиляция, то закрываем это окно
SendMessage (h, WM_COMMAND, MAKEWPARAM (low, high), NULL);
low = (WORD)SAVE_ID;
// сохраняем файл
SendMessage (h, WM_COMMAND, MAKEWPARAM (low, high), NULL);
// полностью закрываем сhild-окно.
// SendMessage работает синхронно, а PostMessage -
// асинхронно. Здесь можно использовать PostMessage(), потому
// для продолжения работы ничего дожидаться не нужно.
low = (WORD)CLOSE_CHILD_ID;
PostMessage (h, WM_COMMAND, MAKEWPARAM (low, high), NULL);
//пробуем отыскать диалоговое окно
HWND hMain = 0, hDialog = 0;
puts ("Searching for the dialog boxes");
do {
// ищем диалог о сохранении файла, который, возможно,
// появился как результат выполнения команды закрытия окна.
hMain = FindWindow ("SmartSketchMDIFrame", "Macromedia Flash MX");
if (hMain) {
puts ("There were no dialog");
break;
}
hDialog = FindWindow (NULL, "Flash MX");
if (hDialog) {
high = BN_CLICKED;
low = IDNO;
SendMessage (hDialog, WM_COMMAND, MAKEWPARAM(low, high), NULL);
//закрываем диалог
break;
}
Sleep (100);
} while (true);
printf ("Main = %Xh, Dialog = %Xh\n", h, hDialog);
return 0;
}