staticBOOL WINAPI RawDllMain( HINSTANCE, DWORD fdwReason, LPVOID )
{ switch (fdwReason)
{ case DLL_PROCESS_ATTACH:
{ #ifdef _DEBUG
WCHAR buf[64];
DWORD const res = GetEnvironmentVariableW(L"SAL_NO_ASSERT_DIALOGS", buf, SAL_N_ELEMENTS(buf)); if (res && res < SAL_N_ELEMENTS(buf))
{ // disable the dialog on abort()
_CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR);
_CrtSetReportMode(_CRT_ERROR, (_CRTDBG_MODE_DEBUG|_CRTDBG_MODE_FILE)); // not sure which assertions this affects
_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);
_CrtSetReportMode(_CRT_ASSERT, (_CRTDBG_MODE_DEBUG|_CRTDBG_MODE_FILE)); // disable the dialog on assert(false)
_set_error_mode(_OUT_TO_STDERR);
} #endif
#if OSL_DEBUG_LEVEL < 2 /* Suppress file error messages from system like "Floppy A: not inserted" */
SetErrorMode( SEM_NOOPENFILEERRORBOX | SEM_FAILCRITICALERRORS ); #endif
//We disable floating point exceptions. This is the usual state at program startup //but on Windows 98 and ME this is not always the case.
_control87(_MCW_EM, _MCW_EM); break;
}
// This code will attach the process to its parent process // if the parent process had set the environment variable. // The corresponding code (setting the environment variable) // is desktop/win32/source/officeloader.cxx
if ( dwParentProcessId && GetParentProcessId() == dwParentProcessId )
{ // No error check, it works or it does not // Thread should only be started for headless mode, see desktop/win32/source/officeloader.cxx
HANDLE hThread
= reinterpret_cast<HANDLE>(_beginthreadex(nullptr, 0, ParentMonitorThreadProc, reinterpret_cast<LPVOID>(dwParentProcessId), 0, nullptr)); // Note: calling CreateThread in DllMain is discouraged // but this is only done in the headless mode and in // that case no other threads should be running at startup // when sal3.dll is loaded; also there is no // synchronization with the spawned thread, so there // does not appear to be a real risk of deadlock here if (hThread)
CloseHandle(hThread);
}
}
returnTRUE;
}
case DLL_THREAD_ATTACH: break;
case DLL_THREAD_DETACH:
osl_callThreadKeyCallbackOnThreadDetach( ); break;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.