2011-03-28 3 views
0

내가 innosetup, 나는이 스크립트를 사용하고 있습니다 (코드 만)와 GE에 내 게임을 추가하기 위해 노력하고있어 : '이노 설정 및 게임 탐색기 (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"절차 일하지 마라. 이것은 내 자신의 GDF 정의 dll 파일을 만들면 서명되지 않았고 게임 탐색기가 등급과 같은 일부 정보를 표시하지 않기 때문에 Windows 7 용입니다. 하지만 레지스트리 키를 "issigned"수동으로 편집하면 0에서 1로 표시됩니다. 생성 된 guid에 대해이 (dword) 항목을 자동으로 편집하려면 inno를 어떻게 사용합니까?

+0

_doesn't의 WORK_입니다하지 당신이 가지고있는 문제의 좋은 설명 : 나는 여기있다, 내 프로젝트에 프로 시저 코드를 사용하면 함수가 호출되어 있는지입니까? 오류가 발생합니까? 그렇지 않다면 if 중 어느 것이 작동하지 않는가? – jachguate

+0

예 GE에 추가되지만 레지스트리는 변경되지 않습니다. 절차가 정상적인 지 모르겠다. 레지스트리에 쓸 수 있고 게임 안내에 대한 IsSigned 값을 편집 할 수있는 적절한 절차 "win7fix"를 만들려면 도움이 필요하다. – user680108

+0

@user inno setup 컴파일러 프로그램 (gui)에서 iss 스크립트를 디버깅 할 수 있다는 것을 알고 있습니까? 루틴이 작동하지 않는 경우 시작 줄에 중단 점을 넣고 그 시점에서 단계별로 실행할 수 있습니다. 그러면 스스로 잘못된 점을 찾을 수 있습니다. – jachguate

답변

3

문제의 뿌리는 &는 64 비트 트리 게임 정보를 작성합니다 Win7x64하지만 GameuxInstallHelper.dll에서 레지스트리의 32 비트 트리 쓰기 읽으려는 것입니다. 정교이 대답하시기 바랍니다

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; 
관련 문제