Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在delphi xe2中接收wm_copydata消息-与unicode相关_Delphi_Unicode_Messaging - Fatal编程技术网

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

在delphi xe2中接收wm_copydata消息-与unicode相关,delphi,unicode,messaging,Delphi,Unicode,Messaging,我有一个用Delphi编写的应用程序,我想用它来使用Windows的“打开方式”选项打开文件。在Unicode之前的Delphi版本中,我可以非常愉快地完成这项工作;Windows将文件名放入WM_copydata消息中,因此我可以使用CopyDataStruct记录将其搜索出来。但在Unicode世界中,这是行不通的;我在lpdata缓冲区中只得到一半的文件名(后面是垃圾)。当我检查CopyDataStruct记录中的cbdata条目时,我发现它包含文件名的长度,以字符数表示(加上1表示终止符

我有一个用Delphi编写的应用程序,我想用它来使用Windows的“打开方式”选项打开文件。在Unicode之前的Delphi版本中,我可以非常愉快地完成这项工作;Windows将文件名放入WM_copydata消息中,因此我可以使用CopyDataStruct记录将其搜索出来。但在Unicode世界中,这是行不通的;我在lpdata缓冲区中只得到一半的文件名(后面是垃圾)。当我检查CopyDataStruct记录中的cbdata条目时,我发现它包含文件名的长度,以字符数表示(加上1表示终止符),而不是字节数(正如我所认为的那样),字节数现在当然是字符数的两倍。 请注意,并非我的Delphi代码没有从lpdata^读取文件名中的其余字符-我已经在lpdata^中查找过,但它们不在那里。 如果您自己生成WM_copydata消息,web上有许多示例(包括StackOverflow中的示例)说明如何避免此问题;我的问题是我没有生成它,而是从Windows(64位Win7或Win8)接收它。在我看到WM_CopyData消息之前,Delphi是否可以将lpdata中的ANSI字符串转换为Unicode,这是我没有看到的?如果是这样,我如何禁用它(或使它更正cbdata值)?
非常感谢您的帮助。

系统没有发送
WM\u COPYDATA
消息。其中一个应用程序正在这样做。很可能是你自己的应用程序

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

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


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

哪个应用程序发送此消息?我无法想象这条消息是由Windows生成的。关于否决票,我确信系统没有发送这些消息,而第三方很可能是询问者自己的程序。但我可能错了。投票人想添加一些细节吗?David,你完全正确,我有代码强制执行单个实例。我还没有意识到这会传达出什么信息。我会回去看看我是否能在这个基础上解决问题,如果这确实是解决办法,我会在这里发帖——但是你的建议很有意义。非常感谢。很明显,这确实是你问题的答案