internal void NativeShow() { // Applies config struct and other settings, then calls main Win32 function. if (settings == null) { throw new InvalidOperationException(LocalizedMessages.NativeTaskDialogConfigurationError); } // Do a last-minute parse of the various dialog control lists, and only allocate the memory at the last minute. MarshalDialogControlStructs(); // Make the call and show the dialog. // NOTE: this call is BLOCKING, though the thread WILL re-enter via the DialogProc. try { ShowState = DialogShowState.Showing; int selectedButtonId; int selectedRadioButtonId; bool checkBoxChecked; // Here is the way we use "vanilla" P/Invoke to call TaskDialogIndirect(). HResult hresult; using (new EnableThemingInScope(true)) { hresult = TaskDialogNativeMethods.TaskDialogIndirect( nativeDialogConfig, out selectedButtonId, out selectedRadioButtonId, out checkBoxChecked); } if (CoreErrorHelper.Failed(hresult)) { string msg; switch (hresult) { case HResult.InvalidArguments: msg = LocalizedMessages.NativeTaskDialogInternalErrorArgs; break; case HResult.OutOfMemory: msg = LocalizedMessages.NativeTaskDialogInternalErrorComplex; break; default: msg = string.Format(System.Globalization.CultureInfo.InvariantCulture, LocalizedMessages.NativeTaskDialogInternalErrorUnexpected, hresult); break; } var e = Marshal.GetExceptionForHR((int)hresult); throw new Win32Exception(msg, e); } SelectedButtonId = selectedButtonId; SelectedRadioButtonId = selectedRadioButtonId; CheckBoxChecked = checkBoxChecked; } catch (EntryPointNotFoundException exc) { throw new NotSupportedException(LocalizedMessages.NativeTaskDialogVersionError, exc); } finally { ShowState = DialogShowState.Closed; } }
internal void NativeShow() { // Applies config struct and other settings, then // calls main Win32 function. if (settings == null) { throw new InvalidOperationException( "An error has occurred in dialog configuration."); } // Do a last-minute parse of the various dialog control lists, // and only allocate the memory at the last minute. MarshalDialogControlStructs(); // Make the call and show the dialog. // NOTE: this call is BLOCKING, though the thread // WILL re-enter via the DialogProc. try { showState = DialogShowState.Showing; // Here is the way we use "vanilla" P/Invoke to call // TaskDialogIndirect(). HRESULT hresult = TaskDialogNativeMethods.TaskDialogIndirect( nativeDialogConfig, out selectedButtonID, out selectedRadioButtonID, out checkBoxChecked); if (CoreErrorHelper.Failed(hresult)) { string msg; switch (hresult) { case HRESULT.E_INVALIDARG: msg = "Invalid arguments to Win32 call."; break; case HRESULT.E_OUTOFMEMORY: msg = "Dialog contents too complex."; break; default: msg = String.Format( "An unexpected internal error occurred in the Win32 call:{0:x}", hresult); break; } Exception e = Marshal.GetExceptionForHR((int)hresult); throw new Win32Exception(msg, e); } } catch (EntryPointNotFoundException) { throw new NotSupportedException("TaskDialog feature needs to load version 6 of comctl32.dll but a different version is current loaded in memory."); } finally { showState = DialogShowState.Closed; } }