📄 ordinal.c
字号:
*
* PARAMS
* lpszDest [O] Destination for Id string
* dwDestLen [I] Length of lpszDest
*
* RETURNS
* TRUE, If the string was created successfully
* FALSE, Otherwise
*/
BOOL WINAPI SHAboutInfoA(LPSTR lpszDest, DWORD dwDestLen)
{
WCHAR buff[2084];
TRACE("(%p,%d)\n", lpszDest, dwDestLen);
if (lpszDest && SHAboutInfoW(buff, dwDestLen))
{
WideCharToMultiByte(CP_ACP, 0, buff, -1, lpszDest, dwDestLen, NULL, NULL);
return TRUE;
}
return FALSE;
}
/*************************************************************************
* @ [SHLWAPI.161]
*
* Unicode version of SHAboutInfoA.
*/
BOOL WINAPI SHAboutInfoW(LPWSTR lpszDest, DWORD dwDestLen)
{
static const WCHAR szIEKey[] = { 'S','O','F','T','W','A','R','E','\\',
'M','i','c','r','o','s','o','f','t','\\','I','n','t','e','r','n','e','t',
' ','E','x','p','l','o','r','e','r','\0' };
static const WCHAR szWinNtKey[] = { 'S','O','F','T','W','A','R','E','\\',
'M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s',' ',
'N','T','\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n','\0' };
static const WCHAR szWinKey[] = { 'S','O','F','T','W','A','R','E','\\',
'M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\',
'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\0' };
static const WCHAR szRegKey[] = { 'S','O','F','T','W','A','R','E','\\',
'M','i','c','r','o','s','o','f','t','\\','I','n','t','e','r','n','e','t',
' ','E','x','p','l','o','r','e','r','\\',
'R','e','g','i','s','t','r','a','t','i','o','n','\0' };
static const WCHAR szVersion[] = { 'V','e','r','s','i','o','n','\0' };
static const WCHAR szCustomized[] = { 'C','u','s','t','o','m','i','z','e','d',
'V','e','r','s','i','o','n','\0' };
static const WCHAR szOwner[] = { 'R','e','g','i','s','t','e','r','e','d',
'O','w','n','e','r','\0' };
static const WCHAR szOrg[] = { 'R','e','g','i','s','t','e','r','e','d',
'O','r','g','a','n','i','z','a','t','i','o','n','\0' };
static const WCHAR szProduct[] = { 'P','r','o','d','u','c','t','I','d','\0' };
static const WCHAR szUpdate[] = { 'I','E','A','K',
'U','p','d','a','t','e','U','r','l','\0' };
static const WCHAR szHelp[] = { 'I','E','A','K',
'H','e','l','p','S','t','r','i','n','g','\0' };
WCHAR buff[2084];
HKEY hReg;
DWORD dwType, dwLen;
TRACE("(%p,%d)\n", lpszDest, dwDestLen);
if (!lpszDest)
return FALSE;
*lpszDest = '\0';
/* Try the NT key first, followed by 95/98 key */
if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szWinNtKey, 0, KEY_READ, &hReg) &&
RegOpenKeyExW(HKEY_LOCAL_MACHINE, szWinKey, 0, KEY_READ, &hReg))
return FALSE;
/* OS Version */
buff[0] = '\0';
dwLen = 30;
if (!SHGetValueW(HKEY_LOCAL_MACHINE, szIEKey, szVersion, &dwType, buff, &dwLen))
{
DWORD dwStrLen = strlenW(buff);
dwLen = 30 - dwStrLen;
SHGetValueW(HKEY_LOCAL_MACHINE, szIEKey,
szCustomized, &dwType, buff+dwStrLen, &dwLen);
}
StrCatBuffW(lpszDest, buff, dwDestLen);
/* ~Registered Owner */
buff[0] = '~';
dwLen = 256;
if (SHGetValueW(hReg, szOwner, 0, &dwType, buff+1, &dwLen))
buff[1] = '\0';
StrCatBuffW(lpszDest, buff, dwDestLen);
/* ~Registered Organization */
dwLen = 256;
if (SHGetValueW(hReg, szOrg, 0, &dwType, buff+1, &dwLen))
buff[1] = '\0';
StrCatBuffW(lpszDest, buff, dwDestLen);
/* FIXME: Not sure where this number comes from */
buff[0] = '~';
buff[1] = '0';
buff[2] = '\0';
StrCatBuffW(lpszDest, buff, dwDestLen);
/* ~Product Id */
dwLen = 256;
if (SHGetValueW(HKEY_LOCAL_MACHINE, szRegKey, szProduct, &dwType, buff+1, &dwLen))
buff[1] = '\0';
StrCatBuffW(lpszDest, buff, dwDestLen);
/* ~IE Update Url */
dwLen = 2048;
if(SHGetValueW(HKEY_LOCAL_MACHINE, szWinKey, szUpdate, &dwType, buff+1, &dwLen))
buff[1] = '\0';
StrCatBuffW(lpszDest, buff, dwDestLen);
/* ~IE Help String */
dwLen = 256;
if(SHGetValueW(hReg, szHelp, 0, &dwType, buff+1, &dwLen))
buff[1] = '\0';
StrCatBuffW(lpszDest, buff, dwDestLen);
RegCloseKey(hReg);
return TRUE;
}
/*************************************************************************
* @ [SHLWAPI.163]
*
* Call IOleCommandTarget_QueryStatus() on an object.
*
* PARAMS
* lpUnknown [I] Object supporting the IOleCommandTarget interface
* pguidCmdGroup [I] GUID for the command group
* cCmds [I]
* prgCmds [O] Commands
* pCmdText [O] Command text
*
* RETURNS
* Success: S_OK.
* Failure: E_FAIL, if lpUnknown is NULL.
* E_NOINTERFACE, if lpUnknown does not support IOleCommandTarget.
* Otherwise, an error code from IOleCommandTarget_QueryStatus().
*/
HRESULT WINAPI IUnknown_QueryStatus(IUnknown* lpUnknown, REFGUID pguidCmdGroup,
ULONG cCmds, OLECMD *prgCmds, OLECMDTEXT* pCmdText)
{
HRESULT hRet = E_FAIL;
TRACE("(%p,%p,%d,%p,%p)\n",lpUnknown, pguidCmdGroup, cCmds, prgCmds, pCmdText);
if (lpUnknown)
{
IOleCommandTarget* lpOle;
hRet = IUnknown_QueryInterface(lpUnknown, &IID_IOleCommandTarget,
(void**)&lpOle);
if (SUCCEEDED(hRet) && lpOle)
{
hRet = IOleCommandTarget_QueryStatus(lpOle, pguidCmdGroup, cCmds,
prgCmds, pCmdText);
IOleCommandTarget_Release(lpOle);
}
}
return hRet;
}
/*************************************************************************
* @ [SHLWAPI.164]
*
* Call IOleCommandTarget_Exec() on an object.
*
* PARAMS
* lpUnknown [I] Object supporting the IOleCommandTarget interface
* pguidCmdGroup [I] GUID for the command group
*
* RETURNS
* Success: S_OK.
* Failure: E_FAIL, if lpUnknown is NULL.
* E_NOINTERFACE, if lpUnknown does not support IOleCommandTarget.
* Otherwise, an error code from IOleCommandTarget_Exec().
*/
HRESULT WINAPI IUnknown_Exec(IUnknown* lpUnknown, REFGUID pguidCmdGroup,
DWORD nCmdID, DWORD nCmdexecopt, VARIANT* pvaIn,
VARIANT* pvaOut)
{
HRESULT hRet = E_FAIL;
TRACE("(%p,%p,%d,%d,%p,%p)\n",lpUnknown, pguidCmdGroup, nCmdID,
nCmdexecopt, pvaIn, pvaOut);
if (lpUnknown)
{
IOleCommandTarget* lpOle;
hRet = IUnknown_QueryInterface(lpUnknown, &IID_IOleCommandTarget,
(void**)&lpOle);
if (SUCCEEDED(hRet) && lpOle)
{
hRet = IOleCommandTarget_Exec(lpOle, pguidCmdGroup, nCmdID,
nCmdexecopt, pvaIn, pvaOut);
IOleCommandTarget_Release(lpOle);
}
}
return hRet;
}
/*************************************************************************
* @ [SHLWAPI.165]
*
* Retrieve, modify, and re-set a value from a window.
*
* PARAMS
* hWnd [I] Window to get value from
* offset [I] Offset of value
* wMask [I] Mask for uiFlags
* wFlags [I] Bits to set in window value
*
* RETURNS
* The new value as it was set, or 0 if any parameter is invalid.
*
* NOTES
* Any bits set in uiMask are cleared from the value, then any bits set in
* uiFlags are set in the value.
*/
LONG WINAPI SHSetWindowBits(HWND hwnd, INT offset, UINT wMask, UINT wFlags)
{
LONG ret = GetWindowLongA(hwnd, offset);
LONG newFlags = (wFlags & wMask) | (ret & ~wFlags);
if (newFlags != ret)
ret = SetWindowLongA(hwnd, offset, newFlags);
return ret;
}
/*************************************************************************
* @ [SHLWAPI.167]
*
* Change a window's parent.
*
* PARAMS
* hWnd [I] Window to change parent of
* hWndParent [I] New parent window
*
* RETURNS
* The old parent of hWnd.
*
* NOTES
* If hWndParent is NULL (desktop), the window style is changed to WS_POPUP.
* If hWndParent is NOT NULL then we set the WS_CHILD style.
*/
HWND WINAPI SHSetParentHwnd(HWND hWnd, HWND hWndParent)
{
TRACE("%p, %p\n", hWnd, hWndParent);
if(GetParent(hWnd) == hWndParent)
return 0;
if(hWndParent)
SHSetWindowBits(hWnd, GWL_STYLE, WS_CHILD, WS_CHILD);
else
SHSetWindowBits(hWnd, GWL_STYLE, WS_POPUP, WS_POPUP);
return SetParent(hWnd, hWndParent);
}
/*************************************************************************
* @ [SHLWAPI.168]
*
* Locate and advise a connection point in an IConnectionPointContainer object.
*
* PARAMS
* lpUnkSink [I] Sink for the connection point advise call
* riid [I] REFIID of connection point to advise
* bAdviseOnly [I] TRUE = Advise only, FALSE = Unadvise first
* lpUnknown [I] Object supporting the IConnectionPointContainer interface
* lpCookie [O] Pointer to connection point cookie
* lppCP [O] Destination for the IConnectionPoint found
*
* RETURNS
* Success: S_OK. If lppCP is non-NULL, it is filled with the IConnectionPoint
* that was advised. The caller is responsible for releasing it.
* Failure: E_FAIL, if any arguments are invalid.
* E_NOINTERFACE, if lpUnknown isn't an IConnectionPointContainer,
* Or an HRESULT error code if any call fails.
*/
HRESULT WINAPI ConnectToConnectionPoint(IUnknown* lpUnkSink, REFIID riid, BOOL bAdviseOnly,
IUnknown* lpUnknown, LPDWORD lpCookie,
IConnectionPoint **lppCP)
{
HRESULT hRet;
IConnectionPointContainer* lpContainer;
IConnectionPoint *lpCP;
if(!lpUnknown || (bAdviseOnly && !lpUnkSink))
return E_FAIL;
if(lppCP)
*lppCP = NULL;
hRet = IUnknown_QueryInterface(lpUnknown, &IID_IConnectionPointContainer,
(void**)&lpContainer);
if (SUCCEEDED(hRet))
{
hRet = IConnectionPointContainer_FindConnectionPoint(lpContainer, riid, &lpCP);
if (SUCCEEDED(hRet))
{
if(!bAdviseOnly)
hRet = IConnectionPoint_Unadvise(lpCP, *lpCookie);
hRet = IConnectionPoint_Advise(lpCP, lpUnkSink, lpCookie);
if (FAILED(hRet))
*lpCookie = 0;
if (lppCP && SUCCEEDED(hRet))
*lppCP = lpCP; /* Caller keeps the interface */
else
IConnectionPoint_Release(lpCP); /* Release it */
}
IUnknown_Release(lpContainer);
}
return hRet;
}
/*************************************************************************
* @ [SHLWAPI.169]
*
* Release an interface.
*
* PARAMS
* lpUnknown [I] Object to release
*
* RETURNS
* Nothing.
*/
DWORD WINAPI IUnknown_AtomicRelease(IUnknown ** lpUnknown)
{
IUnknown *temp;
TRACE("(%p)\n",lpUnknown);
if(!lpUnknown || !*((LPDWORD)lpUnknown)) return 0;
temp = *lpUnknown;
*lpUnknown = NULL;
TRACE("doing Release\n");
return IUnknown_Release(temp);
}
/*************************************************************************
* @ [SHLWAPI.170]
*
* Skip '//' if present in a string.
*
* PARAMS
* lpszSrc [I] String to check for '//'
*
* RETURNS
* Success: The next character after the '//' or the string if not present
* Failure: NULL, if lpszStr is NULL.
*/
LPCSTR WINAPI PathSkipLeadingSlashesA(LPCSTR lpszSrc)
{
if (lpszSrc && lpszSrc[0] == '/' && lpszSrc[1] == '/')
lpszSrc += 2;
return lpszSrc;
}
/*************************************************************************
* @ [SHLWAPI.171]
*
* Check if two interfaces come from the same object.
*
* PARAMS
* lpInt1 [I] Interface to check against lpInt2.
* lpInt2 [I] Interface to check against lpInt1.
*
* RETURNS
* TRUE, If the interfaces come from the same object.
* FALSE Otherwise.
*/
BOOL WINAPI SHIsSameObject(IUnknown* lpInt1, IUnknown* lpInt2)
{
LPVOID lpUnknown1, lpUnknown2;
TRACE("%p %p\n", lpInt1, lpInt2);
if (!lpInt1 || !lpInt2)
return FALSE;
if (lpInt1 == lpInt2)
return TRUE;
if (!SUCCEEDED(IUnknown_QueryInterface(lpInt1, &IID_IUnknown,
(LPVOID *)&lpUnknown1)))
return FALSE;
if (!SUCCEEDED(IUnknown_QueryInterface(lpInt2, &IID_IUnknown,
(LPVOID *)&lpUnknown2)))
return FALSE;
if (lpUnknown1 == lpUnknown2)
return TRUE;
return FALSE;
}
/*************************************************************************
* @ [SHLWAPI.172]
*
* Get the window handle of an object.
*
* PARAMS
* lpUnknown [I] Object to get the window handle of
* lphWnd [O] Destination for window handle
*
* RETURNS
* Success: S_OK. lphWnd contains the objects window handle.
* Failure: An HRESULT error code.
*
* NOTES
* lpUnknown is expected to support one of the following interfaces:
* IOleWindow(), IInternetSecurityMgrSite(), or IShellView().
*/
HRESULT WINAPI IUnknown_GetWindow(IUnknown *lpUnknown, HWND *lphWnd)
{
/* FIXME: Wine has no header for this object */
static const GUID IID_IInternetSecurityMgrSite = { 0x79eac9ed,
0xbaf9, 0x11ce, { 0x8c, 0x82, 0x00, 0xaa, 0x00, 0x4b, 0xa9, 0x0b }};
IUnknown *lpOle;
HRESULT hRet = E_FAIL;
TRACE("(%p,%p)\n", lpUnknown, lphWnd);
if (!lpUnknown)
return hRet;
hRet = IUnknown_QueryInterface(lpUnknown, &IID_IOleWindow, (void**)&lpOle);
if (FAILED(hRet))
{
hRet = IUnknown_QueryInterface(lpUnknown,&IID_IShellView, (void**)&lpOle);
if (FAILED(hRet))
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -