1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
|
# user interface
!define GameExplorer_GenerateGUID '!insertmacro GameExplorer_GenerateGUID'
!define GameExplorer_AddGame '!insertmacro GameExplorer_AddGame'
!define GameExplorer_UpdateGame '!insertmacro GameExplorer_UpdateGame'
!define GameExplorer_RemoveGame '!insertmacro GameExplorer_RemoveGame'
# internal stuff
!define CLSCTX_INPROC_SERVER 1
!define IID_IGameExplorer {E7B2FB72-D728-49B3-A5F2-18EBF5F1349E}
!define CLSID_GameExplorer {9A5EA990-3034-4D6F-9128-01F3C61022BC}
!define GIS_CURRENT_USER 2
!define GIS_ALL_USERS 3
!define IGameExplorer_QueryInterface 0
!define IGameExplorer_AddRef 1
!define IGameExplorer_Release 2
!define IGameExplorer_AddGame 3
!define IGameExplorer_RemoveGame 4
!define IGameExplorer_UpdateGame 5
!define IGameExplorer_VerifyAccess 6
# includes
!include LogicLib.nsh
# the actual code
!macro GameExplorer_GenerateGUID
System::Call 'ole32::CoCreateGuid(g .s)'
!macroend
!macro GameExplorer_AddGame CONTEXT GDF INSTDIR EXE GUID
!define __GAME_EXPLORER_UNIQUE "${__LINE__}${__FILE__}"
Push $0
Push $1
Push $R0
Push $R1
Push $R2
Push $R3
Push "${EXE}"
Push "${GUID}"
Push "${INSTDIR}"
Push "${GDF}"
Pop $R0 # == ${GDF}
Pop $R1 # == ${INSTDIR}
Pop $R2 # == ${GUID}
Pop $R3 # == ${EXE}
ClearErrors
System::Call "ole32::CoCreateInstance( \
g '${CLSID_GameExplorer}', i 0, \
i ${CLSCTX_INPROC_SERVER}, \
g '${IID_IGameExplorer}', *i .r1) i .r0"
${If} $0 != 0 # S_OK
SetErrors
Goto "done_${__GAME_EXPLORER_UNIQUE}"
${EndIf}
${If} ${CONTEXT} == AllUsers
System::Call "$1->${IGameExplorer_AddGame}(w R0, w R1, i ${GIS_ALL_USERS}, g R2) i .r0"
${Else}
System::Call "$1->${IGameExplorer_AddGame}(w R0, w R1, i ${GIS_CURRENT_USER}, g R2) i .r0"
${EndIf}
${If} $0 != 0 # S_OK
SetErrors
${EndIf}
System::Call "$1->${IGameExplorer_Release}()"
"done_${__GAME_EXPLORER_UNIQUE}:"
Pop $R3
Pop $R2
Pop $R1
Pop $R0
Pop $1
Pop $0
!undef __GAME_EXPLORER_UNIQUE
!macroend
!macro _GameExplorer_GUID_Function Function GUID
!define __GAME_EXPLORER_UNIQUE "${__LINE__}${__FILE__}"
Push $0
Push $1
Push $2
Push $3
Push $4
Push $5
Push $R0
Push "${GUID}"
Pop $R0 # == ${GUID}
System::Alloc 16
Exch $R0
System::Call "ole32::CLSIDFromString(w s, i R0)"
System::Call "*$R0(i .r2, i .r3, i .r4, i .r5)"
System::Free $R0
ClearErrors
System::Call "ole32::CoCreateInstance( \
g '${CLSID_GameExplorer}', i 0, \
i ${CLSCTX_INPROC_SERVER}, \
g '${IID_IGameExplorer}', *i .r1) i .r0"
${If} $0 != 0 # S_OK
SetErrors
Goto "done_${__GAME_EXPLORER_UNIQUE}"
${EndIf}
System::Call "$1->${Function}(i r2, i r3, i r4, i r5) i .r0"
${If} $0 != 0 # S_OK
SetErrors
${EndIf}
System::Call "$1->${IGameExplorer_Release}()"
"done_${__GAME_EXPLORER_UNIQUE}:"
Pop $R0
Pop $5
Pop $4
Pop $3
Pop $2
Pop $1
Pop $0
!undef __GAME_EXPLORER_UNIQUE
!macroend
!macro GameExplorer_UpdateGame GUID
!insertmacro _GameExplorer_GUID_Function ${IGameExplorer_UpdateGame} "${GUID}"
!macroend
!macro GameExplorer_RemoveGame GUID
!insertmacro _GameExplorer_GUID_Function ${IGameExplorer_RemoveGame} "${GUID}"
!macroend
|