1
0
mirror of https://github.com/salvadordf/CEF4Delphi.git synced 2025-09-30 21:28:55 +02:00

Added more error information to TCefApplication.CheckCEFLibrary

TCefApplication.CheckCEFLibrary now shows the binaries version and it also checks that the DLL and the application are compiled for the same architecture.
This commit is contained in:
Salvador Díaz Fau
2018-09-02 13:11:43 +02:00
parent d16ce93bd5
commit 7342cccbb5
3 changed files with 146 additions and 2 deletions

View File

@@ -186,6 +186,7 @@ type
procedure SetOsmodalLoop(aValue : boolean); procedure SetOsmodalLoop(aValue : boolean);
function GetChromeVersion : string; function GetChromeVersion : string;
function GetLibCefVersion : string;
function GetLibCefPath : string; function GetLibCefPath : string;
function GetChromeElfPath : string; function GetChromeElfPath : string;
function GetMustCreateResourceBundleHandler : boolean; function GetMustCreateResourceBundleHandler : boolean;
@@ -339,6 +340,7 @@ type
property ChromeRelease : uint16 read FChromeVersionInfo.Release; property ChromeRelease : uint16 read FChromeVersionInfo.Release;
property ChromeBuild : uint16 read FChromeVersionInfo.Build; property ChromeBuild : uint16 read FChromeVersionInfo.Build;
property ChromeVersion : string read GetChromeVersion; property ChromeVersion : string read GetChromeVersion;
property LibCefVersion : string read GetLibCefVersion;
property LibCefPath : string read GetLibCefPath; property LibCefPath : string read GetLibCefPath;
property ChromeElfPath : string read GetChromeElfPath; property ChromeElfPath : string read GetChromeElfPath;
property SmoothScrolling : TCefState read FSmoothScrolling write FSmoothScrolling; property SmoothScrolling : TCefState read FSmoothScrolling write FSmoothScrolling;
@@ -635,6 +637,14 @@ begin
Result := FileVersionInfoToString(FChromeVersionInfo); Result := FileVersionInfoToString(FChromeVersionInfo);
end; end;
function TCefApplication.GetLibCefVersion : string;
begin
Result := IntToStr(CEF_SUPPORTED_VERSION_MAJOR) + '.' +
IntToStr(CEF_SUPPORTED_VERSION_MINOR) + '.' +
IntToStr(CEF_SUPPORTED_VERSION_RELEASE) + '.' +
IntToStr(CEF_SUPPORTED_VERSION_BUILD);
end;
function TCefApplication.GetLibCefPath : string; function TCefApplication.GetLibCefPath : string;
begin begin
if (length(FFrameworkDirPath) > 0) then if (length(FFrameworkDirPath) > 0) then
@@ -778,6 +788,8 @@ function TCefApplication.CheckCEFLibrary : boolean;
var var
TempString, TempOldDir : string; TempString, TempOldDir : string;
TempMissingFrm, TempMissingRsc, TempMissingLoc : boolean; TempMissingFrm, TempMissingRsc, TempMissingLoc : boolean;
TempMachine : integer;
TempVersionInfo : TFileVersionInfo;
begin begin
Result := False; Result := False;
@@ -813,14 +825,61 @@ begin
CEF_SUPPORTED_VERSION_MINOR, CEF_SUPPORTED_VERSION_MINOR,
CEF_SUPPORTED_VERSION_RELEASE, CEF_SUPPORTED_VERSION_RELEASE,
CEF_SUPPORTED_VERSION_BUILD) then CEF_SUPPORTED_VERSION_BUILD) then
begin
if GetDLLHeaderMachine(LibCefPath, TempMachine) then
case TempMachine of
IMAGE_FILE_MACHINE_I386 :
if Is32BitProcess then
Result := True Result := True
else
begin
FStatus := asErrorDLLVersion;
TempString := 'Wrong CEF3 binaries !' +
CRLF + CRLF +
'Use the 32 bit CEF3 binaries with 32 bits applications only.';
ShowErrorMessageDlg(TempString);
end;
IMAGE_FILE_MACHINE_AMD64 :
if not(Is32BitProcess) then
Result := True
else
begin
FStatus := asErrorDLLVersion;
TempString := 'Wrong CEF3 binaries !' +
CRLF + CRLF +
'Use the 64 bit CEF3 binaries with 64 bits applications only.';
ShowErrorMessageDlg(TempString);
end;
else
begin
FStatus := asErrorDLLVersion;
TempString := 'Unknown CEF3 binaries !' +
CRLF + CRLF +
'Use only the CEF3 binaries specified in the CEF4Delphi Readme.md file at ' +
CEF4DELPHI_URL;
ShowErrorMessageDlg(TempString);
end;
end
else
Result := True;
end
else else
begin begin
FStatus := asErrorDLLVersion; FStatus := asErrorDLLVersion;
TempString := 'Unsupported CEF version !' + TempString := 'Unsupported CEF version !' +
CRLF + CRLF + CRLF + CRLF +
'Use only the CEF3 binaries specified in the CEF4Delphi Readme.md file at ' + 'Use only the CEF3 binaries specified in the CEF4Delphi Readme.md file at ' +
CRLF + CEF4DELPHI_URL; CEF4DELPHI_URL;
if GetDLLVersion(LibCefPath, TempVersionInfo) then
TempString := TempString + CRLF + CRLF +
'Expected ' + LIBCEF_DLL + ' version : ' + LibCefVersion + CRLF +
'Found ' + LIBCEF_DLL + ' version : ' + FileVersionInfoToString(TempVersionInfo);
ShowErrorMessageDlg(TempString); ShowErrorMessageDlg(TempString);
end; end;

