Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.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
Winapi SendMessage-奇怪的返回值_Winapi_Visual C++ - Fatal编程技术网

Winapi SendMessage-奇怪的返回值

Winapi SendMessage-奇怪的返回值,winapi,visual-c++,Winapi,Visual C++,我有一个应用程序,它使用三个助手线程从数据库(3个不同的表,总共约160000行)读取数据,从这些行创建对象,然后根据创建的对象类型将对象添加到两个列表之一。助手线程通过SendMessage调用将对象添加到列表中,因此主线程是唯一向列表添加/从列表中删除对象的线程 奇怪的是,SendMessage并不总是成功,我经常会得到这两个错误:ERROR_ready_EXISTS(183)和ERROR_TRUSTED_DOMAIN_FAILURE(1788)。SendMessage调用的函数只是将一个对

我有一个应用程序,它使用三个助手线程从数据库(3个不同的表,总共约160000行)读取数据,从这些行创建对象,然后根据创建的对象类型将对象添加到两个列表之一。助手线程通过SendMessage调用将对象添加到列表中,因此主线程是唯一向列表添加/从列表中删除对象的线程

奇怪的是,SendMessage并不总是成功,我经常会得到这两个错误:ERROR_ready_EXISTS(183)和ERROR_TRUSTED_DOMAIN_FAILURE(1788)。SendMessage调用的函数只是将一个对象添加到列表中,此函数始终返回success(0)。没有创建文件(错误似乎已经存在),也没有网络调用,所以我不确定为什么会出现错误、信任域错误和失败错误

关于这些错误的原因或者调试这些错误的方法有什么想法吗

值得注意的是,在发送消息之前,我使用的是PostMessage,会出现很多错误\u不够\u配额错误;SendMessage使实用程序工作得更好。

SendMessage()
返回所发送消息的结果。由消息处理程序决定
SendMessage()
实际返回给发送代码的值
GetLastError()
只有在
SendMessage()
本身失败时才有意义,您必须使用
SetLastError()
来检测,例如:

SetLastError(0);
LRESULT res = SendMessage(...);
if ((res == 0) && (GetLastError() != 0))
{
    // send failed, for example GetLastError()=ERROR_ACCESS_DENIED if UIPI blocked the message ...
}
else
{
    // send succeeded, res is whatever value the message handler returned ...
}
只有当目标
HWND
与调用
SendMessage()
的线程所拥有的线程不同时,此方法才能可靠地工作<代码>GetLastError()不能跨线程边界受到影响。在消息处理程序中对
SetLastError()
的任何调用都会影响
HWND
所属线程的错误代码,而不是发送线程的错误代码

但是,如果目标
HWND
由调用
SendMessage()
同一线程所拥有,并且消息处理程序恰好调用
SetLastError()
(直接或通过失败的API调用间接)来设置非零错误代码,并且恰好返回0作为
SendMessage()的结果值
若要返回给发送方,那么发送方唯一能想到的方法就是通过
SetWindowsHookEx()使用线程区域设置消息钩子,以区分
GetLastError()
返回的错误代码是由
SendMessage()
本身在失败时设置的,还是由消息处理程序设置的
检测消息处理程序是否实际被调用(我能想到的唯一情况是目标
HWND
无效,因此
SendMessage()
无法找到其窗口过程)


您可以使用
GetWindowThreadProcessId()
GetCurrentThreadId()
来检查目标
HWND
是否属于调用线程

如果我使用PostMessage,我还可以使用GetLastError()吗?我喜欢线程安全的数组方法,谢谢。@HansPassant你这是什么意思?它说我仍在处理“未排队的传入消息”(是other
SendMessage()
s?)的部分,仅当工作线程创建了自己的窗口并具有消息队列时才适用。不太可能在这里应用。@HansPassant那么我在那些说非系统消息不是线程安全的文档中遗漏了什么呢?或者我们是在区分线程安全还是阻止调用线程运行?发送到另一个进程的非系统消息不能包含指针,因为它们不会自动封送到目标进程的地址空间。但是,在发送方自己的进程内发送的非系统消息可以包含指针,并且应该是线程安全的,因为在接收窗口过程完成消息处理之前,发送代码会被阻止。但是这可靠吗?没有什么能阻止我的信息做同样的事情。还是我误解了你想表达的意思?