2011-03-28 70 views
0

我想我的游戏添加到GE用InnoSetup,我使用这个脚本(唯一编码):创新安装和游戏浏览器(GAMEUX)

[CODE] 
type TGUID   = record Data1: Cardinal; Data2, Data3: Word; Data4: array [0..8] of Char; end; 

const PlayTask = 0; 
     SupportTask = 1; 
var GameuxGUID: TGUID; 

function GenerateGUID(var GUID: TGUID): Cardinal; external '[email protected]:GameuxInstallHelper.dll stdcall setuponly'; 
function AddToGameExplorer(Binary: String; Path: String; InstallType: Integer; var GUID: TGUID): Cardinal; external '[email protected]:GameuxInstallHelper.dll stdcall setuponly'; 
function CreateTask(InstallType: Integer; var GUID: TGUID; TaskType: Integer; TaskNumber: Integer; TaskName: String; Binary: String; Parameters: String): Cardinal; external '[email protected]:GameuxInstallHelper.dll stdcall setuponly'; 
function RetrieveGUIDForApplication(Binary: String; var GUID: TGUID): Cardinal; external '[email protected]{app}\installer\GameuxInstallHelper.dll stdcall uninstallonly'; 
function RemoveFromGameExplorer(var GUID: TGUID): Cardinal; external '[email protected]{app}\installer\GameuxInstallHelper.dll stdcall uninstallonly'; 
function RemoveTasks(var GUID: TGUID): Cardinal; external '[email protected]{app}\installer\GameuxInstallHelper.dll stdcall uninstallonly'; 

function IntToHex(Int: Cardinal; Digits: Integer): String; var i, Digit: Integer; ch: Byte; 
begin 
    result:=''; 
    for i:=0 to Digits-1 do 
    begin 
    digit:=Int mod 16; 
    Int:=Int div 16; 
    if digit<0 then 
     digit:=digit+16; 
     ch:=Ord('0')+digit; 
     if digit>9 then 
     ch:=ch+7; 
     result:=chr(ch)+result; 
    end; 
end; 

function GetGUID(GGUID: TGUID): String; var i: Integer; 
begin 
    result:='{'+IntToHex(GGUID.Data1, 8)+'-'+IntToHex(GGUID.Data2, 4)+'-'+IntToHex(GGUID.Data3, 4)+'-'+IntToHex(Ord(GGUID.Data4[0]), 2)+IntToHex(Ord(GGUID.Data4[1]), 2)+'-'; 
    for i:=2 to 7 do result:=result+IntToHex(Ord(GGUID.Data4[i]), 2); result:=result+'}'; 
end; 

procedure GDFInstall(Binary, MainExe: String); 
begin 
    GenerateGUID(GameuxGUID); 
    AddToGameExplorer(ExpandConstant(Binary), ExpandConstant('{app}'), 3, GameuxGUID); 

    CreateTask(3, GameuxGUID, PlayTask, 0, 'Play', ExpandConstant(MainExe), ''); 
end; 

**procedure win7fix;** 
    var regGDF: Cardinal; 
begin 
    if RegQueryDWordValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\GameUX\Games\'+GetGUID(GameuxGUID), 'IsSigned', regGDF) then 
    if regGDF=0 then 
     if RegDeleteValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\GameUX\Games\'+GetGUID(GameuxGUID), 'IsSigned') then 
     RegWriteDWordValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\GameUX\Games\'+GetGUID(GameuxGUID), 'IsSigned', 1); 
end; 

procedure CurStepChanged(CurStep: TSetupStep); 
    var Version: TWindowsVersion; 
begin 
    GetWindowsVersionEx(Version); 
    if (CurStep = ssPostInstall) and Version.NTPlatform and (Version.Major > 5) then begin 
    GDFInstall('{#GDFBinary}', '{#GDFExe}'); 
     win7fix; 
    end; 
end; 

但“win7fix”程序没有按”工作。 这对于Windows 7是因为如果我创建我自己的GDF定义dll文件,它没有签名,游戏资源管理器不显示一些信息,如评级。 但是,如果我编辑注册表项“已签名”手动从0到1它显示。 如何使用inno自动编辑生成的guid的这个(双字)条目?

+0

_doesn't WORK_是不是你有问题的一个很好的说明,请详细说明和回答这个问题:你确定的函数被调用?你有错误吗?如果没有,在哪些ifs功能不起作用? – jachguate 2011-03-28 20:57:37

+0

是的,它增加了GE,但注册表没有改变。 我不知道程序是否正常,我只需要一个帮助,以制作一个适当的程序“win7fix”,它可以写入注册表并编辑游戏guid的IsSigned值。 – user680108 2011-03-29 08:36:10

+0

@user您是否知道可以在inno setup编译器程序(gui)中调试iss脚本?如果例行程序不工作,您可以在开始行放置一个断点并逐步执行,以便您自己发现错误。 – jachguate 2011-03-29 15:10:56

回答

3

问题的根源是你想读&写入注册表的32位树Win7x64但GameuxInstallHelper.dll将编写的游戏信息到64位的树什么。 我用你的程序代码在我的项目,那就是:

procedure win7fix; 
    var regGDF: Cardinal; 
    var GUXPath: string; 
begin 
GUXPath := 'Software\Microsoft\Windows\CurrentVersion\GameUX\Games\' + GetGUID(GameuxGUID); 
    if isWin64 then 
    begin 
    if RegQueryDWordValue(HKLM64, GUXPath, 'IsSigned', regGDF) then 
     if regGDF=0 then 
     if RegDeleteValue(HKLM64, GUXPath, 'IsSigned') then 
      RegWriteDWordValue(HKLM64, GUXPath, 'IsSigned', 1); 
    end 
    else 
    begin 
    if RegQueryDWordValue(HKLM, GUXPath, 'IsSigned', regGDF) then 
     if regGDF=0 then 
     if RegDeleteValue(HKLM, GUXPath, 'IsSigned') then 
      RegWriteDWordValue(HKLM, GUXPath, 'IsSigned', 1); 
    end; 
end;