View File

@@ -402,6 +402,18 @@ const
CEF4DELPHI_URL = 'https://github.com/salvadordf/CEF4Delphi'; CEF4DELPHI_URL = 'https://github.com/salvadordf/CEF4Delphi';
CRLF = #13 + #10; CRLF = #13 + #10;
// Bitness constants used in
IMAGE_FILE_MACHINE_UNKNOWN = 0;
IMAGE_FILE_MACHINE_I386 = $014c; // Intel x86
IMAGE_FILE_MACHINE_IA64 = $0200; // Intel Itanium Processor Family (IPF)
IMAGE_FILE_MACHINE_AMD64 = $8664; // x64 (AMD64 or EM64T)
IMAGE_FILE_MACHINE_R3000_BE = $160; // MIPS big-endian
IMAGE_FILE_MACHINE_R3000 = $162; // MIPS little-endian, 0x160 big-endian
IMAGE_FILE_MACHINE_R4000 = $166; // MIPS little-endian
IMAGE_FILE_MACHINE_R10000 = $168; // MIPS little-endian
IMAGE_FILE_MACHINE_ALPHA = $184; // Alpha_AXP }
IMAGE_FILE_MACHINE_POWERPC = $1F0; // IBM PowerPC Little-Endian
implementation implementation
end. end.

View File

