Winapi CreateProcess赢得';开始
我收到错误代码2,找不到该文件。但我试过用完整的路径,也试过不用。 我没有幸运地开始这个过程,我不知道我的错误是什么,有人能指出吗 这是完整的代码:Winapi CreateProcess赢得';开始,winapi,Winapi,我收到错误代码2,找不到该文件。但我试过用完整的路径,也试过不用。 我没有幸运地开始这个过程,我不知道我的错误是什么,有人能指出吗 这是完整的代码: #include "stdafx.h" #include <map> #include <psapi.h> #include "shlwapi.h" #define ERROR_FILE_NOT_FOUND = 2; void Debug(char* path[]) { STARTUPINFO si; P
#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;
}
#包括“stdafx.h”
#包括
#包括
#包括“shlwapi.h”
#定义错误文件未找到=2;
无效调试(字符*路径[])
{
STARTUPINFO si;
处理信息;
零内存(&si,sizeof(si));
si.cb=sizeof(si);
零内存(&pi,sizeof(pi));
char*p=路径[0];
char*args=路径[1];
int dwProcess=CreateProcess((LPCWSTR)p,(LPWSTR)args,NULL,NULL,false,DEBUG_ONLY_THIS_进程,NULL,NULL,&si,&pi);
if(!dwProcess)
{
DWORD dwLastErrorCode=GetLastError();
printf(“错误:%d”,dwLastErrorCode);
}
调试事件调试事件={0};
DWORD dwContinueStatus=DBG_CONTINUE;
DWORD dwResume=DBG_异常处理;
while(!WaitForDebugEvent(&debug_event,无限))
{
开关(debug_event.dwDebugEventCode)
{
案例异常\u调试\u事件:
{
异常调试信息&EXCEPTION=DEBUG\u event.u.EXCEPTION;
if(exception.ExceptionRecord.ExceptionCode==0x0EEDFADE&&exception.dwFirstChance)
dwContinueStatus=dwResume;
}
}
ContinuedBugEvent(debug_event.dwProcessId、debug_event.dwThreadId、dwContinueStatus);
}
}
int main(字符*argv[]
{
char*p[2]={“Notepad.exe”,“args”};
调试(p);
返回0;
}
感谢您的帮助。您必须使用完整路径,而不仅仅是
notepad.exe
。摘自文件:
字符串可以指定要创建的模块的完整路径和文件名
执行,也可以指定部分名称。在部分
名称,函数使用当前驱动器和当前目录
完成规格说明该功能将不使用搜索路径。
此参数必须包含文件扩展名;无违约
扩展是假定的
如果希望notepad.exe
也打开该文件,则需要重复lpCommandLine
的notepad
部分。从同一页:
如果lpApplicationName和lpCommandLine都不为NULL,则
lpApplicationName指向的以null结尾的字符串指定
要执行的模块,以及
lpCommandLine指定命令行。新流程可以使用
GetCommandLine以检索整个命令行控制台进程
用C编写的程序可以使用argc和argv参数来解析命令
线因为argv[0]是模块名,所以C程序员通常
将模块名称作为命令行中的第一个标记重复。
您必须使用完整路径,而不仅仅是
notepad.exe
。摘自文件:
字符串可以指定要创建的模块的完整路径和文件名
执行,也可以指定部分名称。在部分
名称,函数使用当前驱动器和当前目录
完成规格说明该功能将不使用搜索路径。
此参数必须包含文件扩展名;无违约
扩展是假定的
如果希望notepad.exe
也打开该文件,则需要重复lpCommandLine
的notepad
部分。从同一页:
如果lpApplicationName和lpCommandLine都不为NULL,则
lpApplicationName指向的以null结尾的字符串指定
要执行的模块,以及
lpCommandLine指定命令行。新流程可以使用
GetCommandLine以检索整个命令行控制台进程
用C编写的程序可以使用argc和argv参数来解析命令
线因为argv[0]是模块名,所以C程序员通常
将模块名称作为命令行中的第一个标记重复。
↑ 不要将char*
转换为wchar\u t*
移除所有C型铸造,并更快乐。:-)
实际上,使用宽字符串(wchar\t
)来处理Windows API
一个用Visual C++获取宽字符程序参数的简单方法(虽然它对编译器是特定的)是使用<代码> WMeN>代码>代替标准<代码>主< /COD>
修正案我忘了是这样的。那么,当您将
char*
强制转换为wchar\u t*
时,实际会发生什么呢
在Windows中,每个wchar\u t
是2个字节。这意味着,如果字符串没有崩溃,字符串中的每一对连续的char
值都将被视为一个wchar\t
值。它可能会崩溃,因为宽字符串的空终止为2个零字节,而char
字符串只保证一个零字节,因此从CreateProcess
代码的角度来看,字符串可能会无限期地继续
总之,不要投
每个演员都对编译器说:“闭嘴,编译器,因为我真的明白我在做什么,我没有错!”
如果一个人实际上不知道自己在做什么,那么结果就是让这个一直试图帮助你避免灾难的工具沉默
↑ 不要将char*
转换为wchar\u t*
移除所有C型铸造,并更快乐。:-)
实际上,使用宽字符串(wchar\t
)来处理Windows API
一个用Visual C++获取宽字符程序参数的简单方法(虽然它对编译器是特定的)是使用<代码> WMeN>代码>代替标准<代码>主< /COD>
修正案我忘了是这样的。那么,当您将
char*
强制转换为wcha时,实际会发生什么呢
int dwProcess = CreateProcess((LPCWSTR)p, (LPWSTR)args,
//CreateProcess((LPCWSTR)p, (LPWSTR)args, ...);
CreateProcessA(p, args, ...);