首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

怎么捕获通过CreateProcess创建的进程抛出的错误

2012-05-22 
如何捕获通过CreateProcess创建的进程抛出的异常trylSucc : CreateProcess(nil,PansiChar(cmd.exe /C

如何捕获通过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而不是你后面这个。所以需要直接创建后面这个进程。

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

热点排行