OutputDebugStringA
예외를 DBG_PRINTEXCEPTION_C
(win10에서 W
버전 - DBG_PRINTEXCEPTION_WIDE_C
)를 생성 - (문자 + 1, 문자열 포인터에 문자열 길이) -이 개 인수이 예외가 this을 위해 우리는이 예외 자신 (시스템 기본 핸들러를 처리 할 수있는 결과를). 리디렉션 OutputDebugString
에 대한
예 핸들러는 콘솔 :
LONG NTAPI VexHandler(PEXCEPTION_POINTERS ExceptionInfo)
{
PEXCEPTION_RECORD ExceptionRecord = ExceptionInfo->ExceptionRecord;
switch (ExceptionRecord->ExceptionCode)
{
case DBG_PRINTEXCEPTION_WIDE_C:
case DBG_PRINTEXCEPTION_C:
if (ExceptionRecord->NumberParameters >= 2)
{
ULONG len = (ULONG)ExceptionRecord->ExceptionInformation[0];
union {
ULONG_PTR up;
PCWSTR pwz;
PCSTR psz;
};
up = ExceptionRecord->ExceptionInformation[1];
HANDLE hOut = GetStdHandle(STD_ERROR_HANDLE);
if (ExceptionRecord->ExceptionCode == DBG_PRINTEXCEPTION_C)
{
// localized text will be incorrect displayed, if used not CP_OEMCP encoding
// WriteConsoleA(hOut, psz, len, &len, 0);
// assume CP_ACP encoding
if (ULONG n = MultiByteToWideChar(CP_ACP, 0, psz, len, 0, 0))
{
PWSTR wz = (PWSTR)alloca(n * sizeof(WCHAR));
if (len = MultiByteToWideChar(CP_ACP, 0, psz, len, wz, n))
{
pwz = wz;
}
}
}
if (len)
{
WriteConsoleW(hOut, pwz, len - 1, &len, 0);
}
}
return EXCEPTION_CONTINUE_EXECUTION;
}
return EXCEPTION_CONTINUE_SEARCH;
}
및 세트
이 핸들러가 호출 할 필요가 :
AddVectoredExceptionHandler(TRUE, VexHandler);
OutputDebugString
here 등의 시스템 구현 - 그것은 정말으로 RaiseException
라고 정확히이 인수는 예외 처리기에서만 MessageBox
- 012라고 표시된 코드.
dbgview를 시도하면 출력 문자열을 캡처합니다. 많은 다른 기능이 있습니다. –
"*이 출력 * 읽기"는 프로그래밍 방식으로 가능합니다 - 가능하면 DBG_PRINTEXCEPTION_ [WIDE_에 대해 VEX 핸들러와 스파이를 설정해야합니다. ] C' - 원하는 경우 콘솔에 'OutputDebugString'을 리디렉션하기위한 코드를 붙여 넣을 수 있습니다. 이것은 작고 간단하지만 – RbMm
@ RbMm 확실합니다. 유용 할 수 있습니다. – Zitrax