怎么从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;
}
...全文
139 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 数组试试。
目 录 前言 第一部分 Delphi编程基础 第1章 Delphi集成开发环境 1 1.1 集成开发环境简介 1 1.2 集成调试器 5 1.3 开发环境的优化 6 1.3.1 自定义工具栏 6 1.3.2 编程环境设置 7 1.3.3 编辑环境设置 8 1.3.4 工程设置 8 1.4 方法与技巧 9 1.4.1 使用代码浏览器 9 1.4.2 使用代码编辑器 9 1.4.3 使用帮助系统 10 1.4.4 设置IDE桌面 11 第2章 对象Pascal语言 12 2.1 学习对象Pascal语言的一个通用 例程 12 2.2 对象Pascal语言基础 14 2.2.1 标识符 14 2.2.2 保留字和指令字 14 2.2.3 注释 15 2.2.4 数据类型 16 2.2.5 运算符 21 2.2.6 语句 24 2.2.7 过程与函数 27 2.3 对象Pascal语言的关键技术 30 2.3.1 对象和类 31 2.3.2 类的封装与继承 31 2.3.3 构造函数和析构函数 32 2.3.4 多态性 35 2.3.5 抽象类 38 2.3.6 运行时类型信息 39 2.3.7 类方法 41 2.3.8 类引用 42 2.3.9 单元文件与工程文件 43 2.4 异常处理 45 2.4.1 raise语句 45 2.4.2 try...except语句 45 2.4.3 try...finally语句 47 2.5 方法与技巧 48 2.5.1 命名规则 48 2.5.2 在编译时自由设置是否获得提示 信息 48 2.5.3 使用代码模板 49 2.5.4 使用动态多维数组 49 2.5.5 定义两个相互包含的类 50 2.5.6 获取和使用命令行参数 51 2.5.7 引用参数传递 51 第二部分 Delphi编程的核心技能 第3章 窗体和组件 53 3.1 窗体和组件 53 3.1.1 窗体 54 3.1.2 组件 56 3.1.3 在窗体中使用组件 57 3.2 文本组件 60 3.3 特殊输入组件 61 3.4 按钮及其分类组件 63 3.5 列表组件 64 3.6 分组组件 67 3.7 信息反馈组件 69 3.8 表格显示组件 70 3.9 图形显示组件 71 3.10 开发MDI应用程序 73 3.11 常用组件的用法 74 3.12 方法与技巧 84 3.12.1 窗体、组件的使用原则 84 3.12.2 使用信息对话框 85 3.12.3 使用组件的Hint属性 88 3.12.4 使用Edit组件的IME属性 89 3.12.5 将系统字体添加到ComboBox 组件中 89 3.12.6 在RichEdit组件中存取文件 90 3.12.7 设置模态对话框的返回值 90 3.12.8 使用事件处理过程中的Sender 参数 91 3.12.9 为控件生成多行提示信息 91 3.12.10 生成非矩形窗口 92 3.12.11 移动无标题栏窗口 94 3.12.12 制作动态字幕 95 3.12.13 在窗体上动态地设置背景 画面 96 3.12.14 Owner和Parent的区别 97 第4章 菜单、工具栏和状态栏 98 4.1 菜单 98 4.1.1 主菜单 99 4.1.2 鼠标右键弹出式菜单 99 4.1.3 使用菜单模板 99 4.2 工具栏 100 4.2.1 ToolBar 100 4.2.2 CoolBar 100 4.2.3 ControlBar 101 4.3 状态栏 101 4.4 方法与技巧 106 4.4.1 动态创建菜单 106 4.4.2 为菜单动态定义快捷键 108 4.4.3 动态改变菜单 108 4.4.4 定制系统菜单 109 4.4.5 制作图形菜单项 110 4.4.6 在状态栏中添加进度条等其他 组件 111 4.4.7 MDI应用程序中的菜单融合 113 4.4.8 制作可随处拖放的工具栏 116 4.4.9 将菜单项移到菜单栏的最右边 117 4.4.10 运行时控件的移动 117 第5章 键盘和鼠标 119 5.1 键盘事件 119 5.2 鼠标事件 120 5.2.1 常用鼠标事件 120 5.2.2 拖曳事件 120 5.3

65,212

社区成员

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

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