/// <include file='doc\FileDialog.uex' path='docs/doc[@for="FileDialog.RunDialog"]/*' />
        /// <devdoc>
        ///    Implements running of a file dialog.
        /// </devdoc>
        /// <internalonly/>
        protected override bool RunDialog(IntPtr hWndOwner)
        {
            NativeMethods.WndProc        hookProcPtr = new NativeMethods.WndProc(this.HookProc);
            NativeMethods.OPENFILENAME_I ofn         = new NativeMethods.OPENFILENAME_I();
            try {
                charBuffer = CharBuffer.CreateBuffer(FILEBUFSIZE);
                if (fileNames != null)
                {
                    charBuffer.PutString(fileNames[0]);
                }
                ofn.lStructSize = Marshal.SizeOf(typeof(NativeMethods.OPENFILENAME_I));

                // SECREVIEW : Assert environment so that we can determine
                //           : the platform that we are running on. We only
                //           : use the information to change the style of
                //           : dialog, so it is safe.
                //
                IntSecurity.UnrestrictedEnvironment.Assert();
                try {
                    // Degrade to the older style dialog if we're not on Win2K.
                    // We do this by setting the struct size to a different value
                    //
                    if (Environment.OSVersion.Platform != System.PlatformID.Win32NT ||
                        Environment.OSVersion.Version.Major < 5)
                    {
                        ofn.lStructSize = 0x4C;
                    }
                }
                finally {
                    CodeAccessPermission.RevertAssert();
                }

                ofn.hwndOwner       = hWndOwner;
                ofn.hInstance       = Instance;
                ofn.lpstrFilter     = MakeFilterString(filter);
                ofn.nFilterIndex    = filterIndex;
                ofn.lpstrFile       = charBuffer.AllocCoTaskMem();
                ofn.nMaxFile        = FILEBUFSIZE;
                ofn.lpstrInitialDir = initialDir;
                ofn.lpstrTitle      = title;
                ofn.Flags           = Options | (NativeMethods.OFN_EXPLORER | NativeMethods.OFN_ENABLEHOOK | NativeMethods.OFN_ENABLESIZING);
                ofn.lpfnHook        = hookProcPtr;
                ofn.FlagsEx         = NativeMethods.OFN_USESHELLITEM;
                if (defaultExt != null && AddExtension)
                {
                    ofn.lpstrDefExt = defaultExt;
                }
                return(RunFileDialog(ofn));
            }
            finally {
                charBuffer = null;
                if (ofn.lpstrFile != IntPtr.Zero)
                {
                    Marshal.FreeCoTaskMem(ofn.lpstrFile);
                }
            }
        }