Вин 7,"отлаживаемое приложение" - блокнот.Если в этом блокноте вызвать диалог открытия/сохранения файла,то ловлю в RIP_INFO::dwType SLE_ERROR.А в DEBUG_EVENT::u.Exception.ExceptionRecord.ExceptionCode 0x6BA т.е. RPC_S_SERVER_UNAVAILABLE ,и в итоге после этого исключения все сваливаеться в ACCESS_VIOLATION.От чего так происходит? ЗЫ: в ворде даже ненадо никакой диалог вызывать, сразу же через 3-4 секунды вылазит экцепт с RPC_S_SERVER_UNAVAILABLE.В опере при открытии диалога сохранения вообще сразу ACCESS_VIOLATION, ничего не понимаю ((((((
А что потом?Ну определил я что этот еррор возникает внутри GetOpenFileName,видимо фейлиться получение через ком интерфейс из эксплорера проводникового гуя,а почему хз (((( Интересно что эта ф-ция дает еррор при дебаге в ольке и моем коде,но в дебагере студии все гладко... Нет ни у кого идей от чего такие приколы возникают?Неужто в RPCRT4.dll какие то антиотладочные фичи зарыты?
_nic Есть идея в кривости вашего кода. Что проблема потратить пол минуты времи и поюзать отладчик ? С такими желаниями товарищ вы далеко не уедите..
Вот код Код (Text): void PrintExpt(DWORD exCode) { switch(exCode) { case EXCEPTION_ACCESS_VIOLATION:printf("EXCEPTION_ACCESS_VIOLATION"); break; case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:printf("EXCEPTION_ARRAY_BOUNDS_EXCEEDED"); break; case EXCEPTION_BREAKPOINT:printf("EXCEPTION_BREAKPOINT"); break; case EXCEPTION_DATATYPE_MISALIGNMENT:printf("EXCEPTION_DATATYPE_MISALIGNMENT"); break; case EXCEPTION_FLT_DENORMAL_OPERAND:printf("EXCEPTION_FLT_DENORMAL_OPERAND"); break; case EXCEPTION_FLT_DIVIDE_BY_ZERO:printf("EXCEPTION_FLT_DIVIDE_BY_ZERO"); break; case EXCEPTION_FLT_INEXACT_RESULT:printf("EXCEPTION_FLT_INEXACT_RESULT"); break; case EXCEPTION_FLT_INVALID_OPERATION:printf("EXCEPTION_FLT_INVALID_OPERATION"); break; case EXCEPTION_FLT_OVERFLOW:printf("EXCEPTION_FLT_OVERFLOW"); break; case EXCEPTION_FLT_STACK_CHECK:printf("EXCEPTION_FLT_STACK_CHECK"); break; case EXCEPTION_FLT_UNDERFLOW:printf("EXCEPTION_FLT_UNDERFLOW"); break; case EXCEPTION_ILLEGAL_INSTRUCTION:printf("EXCEPTION_ILLEGAL_INSTRUCTION"); break; case EXCEPTION_IN_PAGE_ERROR:printf("EXCEPTION_IN_PAGE_ERROR"); break; case EXCEPTION_INT_DIVIDE_BY_ZERO:printf("EXCEPTION_INT_DIVIDE_BY_ZERO"); break; case EXCEPTION_INT_OVERFLOW:printf("EXCEPTION_INT_OVERFLOW\n"); break; case EXCEPTION_INVALID_DISPOSITION:printf("EXCEPTION_INVALID_DISPOSITION\n"); break; case EXCEPTION_NONCONTINUABLE_EXCEPTION:printf("EXCEPTION_NONCONTINUABLE_EXCEPTION\n"); break; case EXCEPTION_PRIV_INSTRUCTION:printf("EXCEPTION_PRIV_INSTRUCTION\n"); break; case EXCEPTION_SINGLE_STEP:printf("EXCEPTION_SINGLE_STEP\n"); break; case EXCEPTION_STACK_OVERFLOW:printf("EXCEPTION_STACK_OVERFLOW\n"); break; } printf(" Code: %X\n",exCode); } void WinApiErDescr(DWORD erc) { wchar_t erbuf[1024]; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,0,erc,0,erbuf,1024,0); MessageBox(0,erbuf,L"",MB_ICONERROR); } int _tmain(int argc, _TCHAR* argv[]) { STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( &pi, sizeof(pi) ); DEBUG_EVENT de; CreateProcess(target,0,0,0,FALSE,NORMAL_PRIORITY_CLASS,0,0,&si,&pi); printf("Started\n"); DebugActiveProcess(pi.dwProcessId); int i=0; while(i!=1) { ZeroMemory(&de,sizeof(DEBUG_EVENT)); WaitForDebugEvent(&de,INFINITE); switch(de.dwDebugEventCode) { case EXIT_PROCESS_DEBUG_EVENT: ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE); i=1; printf("EXIT_PROCESS_DEBUG_EVENT\n"); break; case EXCEPTION_DEBUG_EVENT: printf("EXCEPTION_DEBUG_EVENT\n"); printf("Adr:%X\n",de.u.Exception.ExceptionRecord.ExceptionAddress); PrintExpt(de.u.Exception.ExceptionRecord.ExceptionCode); printf("RIP: %X\n",de.u.RipInfo.dwType); if(de.u.RipInfo.dwType!=0) { WinApiErDescr(de.u.Exception.ExceptionRecord.ExceptionCode); //i=1; } getch(); ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE); break; case CREATE_THREAD_DEBUG_EVENT: ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE); printf("CREATE_THREAD_DEBUG_EVENT\n"); break; case CREATE_PROCESS_DEBUG_EVENT: printf("CREATE_PROCESS_DEBUG_EVENT\n"); printf("Base: %X\n",de.u.CreateProcessInfo.lpBaseOfImage); ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE); break; case EXIT_THREAD_DEBUG_EVENT: ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE); printf("EXIT_THREAD_DEBUG_EVENT\n"); break; case LOAD_DLL_DEBUG_EVENT: ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE); printf("LOAD_DLL_DEBUG_EVENT\n"); break; case UNLOAD_DLL_DEBUG_EVENT: ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE); printf("UNLOAD_DLL_DEBUG_EVENT\n"); break; case OUTPUT_DEBUG_STRING_EVENT: ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE); printf("OUTPUT_DEBUG_STRING_EVENT\n"); break; case RIP_EVENT: ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE); printf("RIP_EVENT\n"); break; } } DebugActiveProcessStop(pi.dwProcessId); printf("Finished\n"); getch(); return 0; } Идея потвердилась ,или опровергнута? Не совсем понятна фраза про отладчик... Вот кстати тестовое приложение которое в ольке падает так же как и блокнот,при открытии диалога на сохранение\открытие файла Код (Text): void OpenFileDialog(HWND hWnd) { static OPENFILENAME ofn; wchar_t szFileName[1024]; wchar_t szFilter[] = L"Исполняемые файлы\0*.exe\0\0"; wchar_t *fn=new wchar_t[1024*4]; szFileName[0] = szFileName[1] = 0; ZeroMemory(&ofn,sizeof(OPENFILENAME)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hInstance =(HINSTANCE)GetModuleHandle(NULL); ofn.hwndOwner = hWnd; ofn.lpstrFilter = szFilter; ofn.lpstrFile = szFileName; ofn.nMaxFile = sizeof(szFileName); ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST; if (GetOpenFileName(&ofn)) { MessageBoxA(0,"OK","",MB_OK); } else { MessageBoxA(0,"!","",MB_OK); } } int _tmain(int argc, _TCHAR* argv[]) { MessageBoxA(0,"!","",MB_OK); OpenFileDialog(0); return 0; } ЗЫ: кому не трудно,и у кого есть семерка,не могли б вы собрать его, и у себя в ольке проверить?