Форум: "Media";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "Media";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.043 c