在delphi xe2中接收wm_copydata消息 - 与unicode相关

时间:2015-10-10 21:02:33

标签: delphi unicode messaging

我有一个用Delphi编写的应用程序,我想用它来打开文件,使用Windows" Open With"选项。我可以在Unicode前的Delphi版本中完美地完成这项工作; Windows将文件名放入WM_copydata消息中,因此我可以使用CopyDataStruct记录将其删除。但在Unicode世界中,这并不起作用;我只获得了lpdata缓冲区中的一半文件名(后面是垃圾)。当我检查CopyDataStruct记录中的cbdata条目时,我发现它包含文件名的长度,以字符数表示(加上终结符为1),而不是(我认为应该)字节数,即当然现在两倍的字符数。 请注意,我的Delphi代码不是从lpdata中读取文件名中的其余字符^ - 我查看了lpdata ^,但它们不在那里。 如果您自己生成WM_copydata消息,Web上有很多示例(包括在StackOverflow中)如何避免此问题;我的问题是我没有生成它,我从Windows(64位Win7或Win8)接收它。有没有Delphi可以放入应用程序,我没有看到,在我得到WM_CopyData消息之前,将lpdata中的ANSI字符串转换为Unicode?如果是这样,我怎么能禁用它(或使其更正cbdata值)? 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

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

您可能拥有强制执行单个实例的代码。第二个实例开始响应shell操作。它会检测现有应用并发送WM_COPYDATA消息。然后第二个实例关闭。第一个实例接收消息并处理它。

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

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

相关问题