@@ -121,6 +121,7 @@ procedure WindowInfoAsWindowless(var aWindowInfo : TCefWindowInfo; aParent : TCe
{$ENDIF} {$ENDIF}
{$IFDEF MSWINDOWS} {$IFDEF MSWINDOWS}
function ProcessUnderWow64(hProcess: THandle; var Wow64Process: BOOL): BOOL; external Kernel32DLL name 'IsWow64Process';
function TzSpecificLocalTimeToSystemTime(lpTimeZoneInformation: PTimeZoneInformation; lpLocalTime, lpUniversalTime: PSystemTime): BOOL; stdcall; external Kernel32DLL; function TzSpecificLocalTimeToSystemTime(lpTimeZoneInformation: PTimeZoneInformation; lpLocalTime, lpUniversalTime: PSystemTime): BOOL; stdcall; external Kernel32DLL;
function SystemTimeToTzSpecificLocalTime(lpTimeZoneInformation: PTimeZoneInformation; lpUniversalTime, lpLocalTime: PSystemTime): BOOL; stdcall; external Kernel32DLL; function SystemTimeToTzSpecificLocalTime(lpTimeZoneInformation: PTimeZoneInformation; lpUniversalTime, lpLocalTime: PSystemTime): BOOL; stdcall; external Kernel32DLL;
@@ -171,6 +172,8 @@ function CheckDLLs(const aFrameworkDirPath : string; var aMissingFiles : string)
function CheckDLLVersion(const aDLLFile : string; aMajor, aMinor, aRelease, aBuild : uint16) : boolean; function CheckDLLVersion(const aDLLFile : string; aMajor, aMinor, aRelease, aBuild : uint16) : boolean;
function FileVersionInfoToString(const aVersionInfo : TFileVersionInfo) : string; function FileVersionInfoToString(const aVersionInfo : TFileVersionInfo) : string;
function CheckFilesExist(var aList : TStringList; var aMissingFiles : string) : boolean; function CheckFilesExist(var aList : TStringList; var aMissingFiles : string) : boolean;
function GetDLLHeaderMachine(const aDLLFile : string; var aMachine : integer) : boolean;
function Is32BitProcess : boolean;
function CefParseUrl(const url: ustring; var parts: TUrlParts): Boolean; function CefParseUrl(const url: ustring; var parts: TUrlParts): Boolean;
function CefCreateUrl(var parts: TUrlParts): ustring; function CefCreateUrl(var parts: TUrlParts): ustring;
@@ -1166,6 +1169,76 @@ begin
(TempVersionInfo.Build = aBuild); (TempVersionInfo.Build = aBuild);
end; end;
// This function is based on the answer given by 'Alex' in StackOverflow
// https://stackoverflow.com/questions/2748474/how-to-determine-if-dll-file-was-compiled-as-x64-or-x86-bit-using-either-delphi
function GetDLLHeaderMachine(const aDLLFile : string; var aMachine : integer) : boolean;
var
TempHeader : TImageDosHeader;
TempImageNtHeaders : TImageNtHeaders;
TempStream : TFileStream;
begin
Result := False;
aMachine := IMAGE_FILE_MACHINE_UNKNOWN;
TempStream := nil;
try
try
if FileExists(aDLLFile) then
begin
TempStream := TFileStream.Create(aDLLFile, fmOpenRead);
TempStream.seek(0, soFromBeginning);
TempStream.ReadBuffer(TempHeader, SizeOf(TempHeader));
if (TempHeader.e_magic = IMAGE_DOS_SIGNATURE) and
(TempHeader._lfanew <> 0) then
begin
TempStream.Position := TempHeader._lfanew;
TempStream.ReadBuffer(TempImageNtHeaders, SizeOf(TempImageNtHeaders));
if (TempImageNtHeaders.Signature = IMAGE_NT_SIGNATURE) then
begin
aMachine := TempImageNtHeaders.FileHeader.Machine;
Result := True;
end;
end;
end;
except
on e : exception do
if CustomExceptionHandler('GetDLLBitness', e) then raise;
end;
finally
if (TempStream <> nil) then FreeAndNil(TempStream);
end;
end;
function Is32BitProcess : boolean;
{$IFDEF MSWINDOWS}
var
TempResult : BOOL;
{$ENDIF}
begin
{$IFDEF CPUX32}
Result := True;
exit;
{$ENDIF}
{$IFDEF WIN32}
Result := True;
exit;
{$ENDIF}
{$IFDEF MSWINDOWS}
Result := ProcessUnderWow64(GetCurrentProcess, TempResult) and TempResult;
exit;
{$ENDIF}
{$IFDEF DELPHI16_UP}
Result := TOSVersion.Architecture in [arIntelX86, arARM32];
{$ELSE}
Result := False;
{$ENDIF}
end;
function CustomPathIsRelative(const aPath : string) : boolean; function CustomPathIsRelative(const aPath : string) : boolean;
begin begin
{$IFDEF DELPHI12_UP} {$IFDEF DELPHI12_UP}