我正在使用IO完成例程通过管道在不同机器上的两个进程之间进行通信.
有时,当调用WriteFileEx的完成例程时,完成例程参数dwErrorCode为0(即无错误),GetOverlappedResult返回true(即无错误),但dwNumberOfBytesTransfered与WriteFileEx调用中的nNumberOfBytesToWrite不匹配.我只在管道的客户端看到这个.
如果传输的字节数与请求传输的字节数不匹配,那么如何才能认为这是成功的?
这是客户端管道句柄的创建方式:
mHPipe = CreateFile(pipeName, // pipe name
GENERIC_READ | // read and write access
GENERIC_WRITE,
0, // no sharing
NULL, // default security attributes
OPEN_EXISTING, // opens existing pipe
FILE_FLAG_OVERLAPPED | // overlapped
FILE_FLAG_WRITE_THROUGH, // write through mode
NULL); // no template file
// do some checking...
// The pipe connected; change to message-read mode.
DWORD dwMode = PIPE_READMODE_MESSAGE;
BOOL fSuccess = SetNamedPipeHandleState(mHPipe, // pipe handle
&dwMode, // new pipe mode
NULL, // don't set maximum bytes …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,其工作是启动和停止各种其他进程.
问题是Qt应用程序不能完全停止.Qt窗口关闭,但进程仍然在后台运行,直到调用TerminateProcess(),然后Qt应用程序退出而不进行清理.
我正在使用Microsoft概述的这种方法.甚至Qt源也使用该方法来终止进程,除了它们还将WM_CLOSE发布到主线程.我已将其添加到我的应用程序中,但它仍然只是关闭窗口,离开了该过程.
我觉得有趣的是,如果我使用Windows任务管理器来"结束任务"(不是"结束进程"),窗口关闭,进程也结束,所以我知道这是可能的.如果我使用spy ++我可以看到主窗口和主线程都从任务管理器和我的应用程序接收WM_CLOSE消息,但只有使用任务管理器,消息继续到WM_DESTROY,WM_NCDESTROY等,最后结束进程结束.这个问题只发生在Qt应用程序中.Win32/MFC等应用程序使用我的应用程序干净地终止.
你应该如何干净地关闭Qt应用程序(假设Qt应用程序源不可用)?
- - - - 编辑 - - - -
这里有一些示例代码可以重现问题.至少,我有兴趣知道其他人是否看到了我所看到的同样问题.
示例代码启动CMake(此处下载),但任何Qt应用都应该这样做.
#include <Windows.h>
#include <iostream>
BOOL CALLBACK TerminateAppEnum(HWND hwnd, LPARAM pid);
int _tmain(int argc, _TCHAR* argv[])
{
char* processName = "C:\\Program Files (x86)\\CMake\\bin\\cmake-gui.exe";
//char* processName = "C:\\Windows\\Notepad.exe";
std::cout << "Creating process \"" << processName << "\"" << std::endl;
STARTUPINFO si = {0};
si.cb = sizeof(STARTUPINFO);
PROCESS_INFORMATION pi = {0};
BOOL success = CreateProcess(processName,
"",
NULL,
NULL, …Run Code Online (Sandbox Code Playgroud) 在 Windows XP 上,我为指定的应用程序重定向 user32.dll,但在 Windows 7 上使用相同的设置,不会重定向 user32.dll。
设置是这样的 - 一个目录包含:
app.exe
app.exe.manifest
user32.dll
app.exe.manifest 包含:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="0.0.0.0"
name="Redirection"
type="win32"
/>
<file
name="user32.dll"
/>
</assembly>
Run Code Online (Sandbox Code Playgroud)
在 Windows XP 上,app.exe 从应用程序文件夹加载 user32.dll。在 Windows 7 上,app.exe 从 system32 文件夹加载 user32.dll。
如何让 app.exe 从 Windows 7 上的应用程序文件夹加载 user32.dll?MSDN文档没有提到平台之间程序集工作方式的任何差异,但一定存在一些差异,导致重定向无法工作......
有任何想法吗?