掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
TEdgeBrowserへの移行について(参考になれば) (ID:150206)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
既存プログラムのTEdgeBrowserへの移行が苦労しながらもおおむね順調に進んでいます。 個人の感想としては、TWebBrowserと比較として便利な点は多いです。特に、ExecuteScriptでJavaScriptを実行できるのは本当にありがたいです。 ただし、アナウンスに「イベントの多くは、Edge WebView2 コントロールから呼び出されるため、メインのユーザー インターフェイス スレッド以外のスレッドで呼び出される可能性がある点に注意してください。」とあるように、これまではWebBrowser上のマウスの立ち振る舞いを、ApplicationEventsで拾えたものが、スレッドが異なるため拾えなくなるなど、それなりの改修の工夫は必要でした。(Timerで拾うことで解決) ユーザーのパソコンに、Microsoft WebView2 ランタイムのインストールを促す必要があるため、レジストリーの値を読み取ってインストール済かどうか判断し、必要であればインストーラーを起動することにしました。 参考になるかもしれませんので、以下に私が作成したUnit掲載します。 もっと、うまい方法がある方は、書き込みをしてください。 事前準備、 次のUrlから https://go.microsoft.com/fwlink/p/?LinkId=2124703 「MicrosoftEdgeWebview2Setup.exe」がダウンロードできます。 これを、Delphiで作成したプログラムの.exeのあるフォルダに「\bin」を作成しその中にコピーし、配布します。 Delphiのソースの中での使用 Delphiで作成したプログラムの起動時(もしくはTEdgeBrowserを使用するFormのonCreatew)のタイミングで InstallMicrosoftWebView2RunTime()を呼び出すと、 インストール済みかどうか調べて、インストールを開始します。 環境はDelphi Ver10.4、Win10です。 ////// 以下、Unit1本体 /////// unit Unit1; interface uses Windows, SysUtils, Registry, Vcl.Dialogs, Vcl.Controls, Forms; //プログラムの実行をして、その終了を待つ function WinExecAndWait32(FileName: string; Visibility: Integer): Longword; //OSが32bitか64bitか function Is64bitWindows: Boolean; //レジストリーが存在するかどうか function ExistRegKey(RegKey: String): Boolean; //Microsoft WebView2 ランタイムのインストール function InstallMicrosoftWebView2RunTime(): Boolean; implementation //プログラムの実行をして、その終了を待つ function WinExecAndWait32(FileName: string; Visibility: Integer): Longword; var StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; begin FillChar(StartupInfo, SizeOf(StartupInfo), #0); StartupInfo.cb := SizeOf(StartupInfo); StartupInfo.dwFlags := STARTF_USESHOWWINDOW; StartupInfo.wShowWindow := Visibility; if not CreateProcess(nil, PChar(FileName), // pointer to command line string nil, // pointer to process security attributes nil, // pointer to thread security attributes False, // handle inheritance flag CREATE_NEW_CONSOLE or // creation flags NORMAL_PRIORITY_CLASS, nil, // pointer to new environment block nil, // pointer to current directory name StartupInfo, // pointer to STARTUPINFO ProcessInfo) // pointer to PROCESS_INF then Result := WAIT_FAILED else begin WaitForSingleObject(ProcessInfo.hProcess, INFINITE); GetExitCodeProcess(ProcessInfo.hProcess, Result); CloseHandle(ProcessInfo.hProcess); CloseHandle(ProcessInfo.hThread); end; end; { WinExecAndWait32 } //OSが32bitか64bitか function Is64bitWindows: Boolean; var Wow64Proc : function(hProcess: THandle; var Wow64: BOOL): BOOL stdcall; RetFlag : LongBool; begin // Windows Vista以上の場合 @Wow64Proc := GetProcAddress(GetModuleHandle('Kernel32.dll'), 'IsWow64Process'); if @Wow64Proc <> nil then begin Wow64Proc(GetCurrentProcess, RetFlag); if SizeOf(THandle) = 4 then begin Result := RetFlag; end else if SizeOf(THandle) = 8 then begin Result := True; end; end else begin // Windows XPの場合、64ビット版か Result := CheckWin32Version(5, 2); end; end; //レジストリーが存在し値が正常化どうか //検索する Rootkey は HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER function ExistRegKey(RegKey: String): Boolean; var Reg: TRegistry; RegV: String; begin Reg := TRegistry.Create; try Reg.Rootkey := HKEY_LOCAL_MACHINE; Result := Reg.OpenKey(RegKey, False); RegV := Reg.ReadString('pv'); if Result = False then begin Reg.Rootkey := HKEY_CURRENT_USER; Result := Reg.OpenKey(RegKey, False); RegV := Reg.ReadString('pv'); end; finally Reg.CloseKey; Reg.Free; //pvが ''の場合は False if RegV = '' then Result := False; end; end; //Microsoft WebView2 ランタイムのインストール function InstallMicrosoftWebView2RunTime(): Boolean; var PrgName: String; RegKey: String; function InstalledRunTime(): Boolean; var RegKey: String; begin RegKey := 'Software\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}'; if ExistRegKey(RegKey) then begin Result := True; Exit; end else begin if Is64bitWindows then //64bit RegKey := 'SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}' else RegKey := 'SOFTWARE\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}'; if ExistRegKey(RegKey) then begin Result := True; Exit; end else Result := False; end; end; begin //インストール済かどうか if InstalledRunTime() then begin Result := True; Exit; end else begin if MessageDlg('このプログラムでは、Webの表示に Microsoft WebView2 が必要です' + #13#10 + 'Microsoft WebView2ランタイム をインストールをしてよろしいですか' + #13#10 + #13#10 + #13#10 + '管理者権限でないとインストールに失敗する場合があります' + #13#10 + '失敗した場合は、改めて管理者権限で実行してください', mtConfirmation, [mbYes, mbAbort], 0) = mrYes then begin PrgName := (ExtractFilePath(Application.ExeName) + '\bin\MicrosoftEdgeWebview2Setup.exe'); WinExecAndWait32(PrgName, SW_SHOW); //インストールに成功したかどうか、レジストリーを確認 if InstalledRunTime() then begin MessageDlg('インストール成功', mtInformation, [mbClose], 0); Result := True; end else begin MessageDlg('インストール失敗', mtWarning, [mbClose], 0); Result := False; end; end end; end; end. //ここまで、Unit1本体
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.