Настройка Inno: IGameExplorer и RemoveGame - PullRequest
2 голосов
/ 30 января 2012

Я использую COM-объект IGameExplorer для регистрации и отмены регистрации игры в Windows Games Explorer из Inno Setup.Хотя добавление игры работает нормально, деинсталлятор вылетает при удалении игры из Обозревателя игр в процедуре «GEUnRegister»

OleCheck(myGEX.RemoveGame(StringToGuid(sGUID)));

Это связано с какой-то ошибкой в ​​интерфейсе IGameExplorer или что я пропускаю?Любая помощь приветствуется!:)

const
  CLSID_GameExplorer = '{9a5ea990-3034-4d6f-9128-01f3c61022bc}';
  GIS_CURRENT_USER = 2;
  GIS_ALL_USERS = 3;

type
  IGameExplorer = interface(IUnknown)
    '{E7B2FB72-D728-49B3-A5F2-18EBF5F1349E}'
    function AddGame(sGDFBinaryPath: String; sInstallDirectory: String; installScope: Word; var pguidInstanceID: TGUID): HResult;
    function RemoveGame(instanceID: TGUID): HResult;
    function UpdateGame(instanceID: TGUID): HResult;
    function VerifyAccess(sGDFBinaryPath: String; var pHasAccess: Boolean): HResult;
  end;

procedure GERegister;
var
  myGEX:   IGameExplorer;
  myGUID:  TGUID;
  o:       IUnknown;
  bAccess: Boolean;
  sGUID:   String;
begin
  o := CreateComObject(StringToGuid(CLSID_GameExplorer));
  myGEX := IGameExplorer(o);
  OleCheck(myGEX.VerifyAccess(ExpandConstant('{app}\mygame.exe'), bAccess));
  if bAccess then
  begin
    myGUID := StringToGuid('{00000000-0000-0000-0000-000000000000}'); 
    OleCheck(myGEX.AddGame(ExpandConstant('{app}\mygame.exe'), ExpandConstant('{app}'), GIS_ALL_USERS, myGUID));
    //write guid to registry
    sGUID := Format('{%.8x-%.4x-%.4x-%.2x%.2x-%.2x%.2x%.2x%.2x%.2x%.2x}', [myGUID.D1, myGUID.D2, myGUID.D3, myGUID.D4[0], myGUID.D4[1], myGUID.D4[2], myGUID.D4[3], myGUID.D4[4], myGUID.D4[5], myGUID.D4[6], myGUID.D4[7]]);
    RegWriteStringValue(HKEY_CURRENT_USER, 'Software\My Publisher\My Game',
    'ge_guid', sGUID);
  end;
end;

procedure GEUnRegister;
var
  myGEX:   IGameExplorer;
  o:       IUnknown;
  sGUID:   String;
begin
  o := CreateComObject(StringToGuid(CLSID_GameExplorer));
  myGEX := IGameExplorer(o);
  sGUID := '';
  if RegKeyExists(HKEY_CURRENT_USER, 'Software\My Publisher\My Game') then
  begin
    RegQueryStringValue(HKEY_CURRENT_USER, 'Software\My Publisher\My Game',
      'ge_guid', sGUID);
    if sGUID <> '' then
    begin
      OleCheck(myGEX.RemoveGame(StringToGuid(sGUID)));   // <--- crashes the uninstaller
    end;
  end;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...