- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
成功调用 CreateProcess 后,我尝试使用 GetModuleFileNameEx 获取创建的进程的路径(lpApplicationName 和 lpCommandLine 参数可以变化或为空,因此在这种情况下它们不可靠)。问题是 GetModuleFileNameEx 失败并出现错误 6 (ERROR_INVALID_HANDLE),从而使其缓冲区中包含无效数据。我无法理解原因,因为 CreateProcess 成功并且进程句柄应该已正确保存在 pi.hProcess 中。
希望您能有所启发,在此先感谢您!
编辑:更新:我注意到删除 CREATE_SUSPENDED 也可以解决此问题,但我需要设置该标志。我该怎么办?
// Defining GetModuleFileNameExA function
typedef DWORD (WINAPI *fGetModuleFileNameExA)
(
HANDLE hProcess,
HMODULE hModule,
LPSTR lpFilename,
DWORD nSize
);
//Load dinamically DLL function on program startup:
fGetModuleFileNameExA _GetModuleFileNameExA = (fGetModuleFileNameExA) GetProcAddress( LoadLibraryA("Psapi.dll"), "GetModuleFileNameExA");
// **** OTHER UNRELATED CODE HERE ****
PROCESS_INFORMATION pi;
//This call succeeds
if (!CreateProcessW( ApplicationName,
CommandLine,
NewProcess.lpProcessAttributes,
NewProcess.lpThreadAttributes,
NewProcess.bInheritHandles,
CREATE_SUSPENDED | CREATE_NEW_CONSOLE,
NULL,
CurrentDirectory,
&NewProcess.bufStartupInfo,
&pi)
) MessageBoxA(0, "Error creating process", "", 0);
char ProcessPath[MAX_PATH];
//Problem here: call fails with error 6
if (!_GetModuleFileNameExA(pi.hProcess, NULL, ProcessPath, MAX_PATH)) {GetLastError();}
//Invalid data is displayed
MessageBoxA(0, ProcessPath, "GetModuleFileNameEx",0);
最佳答案
来自CreateProcess documentation在 MSDN 上:
Note that the function returns before the process has finished initialization. If a required DLL cannot be located or fails to initialize, the process is terminated. To get the termination status of a process, call
GetExitCodeProcess
....
The calling thread can use the
WaitForInputIdle
function to wait until the new process has finished its initialization and is waiting for user input with no input pending. This can be useful for synchronization between parent and child processes, because CreateProcess returns without waiting for the new process to finish its initialization. For example, the creating process would use WaitForInputIdle before trying to find a window associated with the new process.
关于c++ - 在 CreateProcess 之后调用 GetModuleFileNameEx 时出现 ERROR_INVALID_HANDLE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24863882/
为什么每次执行下面的代码时,SetThreadDesktop()失败并显示以下消息: ERROR_INVALID_HANDLE 新桌面创建成功,表示句柄打开了。 发生了什么事? program Pro
我正在尝试使用 DuplicateHandle 函数将句柄从 process1 传递到 process2。我使用 CreateFile 函数获取句柄: HANDLE COMportHandle; CO
我试图通过调用 WaitForSingleObject() 来确定一个进程是否仍然存在(在我检查的那一刻,我知道它可以在我检查后立即关闭)带句柄从Process.MainWindowHandle得到这
我是第一次尝试使用 CreateFileMapping,当我使用 GetLastError() 时出现此错误: ERROR_INVALID_HANDLE: The handle is invalid.
我正在ctypes中使用winsock2套接字,我可以很好地执行closesocket(),但是调用CloseHandle,总是会导致ERROR_INVALID_HANDLE (6)。我该如何正确关闭
我正在尝试实现一个系统,其中任意数量的进程将通过命名管道相互通信。 Windows 中的实现是在 C++ 中。但是,我被卡住了,因为进程似乎无法接收消息。我找不到类似的问题,如果已经有人问过,我深表歉
免责声明:这是程序要求的一部分,因此没有任何不良意义。如果您发现任何误用,请随时指出。我是 C++ 的初学者。 基本上,我正在尝试使用 C++ 在 Windows 上重新启动 Outlook.exe。
您好,我试图挂起一个远程线程,但在途中我偶然发现 DuplicateHandle 失败并出现错误 6,ERROR_INVALID_HANDLE。 下面的方法适用于当前进程,但如果给出了像“calc”(
我尝试在两个类之间共享一个 HPBUFFERARB:TGLForm 和 TGLForm2。(我试过 FBO,但我有一个旧的 Borland Builder 6 版本,我无法使用 FBO 进行管理) 我
我正在尝试获取引用特定 USB 设备的 Windows::Devices::Usb::UsbDevice 对象,以便将其传递给第 3 方插件。由于项目限制,我无法使用 C++/CX 扩展。 在查看了无
成功调用 CreateProcess 后,我尝试使用 GetModuleFileNameEx 获取创建的进程的路径(lpApplicationName 和 lpCommandLine 参数可以变化或为
我正在尝试 VirtualDisk API,到目前为止,我可以打开 VHDX 文件,并使用 GetVirtualDiskInformation 获取一些属性。但我无法获取 RCT 信息和 Change
我正在将二进制组件转换为 js-ctypes,而 StartPagePrinter 给了我 ERROR_INVALID_HANDLE。我正在使用标准 Windows 技术进行打印。 (搜索“MSDN
我正在创建一个 .NET Windows 服务来与智能卡读卡器通信。主要组件是一个名为 winscard.dll 的 Windows DLL,我在 .NET 代码中将其与 DLLImport 属性一起
我是一名优秀的程序员,十分优秀!