【发布时间】:2015-10-10 21:02:32
【问题描述】:
我有一个用 Delphi 编写的应用程序,我想用它来使用 Windows“打开方式”选项打开文件。在 Unicode 之前的 Delphi 版本中,我可以完美地做到这一点; Windows 将文件名放入 WM_copydata 消息中,因此我可以使用 CopyDataStruct 记录将其取出。但在 Unicode 世界中,这是行不通的。我只得到 lpdata 缓冲区中文件名的一半(后面是垃圾)。当我检查 CopyDataStruct 记录中的 cbdata 条目时,我发现它包含文件名的长度,以字符数(结束符加 1)为单位,而不是(正如我所认为的那样)字节数,即当然现在是字符数的两倍。 请注意,并非我的 Delphi 代码没有从 lpdata^ 中读取文件名中的其余字符 - 我查看了 lpdata^,但它们不存在。 如果您自己生成 WM_copydata 消息,网络上有许多示例(包括 StackOverflow 中)如何避免此问题;我的问题是我没有生成它,我是从 Windows(64 位 Win7 或 Win8)接收它。 Delphi 是否可以将某些东西放入我没有看到的应用程序中,即在我收到 WM_CopyData 消息之前将 lpdata 中的 ANSI 字符串转换为 Unicode?如果是这样,我该如何禁用它(或使其更正 cbdata 值)? 任何帮助将不胜感激。
【问题讨论】:
-
哪个应用程序发送此消息?我无法想象这条消息是由 Windows 生成的。