Winapi SendMessage-奇怪的返回值
我有一个应用程序,它使用三个助手线程从数据库(3个不同的表,总共约160000行)读取数据,从这些行创建对象,然后根据创建的对象类型将对象添加到两个列表之一。助手线程通过SendMessage调用将对象添加到列表中,因此主线程是唯一向列表添加/从列表中删除对象的线程 奇怪的是,SendMessage并不总是成功,我经常会得到这两个错误:ERROR_ready_EXISTS(183)和ERROR_TRUSTED_DOMAIN_FAILURE(1788)。SendMessage调用的函数只是将一个对象添加到列表中,此函数始终返回success(0)。没有创建文件(错误似乎已经存在),也没有网络调用,所以我不确定为什么会出现错误、信任域错误和失败错误 关于这些错误的原因或者调试这些错误的方法有什么想法吗 值得注意的是,在发送消息之前,我使用的是PostMessage,会出现很多错误\u不够\u配额错误;SendMessage使实用程序工作得更好。Winapi SendMessage-奇怪的返回值,winapi,visual-c++,Winapi,Visual C++,我有一个应用程序,它使用三个助手线程从数据库(3个不同的表,总共约160000行)读取数据,从这些行创建对象,然后根据创建的对象类型将对象添加到两个列表之一。助手线程通过SendMessage调用将对象添加到列表中,因此主线程是唯一向列表添加/从列表中删除对象的线程 奇怪的是,SendMessage并不总是成功,我经常会得到这两个错误:ERROR_ready_EXISTS(183)和ERROR_TRUSTED_DOMAIN_FAILURE(1788)。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你这是什么意思?它说我仍在处理“未排队的传入消息”(是otherSendMessage()
s?)的部分,仅当工作线程创建了自己的窗口并具有消息队列时才适用。不太可能在这里应用。@HansPassant那么我在那些说非系统消息不是线程安全的文档中遗漏了什么呢?或者我们是在区分线程安全还是阻止调用线程运行?发送到另一个进程的非系统消息不能包含指针,因为它们不会自动封送到目标进程的地址空间。但是,在发送方自己的进程内发送的非系统消息可以包含指针,并且应该是线程安全的,因为在接收窗口过程完成消息处理之前,发送代码会被阻止。但是这可靠吗?没有什么能阻止我的信息做同样的事情。还是我误解了你想表达的意思?