ISFlash

DLL ISFlash 0.0.2

Нет прав для скачивания

VoLT

Мимокрокодил
Проверенный
Пользователь VoLT разместил новый ресурс:

ISFlash - Плагин для отображение swf файлов в инсталляторах Inno Setup.

Информация:

Описание:
Это плагин позволит вам добавить поддержку Adobe Flash (отображать swf файлы) в Inno Setup.​
Узнать больше об этом ресурсе...
 

Аким

Новичок
У некоторых пользователей выдает ошибку.
У двоих человек с одинаковой ОС, у одного проигрывает у другого выдает ошибку.
Что должно быть установлено в ОС для корректного проигрывания этого плагина?
ошибка флеша.jpg
 

El Sanchez

Новичок
У двоих человек с одинаковой ОС, у одного проигрывает у другого выдает ошибку.
По адресу 10001136 лежит команда mov ecx, [eax] (помещение в ecx содержимого по адресу, хранящемуся в eax), чуть ранее выполняется mov eax, dword_1000F044 (значение переменной занести в eax), в dword_1000F044 должен лежать адрес указателя на интерфейс IShockwaveFlash. Но т.к. результат вызова CoCreateInstance в библиотеке не проверяется и в dword_1000F044 ничего не попадает, то при выполнении команды по адресу 10001136 в eax 0 будет лежать, читать с такого адреса ну никак нельзя.
Также в библиотеке не нужны ни GetWindow, ни субклассирование контейнера для флэша, чтобы нельзя было контекстное меню на флэше вызвать, достаточно контейнер disabled сделать.
Что должно быть установлено в ОС для корректного проигрывания этого плагина?
Правильно зарегистрированный ocx FlashPlayer'а.

Да, сабж без сторонних библиотек:
Код:
[Setup]
AppName=test
AppVerName=test
DefaultDirName={tmp}
DirExistsWarning=no
Uninstallable=no
CreateUninstallRegKey=no

[Files]
Source: 1.swf; Flags: dontcopy

[Code]
#define A = (Defined UNICODE) ? "W" : "A"
const
  WS_CHILD = $40000000;
  WS_VISIBLE = $10000000;
  WS_CLIPSIBLINGS = $04000000;
  WS_DISABLED = $08000000;
  HWND_BOTTOM = 1;
  IShockwaveFlash_Prop_Width = 8;
  IShockwaveFlash_Prop_Height = 9;

function CreateWindowEx(dwExStyle: DWORD; lpClassName, lpWindowName: string; dwStyle: DWORD; x, y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: HMENU; hInstance, lpParam: Longint): HWND; external 'CreateWindowEx{#A}@user32.dll stdcall';
function DestroyWindow(hWnd: HWND): BOOL; external 'DestroyWindow@user32.dll stdcall';
function AtlAxAttachControl(pControl: IDispatch; hWnd: HWND; out ppUnkContainer: Longint): HRESULT; external 'AtlAxAttachControl@atl.dll stdcall';
function SetWindowPos(hWnd, hWndInsertAfter: HWND; X, Y, cx, cy: Integer; uFlags: UINT): BOOL; external 'SetWindowPos@user32.dll stdcall';
function GetSysColor(nIndex: Integer): DWORD; external 'GetSysColor@user32.dll stdcall';

var
  hWndFlash: HWND;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function CreateFlashWindow(hWndParent: HWND; x, y, cx, cy: Integer; crBackground: TColor; szFileName: string): HWND;
(*
* hWndParent  : A handle to the parent or owner window of the window being created.
* x           : The initial horizontal position of the window.
* y           : The initial vertical position of the window.
* cx          : The width, in device units, of the window. Set to -1 to get width from flash movie
* cy          : The height, in device units, of the window. Set to -1 to get height from flash movie
* crBackground: The flash movie background color
* szFileName  : Path to flash movie file
*)
var
  objFlash: Variant;
  hr: HRESULT;
  lppv: Longint;
begin
  if not FileExists(szFileName) then Exit;
  try
    objFlash := CreateOleObject('ShockwaveFlash.ShockwaveFlash');
  except
    RaiseLastException;
  end;
  Result := CreateWindowEx(0, 'Message', '', WS_VISIBLE or WS_CHILD or WS_CLIPSIBLINGS or WS_DISABLED, 0, 0, 0, 0, hWndParent, 0, HInstance, 0);
  if Result = 0 then Exit;
  hr := AtlAxAttachControl(IDispatch(objFlash), Result, lppv);
  if hr <> 0 then Exit;
  objFlash.Movie := szFileName;
  while (objFlash.PercentLoaded <> 100) do
    Application.ProcessMessages;
  if crBackground < 0 then
    objFlash.BackgroundColor := GetSysColor(crBackground and $000000FF)
  else
    objFlash.BackgroundColor := crBackground;
  if cx = -1 then
    cx := Round(objFlash.TGetPropertyAsNumber('/', IShockwaveFlash_Prop_Width));
  if cy = -1 then
    cy := Round(objFlash.TGetPropertyAsNumber('/', IShockwaveFlash_Prop_Height));
  SetWindowPos(Result, HWND_BOTTOM, x, y, cx, cy, 0);
end;

/////////////////////////////////////////
procedure DestroyFlashWindow(hWnd: HWND);
begin
  if hWnd <> 0 then
    DestroyWindow(hWnd);
end;

//////////////////////////
procedure InitializeWizard;
begin
  WizardForm.OuterNotebook.Hide;
  ExtractTemporaryFile('1.swf');
  hWndFlash := CreateFlashWindow(WizardForm.Handle, 0, 0, -1, -1, WizardForm.Color, ExpandConstant('{tmp}\1.swf'));
end;

////////////////////////////
procedure DeinitializeSetup;
begin
  DestroyFlashWindow(hWndFlash);
end;
 

Аким

Новичок
Скомпилировал ваш пример, провели тесты. У 2х человек не работает.
Как быть?

 

El Sanchez

Новичок
Скомпилировал ваш пример, провели тесты. У 2х человек не работает.
Как быть?
Аким, я же сказал, нужен правильно зарегистрированный ocx FlashPlayer'а. Данный ProgID (ShockwaveFlash.ShockwaveFlash) относится к ActiveX-компоненту Flash Player (скачать можно здесь: http://www.adobe.com/ru/products/flashplayer/distribution3.html), а не Shockwave Player, это разные вещи. Да, и Adobe Flash Player 20 PPAPI это тоже не то, это чисто гугловская поделка cо своим PPAPI.
 
Сверху