📄 ordinal.c
字号:
{
IOleControlSite* lpCSite = NULL;
HRESULT hRet = E_FAIL;
TRACE("(%p,%p)\n", lpUnknown, lppDisp);
if (lpUnknown)
{
hRet = IUnknown_QueryInterface(lpUnknown, &IID_IOleControlSite,
(void**)&lpCSite);
if (SUCCEEDED(hRet) && lpCSite)
{
hRet = IOleControlSite_GetExtendedControl(lpCSite, lppDisp);
IOleControlSite_Release(lpCSite);
}
}
return hRet;
}
/*************************************************************************
* @ [SHLWAPI.190]
*/
HRESULT WINAPI IUnknown_HandleIRestrict(LPUNKNOWN lpUnknown, PVOID lpArg1,
PVOID lpArg2, PVOID lpArg3, PVOID lpArg4)
{
/* FIXME: {D12F26B2-D90A-11D0-830D-00AA005B4383} - What object does this represent? */
static const DWORD service_id[] = { 0xd12f26b2, 0x11d0d90a, 0xaa000d83, 0x83435b00 };
/* FIXME: {D12F26B1-D90A-11D0-830D-00AA005B4383} - Also Unknown/undocumented */
static const DWORD function_id[] = { 0xd12f26b1, 0x11d0d90a, 0xaa000d83, 0x83435b00 };
HRESULT hRet = E_INVALIDARG;
LPUNKNOWN lpUnkInner = NULL; /* FIXME: Real type is unknown */
TRACE("(%p,%p,%p,%p,%p)\n", lpUnknown, lpArg1, lpArg2, lpArg3, lpArg4);
if (lpUnknown && lpArg4)
{
hRet = IUnknown_QueryService(lpUnknown, (REFGUID)service_id,
(REFGUID)function_id, (void**)&lpUnkInner);
if (SUCCEEDED(hRet) && lpUnkInner)
{
/* FIXME: The type of service object requested is unknown, however
* testing shows that its first method is called with 4 parameters.
* Fake this by using IParseDisplayName_ParseDisplayName since the
* signature and position in the vtable matches our unknown object type.
*/
hRet = IParseDisplayName_ParseDisplayName((LPPARSEDISPLAYNAME)lpUnkInner,
lpArg1, lpArg2, lpArg3, lpArg4);
IUnknown_Release(lpUnkInner);
}
}
return hRet;
}
/*************************************************************************
* @ [SHLWAPI.192]
*
* Get a sub-menu from a menu item.
*
* PARAMS
* hMenu [I] Menu to get sub-menu from
* uID [I] ID of menu item containing sub-menu
*
* RETURNS
* The sub-menu of the item, or a NULL handle if any parameters are invalid.
*/
HMENU WINAPI SHGetMenuFromID(HMENU hMenu, UINT uID)
{
MENUITEMINFOW mi;
TRACE("(%p,%u)\n", hMenu, uID);
mi.cbSize = sizeof(mi);
mi.fMask = MIIM_SUBMENU;
if (!GetMenuItemInfoW(hMenu, uID, FALSE, &mi))
return NULL;
return mi.hSubMenu;
}
/*************************************************************************
* @ [SHLWAPI.193]
*
* Get the color depth of the primary display.
*
* PARAMS
* None.
*
* RETURNS
* The color depth of the primary display.
*/
DWORD WINAPI SHGetCurColorRes(void)
{
HDC hdc;
DWORD ret;
TRACE("()\n");
hdc = GetDC(0);
ret = GetDeviceCaps(hdc, BITSPIXEL) * GetDeviceCaps(hdc, PLANES);
ReleaseDC(0, hdc);
return ret;
}
/*************************************************************************
* @ [SHLWAPI.194]
*
* Wait for a message to arrive, with a timeout.
*
* PARAMS
* hand [I] Handle to query
* dwTimeout [I] Timeout in ticks or INFINITE to never timeout
*
* RETURNS
* STATUS_TIMEOUT if no message is received before dwTimeout ticks passes.
* Otherwise returns the value from MsgWaitForMultipleObjectsEx when a
* message is available.
*/
DWORD WINAPI SHWaitForSendMessageThread(HANDLE hand, DWORD dwTimeout)
{
DWORD dwEndTicks = GetTickCount() + dwTimeout;
DWORD dwRet;
while ((dwRet = MsgWaitForMultipleObjectsEx(1, &hand, dwTimeout, QS_SENDMESSAGE, 0)) == 1)
{
MSG msg;
PeekMessageW(&msg, NULL, 0, 0, PM_NOREMOVE);
if (dwTimeout != INFINITE)
{
if ((int)(dwTimeout = dwEndTicks - GetTickCount()) <= 0)
return WAIT_TIMEOUT;
}
}
return dwRet;
}
/*************************************************************************
* @ [SHLWAPI.195]
*
* Determine if a shell folder can be expanded.
*
* PARAMS
* lpFolder [I] Parent folder containing the object to test.
* pidl [I] Id of the object to test.
*
* RETURNS
* Success: S_OK, if the object is expandable, S_FALSE otherwise.
* Failure: E_INVALIDARG, if any argument is invalid.
*
* NOTES
* If the object to be tested does not expose the IQueryInfo() interface it
* will not be identified as an expandable folder.
*/
HRESULT WINAPI SHIsExpandableFolder(LPSHELLFOLDER lpFolder, LPCITEMIDLIST pidl)
{
HRESULT hRet = E_INVALIDARG;
IQueryInfo *lpInfo;
if (lpFolder && pidl)
{
hRet = IShellFolder_GetUIObjectOf(lpFolder, NULL, 1, &pidl, &IID_IQueryInfo,
NULL, (void**)&lpInfo);
if (FAILED(hRet))
hRet = S_FALSE; /* Doesn't expose IQueryInfo */
else
{
DWORD dwFlags = 0;
/* MSDN states of IQueryInfo_GetInfoFlags() that "This method is not
* currently used". Really? You wouldn't be holding out on me would you?
*/
hRet = IQueryInfo_GetInfoFlags(lpInfo, &dwFlags);
if (SUCCEEDED(hRet))
{
/* 0x2 is an undocumented flag apparently indicating expandability */
hRet = dwFlags & 0x2 ? S_OK : S_FALSE;
}
IQueryInfo_Release(lpInfo);
}
}
return hRet;
}
/*************************************************************************
* @ [SHLWAPI.197]
*
* Blank out a region of text by drawing the background only.
*
* PARAMS
* hDC [I] Device context to draw in
* pRect [I] Area to draw in
* cRef [I] Color to draw in
*
* RETURNS
* Nothing.
*/
DWORD WINAPI SHFillRectClr(HDC hDC, LPCRECT pRect, COLORREF cRef)
{
COLORREF cOldColor = SetBkColor(hDC, cRef);
ExtTextOutA(hDC, 0, 0, ETO_OPAQUE, pRect, 0, 0, 0);
SetBkColor(hDC, cOldColor);
return 0;
}
/*************************************************************************
* @ [SHLWAPI.198]
*
* Return the value asociated with a key in a map.
*
* PARAMS
* lpKeys [I] A list of keys of length iLen
* lpValues [I] A list of values associated with lpKeys, of length iLen
* iLen [I] Length of both lpKeys and lpValues
* iKey [I] The key value to look up in lpKeys
*
* RETURNS
* The value in lpValues associated with iKey, or -1 if iKey is not
* found in lpKeys.
*
* NOTES
* - If two elements in the map share the same key, this function returns
* the value closest to the start of the map
* - The native version of this function crashes if lpKeys or lpValues is NULL.
*/
int WINAPI SHSearchMapInt(const int *lpKeys, const int *lpValues, int iLen, int iKey)
{
if (lpKeys && lpValues)
{
int i = 0;
while (i < iLen)
{
if (lpKeys[i] == iKey)
return lpValues[i]; /* Found */
i++;
}
}
return -1; /* Not found */
}
/*************************************************************************
* @ [SHLWAPI.199]
*
* Copy an interface pointer
*
* PARAMS
* lppDest [O] Destination for copy
* lpUnknown [I] Source for copy
*
* RETURNS
* Nothing.
*/
VOID WINAPI IUnknown_Set(IUnknown **lppDest, IUnknown *lpUnknown)
{
TRACE("(%p,%p)\n", lppDest, lpUnknown);
if (lppDest)
IUnknown_AtomicRelease(lppDest); /* Release existing interface */
if (lpUnknown)
{
/* Copy */
IUnknown_AddRef(lpUnknown);
*lppDest = lpUnknown;
}
}
/*************************************************************************
* @ [SHLWAPI.200]
*
*/
HRESULT WINAPI MayQSForward(IUnknown* lpUnknown, PVOID lpReserved,
REFGUID riidCmdGrp, ULONG cCmds,
OLECMD *prgCmds, OLECMDTEXT* pCmdText)
{
FIXME("(%p,%p,%p,%d,%p,%p) - stub\n",
lpUnknown, lpReserved, riidCmdGrp, cCmds, prgCmds, pCmdText);
/* FIXME: Calls IsQSForward & IUnknown_QueryStatus */
return DRAGDROP_E_NOTREGISTERED;
}
/*************************************************************************
* @ [SHLWAPI.201]
*
*/
HRESULT WINAPI MayExecForward(IUnknown* lpUnknown, INT iUnk, REFGUID pguidCmdGroup,
DWORD nCmdID, DWORD nCmdexecopt, VARIANT* pvaIn,
VARIANT* pvaOut)
{
FIXME("(%p,%d,%p,%d,%d,%p,%p) - stub!\n", lpUnknown, iUnk, pguidCmdGroup,
nCmdID, nCmdexecopt, pvaIn, pvaOut);
return DRAGDROP_E_NOTREGISTERED;
}
/*************************************************************************
* @ [SHLWAPI.202]
*
*/
HRESULT WINAPI IsQSForward(REFGUID pguidCmdGroup,ULONG cCmds, OLECMD *prgCmds)
{
FIXME("(%p,%d,%p) - stub!\n", pguidCmdGroup, cCmds, prgCmds);
return DRAGDROP_E_NOTREGISTERED;
}
/*************************************************************************
* @ [SHLWAPI.204]
*
* Determine if a window is not a child of another window.
*
* PARAMS
* hParent [I] Suspected parent window
* hChild [I] Suspected child window
*
* RETURNS
* TRUE: If hChild is a child window of hParent
* FALSE: If hChild is not a child window of hParent, or they are equal
*/
BOOL WINAPI SHIsChildOrSelf(HWND hParent, HWND hChild)
{
TRACE("(%p,%p)\n", hParent, hChild);
if (!hParent || !hChild)
return TRUE;
else if(hParent == hChild)
return FALSE;
return !IsChild(hParent, hChild);
}
/*************************************************************************
* FDSA functions. Manage a dynamic array of fixed size memory blocks.
*/
typedef struct
{
DWORD num_items; /* Number of elements inserted */
void *mem; /* Ptr to array */
DWORD blocks_alloced; /* Number of elements allocated */
BYTE inc; /* Number of elements to grow by when we need to expand */
BYTE block_size; /* Size in bytes of an element */
BYTE flags; /* Flags */
} FDSA_info;
#define FDSA_FLAG_INTERNAL_ALLOC 0x01 /* When set we have allocated mem internally */
/*************************************************************************
* @ [SHLWAPI.208]
*
* Initialize an FDSA arrary.
*/
BOOL WINAPI FDSA_Initialize(DWORD block_size, DWORD inc, FDSA_info *info, void *mem,
DWORD init_blocks)
{
TRACE("(0x%08x 0x%08x %p %p 0x%08x)\n", block_size, inc, info, mem, init_blocks);
if(inc == 0)
inc = 1;
if(mem)
memset(mem, 0, block_size * init_blocks);
info->num_items = 0;
info->inc = inc;
info->mem = mem;
info->blocks_alloced = init_blocks;
info->block_size = block_size;
info->flags = 0;
return TRUE;
}
/*************************************************************************
* @ [SHLWAPI.209]
*
* Destroy an FDSA array
*/
BOOL WINAPI FDSA_Destroy(FDSA_info *info)
{
TRACE("(%p)\n", info);
if(info->flags & FDSA_FLAG_INTERNAL_ALLOC)
{
HeapFree(GetProcessHeap(), 0, info->mem);
return FALSE;
}
return TRUE;
}
/*************************************************************************
* @ [SHLWAPI.210]
*
* Insert element into an FDSA array
*/
DWORD WINAPI FDSA_InsertItem(FDSA_info *info, DWORD where, const void *block)
{
TRACE("(%p 0x%08x %p)\n", info, where, block);
if(where > info->num_items)
where = info->num_items;
if(info->num_items >= info->blocks_alloced)
{
DWORD size = (info->blocks_alloced + info->inc) * info->block_size;
if(info->flags & 0x1)
info->mem = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, info->mem, size);
else
{
void *old_mem = info->mem;
info->mem = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size);
memcpy(info->mem, old_mem, info->blocks_alloced * info->block_size);
}
info->blocks_alloced += info->inc;
info->flags |= 0x1;
}
if(where < info->num_items)
{
memmove((char*)info->mem + (where + 1) * info->block_size,
(char*)info->mem + where * info->block_size,
(info->num_items - where) * info->block_size);
}
memcpy((char*)info->mem + where * info->block_size, block, info->block_size);
info->num_items++;
return where;
}
/*************************************************************************
* @ [SHLWAPI.211]
*
* Delete an element from an FDSA array.
*/
BOOL WINAPI FDSA_DeleteItem(FDSA_info *info, DWORD where)
{
TRACE("(%p 0x%08x)\n", info, where);
if(where >= info->num_items)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -