我收到错误代码2,找不到文件。但我尝试过使用完整路径和不使用完整路径。我没有机会启动这个过程,我不知道我的错误是什么,有人能指出它吗?
这是完整的代码:
#include "stdafx.h"
#include <map>
#include <psapi.h>
#include "shlwapi.h"
#define ERROR_FILE_NOT_FOUND = 2;
void Debug(char* path[])
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
char* p = path[0];
char* args = path[1];
int dwProcess = CreateProcess((LPCWSTR)p, (LPWSTR)args, NULL, NULL, false, DEBUG_ONLY_THIS_PROCESS, NULL, NULL, &si, &pi);
if (!dwProcess)
{
DWORD dwLastErrorCode = GetLastError();
printf("Error: %d", dwLastErrorCode);
}
DEBUG_EVENT debug_event = {0};
DWORD dwContinueStatus = DBG_CONTINUE;
DWORD dwResume = DBG_EXCEPTION_HANDLED;
while (!WaitForDebugEvent(&debug_event, INFINITE))
{
switch(debug_event.dwDebugEventCode)
{
case EXCEPTION_DEBUG_EVENT:
{
EXCEPTION_DEBUG_INFO& exception = debug_event.u.Exception;
if (exception.ExceptionRecord.ExceptionCode == 0x0EEDFADE && exception.dwFirstChance)
dwContinueStatus = dwResume;
}
}
ContinueDebugEvent(debug_event.dwProcessId, debug_event.dwThreadId, dwContinueStatus);
}
}
int main(char* argv[])
{
char* p[2] = { "Notepad.exe", "args" };
Debug(p);
return 0;
}感谢您的帮助。
发布于 2012-11-09 07:35:40
int dwProcess = CreateProcess((LPCWSTR)p, (LPWSTR)args,不要将char*强制转换为wchar_t*。↑
去掉所有的C代码类型转换,你会更快乐。:-)
作为一个实际问题,使用宽字符串(wchar_t-based)来处理Windows API。
使用Visual C++获取宽字符程序参数的一个简单方法是使用wmain而不是标准的main。
修正案我忘了这是这样的。那么,当您将char*强制转换为wchar_t*时,实际发生了什么呢
在Windows中,每个wchar_t是2个字节。这意味着,如果没有崩溃,字符串中的每一对连续的char值都将被视为一个wchar_t值。它可能会崩溃,因为宽字符串的空值终止是2个零字节,而您的char字符串只保证一个零字节,因此从CreateProcess代码的角度来看,您的字符串可能会无限期地继续…
简而言之,不要强制转换。
每一次转换都会对编译器说:“闭嘴,编译器,因为我真的明白我在做什么,我不是因为错误才这么做的!”
如果一个人实际上不知道自己在做什么,那么其效果就是让不断试图帮助你避免灾难的工具安静下来。
发布于 2012-11-09 07:32:54
您必须使用完整路径,而不仅仅是notepad.exe。摘自CreateProcess文档:
该字符串可以指定要执行的模块的完整路径和文件名,也可以指定部分名称。在部分名称的情况下,函数使用当前驱动器和当前目录来完成规范。该函数将不使用搜索路径。此参数必须包括文件扩展名;不假定有默认扩展名。
如果希望notepad.exe也打开该文件,则需要为lpCommandLine重复该notepad部件。在同一页上:
如果lpApplicationName和lpCommandLine都非null,则lpApplicationName指向的以null结尾的字符串指定要执行的模块,而lpCommandLine指向的以null结尾的字符串指定命令行。新进程可以使用GetCommandLine检索整个命令行。用C编写的控制台进程可以使用argc和argv参数来解析命令行。因为argv是模块名,所以C程序员通常会重复使用模块名作为命令行中的第一个标记。
发布于 2012-11-09 08:32:03
您正在为参数数据使用Ansi缓冲区,但您调用的是CreateProcess()的Unicode版本,而不是Ansi版本。去掉你的类型转换(如果你没有使用它们,编译器会警告你错误),然后直接调用CreateProcessA():
//CreateProcess((LPCWSTR)p, (LPWSTR)args, ...);
CreateProcessA(p, args, ...);https://stackoverflow.com/questions/13299588
复制相似问题