读书人

怎么捕获通过CreateProcess创建的进程

发布时间: 2012-05-22 18:18:54 作者: rapoo

如何捕获通过CreateProcess创建的进程抛出的异常
try
lSucc := CreateProcess(nil,
PansiChar('cmd.exe /C ' + cmd),
nil,
nil,
true,
0,
nil,
nil,
stifo,
pinfo);
except //这里实际上捕获不到报的异常,得想其它办法
on e: exception do
showmessage(e.Message);
end;
if lSucc then //跟踪运行到这里的时候报异常,请问如何捕获CreateProcess抛出的异常?

[解决办法]
先确定那个异常是不是自己抛出的,如果是cmd.exe抛出的异常,那属于别的进程范围,你当然没办法捕获了
try
catch只限于处理本进程内部的异常

不过CreateProcess这个api有两个参数好像可以将目标进程设为调试状态
BOOL WINAPI CreateProcess(
__in_opt LPCTSTR lpApplicationName,
__inout_opt LPTSTR lpCommandLine,
__in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes,
__in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in BOOL bInheritHandles,
__in DWORD dwCreationFlags,
__in_opt LPVOID lpEnvironment,
__in_opt LPCTSTR lpCurrentDirectory,
__in LPSTARTUPINFO lpStartupInfo,
__out LPPROCESS_INFORMATION lpProcessInformation
);
其中的dwCreationFlags设置为DEBUG_PROCESS或 DEBUG_ONLY_THIS_PROCESS就可以调试目标进程
[解决办法]
这个异常应该是被OS捕获的,可以用GetLastError获取ErrorCode,或者直接ShowMessage(SysErrorMessage(GetLastError))。
[解决办法]
你用
CreateProcess(nil,
PansiChar('cmd.exe /C ' + cmd),
即使用调试模式,调试的程序是cmd.exe而不是你后面这个。所以需要直接创建后面这个进程。

还有,有些程序有反调试代码,发现被调试,程序就可能退出,甚至会干坏事。

读书人网 >.NET

热点推荐