怎么从IUnknown里获取到删除文件的完整路径?

四层楼 2019-10-10 09:41:44
参考的是这篇文章 WIN7 下 explorer 进行的文件移动COPY HOOK

在win7下我Hook到了的删除操作,回调函数里只有一个IUnknown类型的参数,怎么从这个参数里能解析出被删除文件的路径?

我打印了uFileCount值是正确的,就是获取不到路径。。

LPWSTR  __stdcall GetDeleteFileName(IUnknown* iUnknown)
{
UINT uFileCount = 0;

IDataObject* iDataObject = NULL;
HRESULT hr = iUnknown->QueryInterface(IID_IDataObject, (void**)& iDataObject); //通过iUnknown接口查找IDataObject接口

do
{
if (!SUCCEEDED(hr))
{
break;
}

FORMATETC fmt = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
STGMEDIUM stg = { TYMED_HGLOBAL };

if (!SUCCEEDED(iDataObject->GetData(&fmt, &stg)))
{
break;
}

HDROP hDrop = (HDROP)GlobalLock(stg.hGlobal);

if (hDrop == NULL)
{
break;
}

uFileCount = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);

if (uFileCount <= 0)
{
break;
}


WPATH** ppPath = NULL;

*ppPath = new WPATH[uFileCount];

if (*ppPath != NULL)
{
for (UINT uIndex = 0; uIndex < uFileCount; uIndex++)
{
DragQueryFile(hDrop, uIndex, (*ppPath)[uIndex], MAX_PATH);
}
}
else
{
uFileCount = 0;
}

GlobalUnlock(stg.hGlobal);

ReleaseStgMedium(&stg);

return stg.lpszFileName;

} while (FALSE);

return NULL;
}
...全文
103 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
四层楼 2019-10-10
  • 打赏
  • 举报
回复
引用 6 楼 zjq9931 的回复:
能接收LPWSTR类型就好办啊。可以多个路径拼接起来,拼成单字符串,用逗号分割(路径中是不允许出现逗号的),就可以了。接收到后,再用逗号拆分开。
发送窗口消息,这个是用于窗口程序的,如果没有窗口,这个就用不到了。


我开始也这样想过,怕同时删除很多文件时,用多个文件路径拼出来的字符串太长导致溢出或者丢失..
  • 打赏
  • 举报
回复
引用 5 楼 鬼脸苹果 的回复:
试过返回WPATH*类型,c#用string []接收好像没成功。现在仍然返回LPWSTR类型,只返回了一个路径ppPath[0],C#用IntPtr句柄接收,再转成字符串,都正常。 发送窗口消息?没明白在这里的用处。 单个字符串很好返回并被C#接收,怎么把WPATH* 类型的ppPath返回并被C#接收还没弄出来。类型不匹配,栈不对齐程序就会崩溃..
能接收LPWSTR类型就好办啊。可以多个路径拼接起来,拼成单字符串,用逗号分割(路径中是不允许出现逗号的),就可以了。接收到后,再用逗号拆分开。 发送窗口消息,这个是用于窗口程序的,如果没有窗口,这个就用不到了。
四层楼 2019-10-10
  • 打赏
  • 举报
回复
试过返回WPATH*类型,c#用string []接收好像没成功。现在仍然返回LPWSTR类型,只返回了一个路径ppPath[0],C#用IntPtr句柄接收,再转成字符串,都正常。

发送窗口消息?没明白在这里的用处。

单个字符串很好返回并被C#接收,怎么把WPATH* 类型的ppPath返回并被C#接收还没弄出来。类型不匹配,栈不对齐程序就会崩溃..
  • 打赏
  • 举报
回复
引用 3 楼 鬼脸苹果 的回复:
WPATH是WCHAR数组,这句在头文件里定义,忘记拷过来了
typedef WCHAR WPATH[MAX_PATH];
WPATH* ppPath = new WPATH[uFileCount];
for (UINT uIndex = 0; uIndex < uFileCount; uIndex++)
{
      DragQueryFile(hDrop, uIndex, ppPath[uIndex], MAX_PATH);
}
这样修改后就正确了,文件路径都存到了ppPath里。我这程序是用C++编写的dll文件,还剩最后一个问题,怎么把这个数组返回出去,供C#程序调用。C++各种各样的类型,摸不着头脑
发送窗口消息?SendMessage,就可以了。 转换成wstring,CString类型C#能否接收?
四层楼 2019-10-10
  • 打赏
  • 举报
回复
WPATH是WCHAR数组,这句在头文件里定义,忘记拷过来了

typedef WCHAR WPATH[MAX_PATH];


WPATH* ppPath = new WPATH[uFileCount];
for (UINT uIndex = 0; uIndex < uFileCount; uIndex++)
{
DragQueryFile(hDrop, uIndex, ppPath[uIndex], MAX_PATH);
}


这样修改后就正确了,文件路径都存到了ppPath里。我这程序是用C++编写的dll文件,还剩最后一个问题,怎么把这个数组返回出去,供C#程序调用。C++各种各样的类型,摸不着头脑
四层楼 2019-10-10
  • 打赏
  • 举报
回复
引用 1 楼 zjq9931 的回复:
估计是WPATH这个类型引起的,换成WCHAR 数组试试。


WPATH** ppPath = NULL; 这句是我加的,参考文章中ppPath是作为函数参数传入的,实际上我只能有一个IUnknown参数参入。

我修改成
WPATH* ppPath = new WPATH[uFileCount];

DragQueryFile(hDrop, uIndex, (*ppPath)[uIndex], MAX_PATH);

这样使用会报错

我理解这段代码是先获取文件总数uFileCount,再根据uFileCount赋值ppPath数组。

这里应该怎么给定义ppPath啊?

  • 打赏
  • 举报
回复
估计是WPATH这个类型引起的,换成WCHAR 数组试试。

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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