Опубликован: 23.12.2005 | Уровень: специалист | Доступ: платный | ВУЗ: Московский физико-технический институт
Лекция 13:

Методика организации командной работы над 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;
}
Зарина Каримова
Зарина Каримова
Казахстан, Алматы, Гимназия им. Ахмета Байтурсынова №139, 2008
Akiyev Begench
Akiyev Begench
Беларусь, Полоцк, полоцкий государственный университет