关于函数SHChangeNotifyRegister的消息响应的参数解析

WL_river 2010-05-28 03:20:55
我在使用函数SHChangeNotifyRegister来监控一个目录时,在回调的函数OnFolderNotify中对参数进行解析时出现问题,总是解析的不对,详情如下:

数据结构定义(由于SHChangeNotifyRegister函数不是系统公开的,所以所使用到的结构需要自行在程序中给出定义):
typedef struct _FILECHANGEINFO {
DWORD cbSize;
LONG wEventId;
ULONG uFlags;
DWORD dwItem1;
DWORD dwItem2;
DWORD dwAttributes;
FILETIME ftModified;
ULONG nFileSize;
} FILECHANGEINFO;

typedef struct tagFILECHANGENOTIFY {
DWORD dwRefCount;
FILECHANGEINFO fci;
} FILECHANGENOTIFY;

监控函数(无关的部分略):
SHChangeNotifyEntry shEntry = {0};
LPITEMIDLIST pidl = NULL;
if (FAILED(SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &pidl)))
{
pMalloc->Release();
return FALSE;
}

shEntry.fRecursive = TRUE;
shEntry.pidl = pidl;

if (0 == (m_ulNotifyId = SHChangeNotifyRegister(m_hWnd,
SHCNRF_ShellLevel,
SHCNE_MKDIR | SHCNE_RMDIR,
WM_DESKTOP_NOTIFY,
1,
&shEntry)))
{
bResult = FALSE;
}

监控回调函数
VOID OnFolderNotify(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
FILECHANGENOTIFY* pFileChangeNotify = (FILECHANGENOTIFY*)wParam;
if (NULL == pFileChangeNotify)
{
return 1;
}
FILECHANGEINFO* pChangeFile = &(pFileChangeNotify->fci);
TCHAR szFileName1[MAX_PATH] = {0};

switch (lParam)
{
case SHCNE_MKDIR:
if (SHCNF_PATH & pChangeFile->uFlags)
{
(1) SHGetPathFromIDList((LPCITEMIDLIST)(pChangeFile->dwItem1), szFileName1);
(2) //dwResult = SHGetFileInfo((TCHAR*)(pChangeFile->dwItem1), 0, &shFileInfo1, sizeof(SHFILEINFO), SHGFI_PIDL | SHGFI_DISPLAYNAME);
}
break;

case SHCNE_RMDIR:
if (SHCNF_PATH & pChangeFile->uFlags)
{
(1) SHGetPathFromIDList((LPCITEMIDLIST)(pChangeFile->dwItem1), szFileName1);
(2) //dwResult = SHGetFileInfo((TCHAR*)(pChangeFile->dwItem1), 0, &shFileInfo1, sizeof(SHFILEINFO), SHGFI_PIDL | SHGFI_DISPLAYNAME);
}
break;

default:
break;
}
}


1.上面对pChangeFile的成员dwItem1和dwItem2分别当成(1)LPCITEMIDLIST和(2)TCHAR*来解析(见代码中(1)和(2)处),均不能得到正确的结果。不知道是为什么。
2.我以为是对wparam的解析类型出现错误,于是将
FILECHANGENOTIFY* pFileChangeNotify = (FILECHANGENOTIFY*)wParam;
if (NULL == pFileChangeNotify)
{
return 1;
}
FILECHANGEINFO* pChangeFile = &(pFileChangeNotify->fci);


改成
FILECHANGEINFO* pChangeFile = (FILECHANGEINFO*)wParam;

再进行下面的操作,依然得不到正确的结果。

请各路高手帮忙解答
...全文
378 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
WL_river 2010-05-28
  • 打赏
  • 举报
回复
嗯,确实可以,thx
only_youch 2010-05-28
  • 打赏
  • 举报
回复
问题是FILECHANGEINFO这个结构出现错误。正确的应该如下:
typedef struct
{
DWORD dwItem1; // dwItem1 contains the previous PIDL or name of the folder.
DWORD dwItem2; // dwItem2 contains the new PIDL or name of the folder.
}FILECHANGEINFO;

给分吧。
only_youch 2010-05-28
  • 打赏
  • 举报
回复
共同关注中。。。。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