| Skyggedans |
16.10.2009 15:49 |
Цитата:
Сообщение от Peregrin.ru
(Сообщение 857992)
а можно поподробней?
|
Ну выглядит примерно так:
Берем установленное AIR-приложение, туда копируем мой экзешник, а из каталога установки AIR копируем Abobe AIR.dll и папку Resources (на самом деле достаточно наличия в ней WebKit.dll и NPSWF32.dll). Теперь достаточно запустить лаунчер и прога будет работать на локальной копии рантайма.
А работает лаунчер так:
Сначала проверяет наличие файла %USERPROFILE%\Application Data\Adobe\AIR\eulaAccepted - его наличие означает что юзверь подтвердил пользовательское соглашение (без него ничего работать не будет), если файла нет - создает его.
Потом вызывает точку входа в Adobe AIR.dll - AppEntryWinMain(). Первый параметр - хэндл экзешника(самого лаунчера), второй - хэндл ДЛЛ-ки.
Короче, вот код на Делфе:
Код:
program AIR;
uses
Windows, SysUtils, ShlObj;
{$R *.RES}
var
AppEntryWinMain: procedure(exeHandle, dllHandle: HMODULE); stdcall;
SetDllDirectory: function(lpPathName: PAnsiChar): LongBool; stdcall;
dllHandle: HMODULE;
appDataPath: array[1..MAX_PATH] of Char;
airDir, eulaAcceptedFile: string;
const
CSIDL_APPDATA = $001A;
begin
Set8087CW($133F);
SHGetSpecialFolderPath(0, PAnsiChar(@appDataPath), CSIDL_APPDATA, False);
airDir := StrPas(@appDataPath) + '\Adobe\AIR';
eulaAcceptedFile := airDir + '\eulaAccepted';
if not FileExists(eulaAcceptedFile) then begin
if not DirectoryExists(airDir) then
ForceDirectories(airDir);
CloseHandle(CreateFile(PAnsiChar(eulaAcceptedFile), GENERIC_READ, FILE_SHARE_READ,
nil, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0));
end;
dllHandle := GetModuleHandle(PAnsiChar('kernel32'));
if dllHandle <> 0 then begin
@SetDllDirectory := GetProcAddress(dllHandle, PAnsiChar('SetDllDirectoryA'));
if Assigned(SetDllDirectory) then begin
SetDllDirectory(PAnsiChar(ExtractFilePath(ParamStr(0))));
SetDllDirectory(PAnsiChar(ExtractFilePath(ParamStr(0)) + '\Resources'));
end;
end;
dllHandle := LoadLibrary(PChar('Adobe AIR.dll'));
if dllHandle <> 0 then begin
@AppEntryWinMain := GetProcAddress(DllHandle, PChar('AppEntryWinMain'));
if Assigned(AppEntryWinMain) then
AppEntryWinMain(GetModuleHandle(nil), dllHandle);
FreeLibrary(dllHandle);
end;
end.
Надо заметить, что эта штука нарушает как минимум два пункта лицензии на редистрибуцию AIR - обход процедуры установки, и обход показа пользователю и подтверждение им EULA. Но для нужд небольшой компании сойдет.
|