ok ...これを焼き切って...一日中私の頭を傷つける。私は非常にシンプルな、アプリケーションを起動するために使用される単一の目的のC + +のDLL(StartApplication.dll)があります。Windows 7 - DEBUG_PROCESSを持つCreateProcessアクセス違反
- はWinXPのでは正常に動作しますが、ないwin7のに
- はDEBUG_PROCESSとのCreateProcess()は、(プログラムが終了する前に終了するのをので、私は待つことができます)を使用します。
- タスクマネージャのプロセスを監視すると、プロセスの開始がわかりますが、ウィンドウが作成されず、何も起こりません。
- NORMAL_PRIORITY_CLASSに変更するとプログラムは実行されます私はこの中のデバッグを行うことができますよう
- )終了する前に周りに待ってエラーコードは私にSTATUS_ACCESS_VIOLATION
- を与え、私はUACをオフにし、管理者として実行して、WinXPの互換性を持つために実行可能ファイルを設定すると相続人は何も
をしていませんコード。任意の考えを大幅
//...blah blah...handful of stuff preceding this to set up command line and
//directories etc....not of use here probably...
SECURITY_ATTRIBUTES sa = {0}; sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE;
STARTUPINFO si = {0}; si.cb = sizeof(si);
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdOutput = (NULL == stdOutFileName)? INVALID_HANDLE_VALUE :
::CreateFile(stdOutFileName, GENERIC_WRITE, FILE_SHARE_READ, &sa
, CREATE_ALWAYS, 0, NULL);
si.hStdError = (NULL == stdErrFileName)? INVALID_HANDLE_VALUE :
::CreateFile(stdErrFileName, GENERIC_WRITE, FILE_SHARE_READ, &sa
, CREATE_ALWAYS, 0, NULL)
PROCESS_INFORMATION pi = {0};
if (::CreateProcess(useApplicationName? applicationName : NULL, processCommandLine
, NULL, NULL, TRUE, /*NORMAL_PRIORITY_CLASS*/DEBUG_PROCESS, NULL, currentDirectory, &si, &pi))
{
BOOL cont = TRUE;
while (cont)
{
DWORD continueStatus = DBG_CONTINUE;
DEBUG_EVENT debugEvent = {0};
if (!::WaitForDebugEvent(&debugEvent, INFINITE))
{
errorCode = ErrorCode_Other;
::TerminateProcess(pi.hProcess, 0);
break;
}
else
{
switch (debugEvent.dwDebugEventCode)
{
case EXCEPTION_DEBUG_EVENT:
switch (debugEvent.u.Exception.ExceptionRecord.ExceptionCode)
{
case EXCEPTION_ACCESS_VIOLATION:
case EXCEPTION_DATATYPE_MISALIGNMENT:
case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
case EXCEPTION_FLT_DENORMAL_OPERAND:
case EXCEPTION_FLT_DIVIDE_BY_ZERO:
case EXCEPTION_FLT_INEXACT_RESULT:
case EXCEPTION_FLT_INVALID_OPERATION:
case EXCEPTION_FLT_OVERFLOW:
case EXCEPTION_FLT_STACK_CHECK:
case EXCEPTION_FLT_UNDERFLOW:
case EXCEPTION_INT_DIVIDE_BY_ZERO:
case EXCEPTION_INT_OVERFLOW:
case EXCEPTION_PRIV_INSTRUCTION:
case EXCEPTION_IN_PAGE_ERROR:
case EXCEPTION_ILLEGAL_INSTRUCTION:
case EXCEPTION_NONCONTINUABLE_EXCEPTION:
case EXCEPTION_STACK_OVERFLOW:
case EXCEPTION_INVALID_DISPOSITION:
case EXCEPTION_INVALID_HANDLE:
errorCode = ErrorCode_ApplicationException;
*exceptionCode = debugEvent.u.Exception.
ExceptionRecord.ExceptionCode;
::TerminateProcess(pi.hProcess, 0);
break;
default:
;
}
break;
case EXIT_PROCESS_DEBUG_EVENT:
cont = FALSE;
break;
default:
;
}
::ContinueDebugEvent(debugEvent.dwProcessId, debugEvent.dwThreadId
, continueStatus);
}
}
::GetExitCodeProcess(pi.hProcess, reinterpret_cast<LPDWORD>(exitCode));
::CloseHandle(pi.hProcess);
::CloseHandle(pi.hThread);
}
if (INVALID_HANDLE_VALUE != si.hStdOutput)
::CloseHandle(si.hStdOutput);
if (INVALID_HANDLE_VALUE != si.hStdError)
::CloseHandle(si.hStdError);
return errorCode;
}
@Ajay:EXCEPTION_DEBUG_EVENTスイッチで終了する前にcontinueStatusを設定して、 ".dwFirstChance!= 0"条件を追加しました。単に別のループを実行し、次のループで終了します。私は自分自身をコーディングする初心者のビットです(私はこれを元々書いていませんでした)。もし私が悪いところに置いたら、私に知らせてください。 (またはプロセスの一部がある場合は、私は完全に核にすることができます)。私は物事を並べ替える場合、私はcmdをウィンドウが必要に応じてポップアップを得ることができますが、それはハングアップし、終了するまで何もしません。適切に実行するためにいくつかの種類のウィンドウ7の許可を設定する必要がありますか? – 0xDEADFACE
@ 0xDEADFACEが私の答えを更新しました。 – pezcode
ああそこに行きます。 INT3例外を処理することはそこに欠落していました。正常に終了を処理するために少し調整する必要があったが、それは魅力的だった。おかげで束の間人。 – 0xDEADFACE