4 typedef struct _LANGCODEPAGE
8 } LANGCODEPAGE
, *PLANGCODEPAGE
;
11 IsSameObject(IN IUnknown
*punk1
, IN IUnknown
*punk2
)
15 hRet
= punk1
->QueryInterface(IID_PPV_ARG(IUnknown
, &punk1
));
20 hRet
= punk2
->QueryInterface(IID_PPV_ARG(IUnknown
, &punk2
));
29 /* We're dealing with the same object if the IUnknown pointers are equal */
30 return (punk1
== punk2
) ? S_OK
: S_FALSE
;
34 LoadPopupMenu(IN HINSTANCE hInstance
,
35 IN LPCTSTR lpMenuName
)
37 HMENU hMenu
, hSubMenu
= NULL
;
39 hMenu
= LoadMenu(hInstance
,
44 hSubMenu
= GetSubMenu(hMenu
,
46 if (hSubMenu
!= NULL
&&
61 FindSubMenu(IN HMENU hMenu
,
67 mii
.cbSize
= sizeof(mii
);
68 mii
.fMask
= MIIM_SUBMENU
;
70 if (GetMenuItemInfo(hMenu
,
82 GetCurrentLoggedOnUserName(OUT LPTSTR szBuffer
,
83 IN DWORD dwBufferSize
)
88 /* Query the user name from the registry */
89 dwSize
= (dwBufferSize
* sizeof(WCHAR
)) - 1;
90 if (RegQueryValueEx(hkExplorer
,
91 TEXT("Logon User Name"),
95 &dwSize
) == ERROR_SUCCESS
&&
96 (dwSize
/ sizeof(WCHAR
)) > 1 &&
97 szBuffer
[0] != _T('\0'))
99 szBuffer
[dwSize
/ sizeof(WCHAR
)] = _T('\0');
103 /* Fall back to GetUserName() */
104 dwSize
= dwBufferSize
;
105 if (!GetUserName(szBuffer
,
108 szBuffer
[0] = _T('\0');
116 FormatMenuString(IN HMENU hMenu
,
126 /* Find the menu item and read the formatting string */
127 mii
.cbSize
= sizeof(mii
);
128 mii
.fMask
= MIIM_STRING
;
129 mii
.dwTypeData
= (LPTSTR
) szBufFmt
;
130 mii
.cch
= sizeof(szBufFmt
) / sizeof(szBufFmt
[0]);
131 if (GetMenuItemInfo(hMenu
,
136 /* Format the string */
137 va_start(vl
, uFlags
);
139 (sizeof(szBuf
) / sizeof(szBuf
[0])) - 1,
143 szBuf
[(sizeof(szBuf
) / sizeof(szBuf
[0])) - 1] = _T('\0');
145 /* Update the menu item */
146 mii
.dwTypeData
= (LPTSTR
) szBuf
;
147 if (SetMenuItemInfo(hMenu
,
160 GetExplorerRegValueSet(IN HKEY hKey
,
164 WCHAR szBuffer
[MAX_PATH
];
166 DWORD dwType
, dwSize
;
169 StringCbCopy(szBuffer
, sizeof(szBuffer
),
170 TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer"));
171 if (FAILED_UNEXPECTEDLY(StringCbCat(szBuffer
, sizeof(szBuffer
),
174 if (FAILED_UNEXPECTEDLY(StringCbCat(szBuffer
, sizeof(szBuffer
),
178 dwSize
= sizeof(szBuffer
);
179 if (RegOpenKeyEx(hKey
,
183 &hkSubKey
) == ERROR_SUCCESS
)
188 if (RegQueryValueEx(hkSubKey
,
193 &dwSize
) == ERROR_SUCCESS
)
195 if (dwType
== REG_DWORD
&& dwSize
== sizeof(DWORD
))
196 Ret
= *((PDWORD
) szBuffer
) != 0;
198 Ret
= *((PCHAR
) szBuffer
) != 0;
201 RegCloseKey(hkSubKey
);
207 GetVersionInfoString(IN WCHAR
*szFileName
,
208 IN WCHAR
*szVersionInfo
,
212 LPVOID lpData
= NULL
;
213 WCHAR szSubBlock
[128];
214 WCHAR
*lpszLocalBuf
= NULL
;
216 PLANGCODEPAGE lpTranslate
= NULL
;
224 dwLen
= GetFileVersionInfoSize(szFileName
, &dwHandle
);
228 lpData
= HeapAlloc(hProcessHeap
, 0, dwLen
);
232 if (GetFileVersionInfo(szFileName
,
237 UserLangId
= GetUserDefaultLangID();
239 VerQueryValue(lpData
,
240 TEXT("\\VarFileInfo\\Translation"),
241 (LPVOID
*) &lpTranslate
,
244 for (i
= 0; i
< cbTranslate
/ sizeof(LANGCODEPAGE
); i
++)
246 /* If the bottom eight bits of the language id's
247 match, use this version information (since this
248 means that the version information and the users
249 default language are the same). */
250 if ((lpTranslate
[i
].wLanguage
& 0xFF) ==
253 wnsprintf(szSubBlock
,
254 sizeof(szSubBlock
) / sizeof(szSubBlock
[0]),
255 TEXT("\\StringFileInfo\\%04X%04X\\%s"),
256 lpTranslate
[i
].wLanguage
,
257 lpTranslate
[i
].wCodePage
,
260 if (VerQueryValue(lpData
,
262 (LPVOID
*) &lpszLocalBuf
,
265 _tcsncpy(szBuffer
, lpszLocalBuf
, cbBufLen
/ sizeof(*szBuffer
));
273 HeapFree(hProcessHeap
, 0, lpData
);