CreateComObject(...)
レジストリエントリHKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\...\LocalServer32
が有効であることを確認した後に基本的に呼び出すコードがいくつかあります。
問題は、レジストリ キーをチェックしないと、COM サーバーが正しく読み込まれないことです。
そんなことがあるものか?
const
csLibGuid : TGUID = '...';
csLibMd5Sum : string = '...';
csLibRegKeyFormatRegular : string = '\SOFTWARE\Classes\CLSID\%s\LocalServer32';
csLibRegKeyFormatWow64 : string = '\SOFTWARE\Classes\Wow6432Node\CLSID\%s\LocalServer32';
csLibClassName : string = '...';
procedure TLibLoader.CheckLibraryChecksum;
var
FileNames : TStringList;
Registry : TRegistry;
procedure AddFileName(AHKEY: HKEY; const AFormat: string);
begin
Registry.RootKey := AHKEY;
Registry.OpenKey(
Format(AFormat, [GUIDToString(csLibGuid)])
, False
);
try
FileName := Registry.ReadString(csEmpty);
if Trim(FileName) > csEmpty then begin
FileNames.Add(FileName);
end;
finally
Registry.CloseKey;
end;
end;
var
FileName : string;
FileDigest : string;
begin
Registry := TRegistry.Create(KEY_EXECUTE);
try
FileNames := TStringList.Create;
try
FileNames.Duplicates := dupIgnore;
FileNames.Sorted := True;
AddFileName(HKEY_LOCAL_MACHINE, csLibRegKeyFormatRegular);
AddFileName(HKEY_LOCAL_MACHINE, csLibRegKeyFormatWoW64);
AddFileName(HKEY_CURRENT_USER , csLibRegKeyFormatRegular);
AddFileName(HKEY_CURRENT_USER , csLibRegKeyFormatWoW64);
if FileNames.Count = 0 then begin
raise EProtector.Create('All registry keys are empty');
end;
for FileName in FileNames do begin
if not FileExists(FileName) then begin
raise Exception.Create(Format('File "%s" does not exist', [FileName]));
end;
FileDigest := TMD5.HashFile(FileName);
if not AnsiSameText(FileDigest, csLibMd5Sum) then begin
raise Exception.Create(Format('File "%s" is not valid', [FileName]));
end;
end;
finally
FileNames.Free;
end;
finally
Registry.Free;
end;
end;
CheckLibraryChecksum;
CreateComObject(csLibGuid);