【问题标题】:receiving wm_copydata messages in delphi xe2 - unicode related在delphi xe2中接收wm_copydata消息 - unicode相关
【发布时间】: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 生成的。

标签: delphi unicode messaging


【解决方案1】:

系统未发送WM_COPYDATA 消息。其中一个应用程序就是这样做的。很可能是您自己的应用!

您可能已经获得了强制执行单个实例的代码。第二个实例响应 shell 动作而启动。它检测现有应用程序并发送WM_COPYDATA 消息。然后第二个实例关闭。第一个实例接收消息并处理它。

接收者是一个支持 Unicode 的应用这一事实不会影响消息的内容。发送者确定其内容。系统不会神奇地将 8 位文本转换为 16 位文本。怎么可能?内容不透明。

因此,您的下一步是找到发送消息的代码并将其转换为发送 Unicode 文本。

【讨论】:

  • 关于否决票,我确信系统没有发送这些消息,并且第三方很可能是提问者自己的程序。但我可能是错的。否决者想补充一些细节吗?
  • 大卫,你是绝对正确的,我确实有执行单个实例的代码。我没有意识到信息会来自那里。我会回去看看是否可以在此基础上对其进行整理,如果这确实是解决方案,请在此处发布-但是您的建议很有意义。非常感谢。
  • 很明显,这确实是您问题的答案
猜你喜欢
  • 1970-01-01
  • 2015-11-21
  • 1970-01-01
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多