小编par*_*ice的帖子

WriteFileEx完成例程成功,但传输的字节不正确

我正在使用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)

c c++ windows winapi named-pipes

9
推荐指数
1
解决办法
2568
查看次数

终止Qt过程:Windows任务管理器在做什么我不是?

我有一个应用程序,其工作是启动和停止各种其他进程.

问题是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)

c++ windows winapi qt kill-process

5
推荐指数
1
解决办法
1610
查看次数

DLL 重定向 - 在 XP 中工作,在 Windows 7 中不起作用

在 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文档没有提到平台之间程序集工作方式的任何差异,但一定存在一些差异,导致重定向无法工作......

有任何想法吗?

windows dll manifest

4
推荐指数
1
解决办法
1706
查看次数

标签 统计

windows ×3

c++ ×2

winapi ×2

c ×1

dll ×1

kill-process ×1

manifest ×1

named-pipes ×1

qt ×1