Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.25;
Скачать: CL | DM;

Вниз

flash и дельфи   Найти похожие ветки 

 
hagen ©   (2004-01-19 23:13) [0]

Есть прога, которая на  OnCreate проигрывает зашитый в себя flash-ролик. На компе с неустановленным флэшем она, ессно, виснет. Подскажите решение одного из 2 способов:
1)Как определить, проинсталлен ли флэш в системе?
2)Какие библиотеки можно вшить в exe, чтобы всё работало везде?


 
_none_ ©   (2004-01-21 18:59) [1]

это делается как-то так:


const
 SW_FLASH_PATH_KEY = "\TypeLib\{D27CDB6B-AE6D-11CF-96B8-444553540000}\1.0\0\win32";

function WinExecAndWait32(FileName: String; Visibility: Integer;
 Wait: Boolean): Cardinal;
var zAppName: array[0..512] of char;
   zCurDir: array[0..255] of char;
   WorkDir: String;
   StartupInfo  : TStartupInfo;
   ProcessInfo  : TProcessInformation;
begin
 StrPCopy(zAppName, FileName);
 GetDir(0, WorkDir);
 StrPCopy(zCurDir, WorkDir);
 FillChar(StartupInfo, Sizeof(StartupInfo), #0);
 StartupInfo.cb := Sizeof(StartupInfo);
 StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
 StartupInfo.wShowWindow := Visibility;

 if (not CreateProcess(nil, zAppName, nil, nil, false, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
    nil, zCurDir, StartupInfo, ProcessInfo)) then
 begin
   Result := $FFFFFFFF;
   MessageBox(Application.Handle, PChar(SysErrorMessage(GetLastError)),
     "Register Error!", 0);
 end
 else
 begin
   if not Wait then
     exit;
   WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
   GetExitCodeProcess(ProcessInfo.hProcess, Result);
   CloseHandle(ProcessInfo.hProcess);
   CloseHandle(ProcessInfo.hThread);
 end;
end;

procedure GetFileVersion(FileName: string; var Major1, Major2, Minor1, Minor2: Integer);
var
 Info: Pointer;
 InfoSize: DWORD;
 FileInfo: PVSFixedFileInfo;
 FileInfoSize: DWORD;
 Tmp: DWORD;
begin
 InfoSize := GetFileVersionInfoSize(PChar(FileName), Tmp);
 if InfoSize = 0 then
   raise Exception.Create("Can""t get file version information for " + FileName);
 GetMem(Info, InfoSize);
 try
   GetFileVersionInfo(PChar(FileName), 0, InfoSize, Info);
   VerQueryValue(Info, "\", Pointer(FileInfo), FileInfoSize);
   Major1 := FileInfo.dwFileVersionMS shr 16;
   Major2 := FileInfo.dwFileVersionMS and $FFFF;
   Minor1 := FileInfo.dwFileVersionLS shr 16;
   Minor2 := FileInfo.dwFileVersionLS and $FFFF;
 finally
   FreeMem(Info, FileInfoSize);
 end;
end;

type
TRegFunc = function : HResult; stdcall;

var
 aSystemDirZ: array[0..2047] of Char; //системная директория
 aShortPath: array[0..2047] of Char;  
 fSystemDir: String;                  
 aCommand: String;
 aHandle: Cardinal;
 ResStream: TResourceStream;
 FileStream: TFileStream;
 HLibModule: Cardinal;
 aFunc: TRegFunc;
 _Reg: TRegistry;
 _ExistingOCXName: string;
 VersionMajor, VersionMinor, Release, Build: Integer;
 _FlashInstRequired: Boolean;
 _tmpStr1, _tmpStr2: WideString;
begin
//проверка наличия флэша и в случае отсутствия - установка его
 //проверка текущей версии флэша
 _FlashInstRequired := True;
 _Reg := TRegistry.Create(KEY_READ);
 try
   _Reg.RootKey := HKEY_CLASSES_ROOT;
   if _Reg.KeyExists(SW_FLASH_PATH_KEY) then
   begin
     _Reg.OpenKey(SW_FLASH_PATH_KEY, False);
     _ExistingOCXName := _Reg.ReadString("");
     if FileExists(_ExistingOCXName) then
     begin
       GetFileVersion(_ExistingOCXName, VersionMajor, VersionMinor, Release, Build);    // Get the file version
       _FlashInstRequired := (
          (VersionMajor < 7) or
          ((VersionMajor = 7) and (VersionMinor < 0)) or
          ((VersionMajor = 7) and (VersionMinor = 0) and (Release < 14)));
//        Showmessage(Format("ver. %d.%d.%d.%d", [VersionMajor, VersionMinor, Release, Build]));
     end;
   end;
 finally
   _Reg.Free;
 end;

 if _FlashInstRequired then
 begin
   GetSystemDirectory(aSystemDirZ, 2047);
   fSystemDir := aSystemDirZ;
   try
     begin //ставлю флэш
       //извлекаю из dll-ки файл
       HLibModule := LoadLibrary(PAnsiChar("FLASH.DLL"));
       ResStream := TResourceStream.Create(HLibModule, "MEDFLASH", RT_RCDATA);
       try
          FileStream := TFileStream.Create(IncludeTrailingPathDelimiter(fSystemDir) + "FLASH.OCX", fmCreate);
         try
           FileStream.CopyFrom(ResStream, 0);
         finally
           FileStream.Free;
         end;
       finally
         ResStream.Free;
         FreeLibrary(HLibModule);
       end;

       aHandle := LoadLibrary(PAnsiChar(IncludeTrailingPathDelimiter(fSystemDir) + "FLASH.OCX"));
       try
         if (aHandle >= 32) then
         begin
           aFunc := GetProcAddress( aHandle, "DllRegisterServer" );
           if Assigned(aFunc) then
           begin
             GetShortPathName(PAnsiChar(IncludeTrailingPathDelimiter(fSystemDir) + "FLASH.OCX"), aShortPath, 2047);
             aCommand := Format("%s\regsvr32.exe /s %s", [fSystemDir, aShortPath]);
             WinExecAndWait32(aCommand, SW_HIDE, True);
           end;
         end;
       finally
         FreeLibrary(aHandle);
       end;
     end;
   except  //невозможно установить флэш проигрыватель
     _tmpStr1 := StringToWideStringEx(_MSG_CANNOT_INSTALL_FLASH_, 1251);
     _tmpStr2 := StringToWideStringEx(_MSG_ERROR, 1251);
     MessageBoxExW(Application.Handle, PWideChar(_tmpStr1),
       PWideChar(_tmpStr2), MB_OK or MB_ICONSTOP, 1251);
     Halt;
   end;
 end;
end.



Страницы: 1 вся ветка

Текущий архив: 2004.04.25;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.045 c
1-1081513836
ivan
2004-04-09 16:30
2004.04.25
рисование поверх компонентов


14-1080925674
SergP
2004-04-02 21:07
2004.04.25
Что за прикол такой?


14-1080819455
Dmitriy O.
2004-04-01 15:37
2004.04.25
Невезуха !


1-1081240057
York
2004-04-06 12:27
2004.04.25
Процедура поиска


4-1077166914
@ac
2004-02-19 08:01
2004.04.25
Как определить, что винда русифицирована?