public virtual int Exec(ref Guid pguidCmdGroup, uint nCmdID, uint nCmdexecopt, IntPtr pvaIn, IntPtr pvaOut)
        {
            // Wrap parameters into argument type instance
            var execArgs = new ExecArgs(pguidCmdGroup, nCmdID);

            execArgs.CommandExecOpt = nCmdexecopt;
            execArgs.PvaIn          = pvaIn;
            execArgs.PvaOut         = pvaOut;

            if (pguidCmdGroup == VSConstants.GUID_VSStandardCommandSet97)
            {
                // Process standard Visual Studio Commands
                switch (nCmdID)
                {
                case (uint)VSConstants.VSStd97CmdID.Copy:

                    // ICommonCommandSupport _UIControl.DoCopy();
                    return(VSConstants.S_OK);

                case (uint)VSConstants.VSStd97CmdID.Cut:

                    // ICommonCommandSupport _UIControl.DoCut();
                    return(VSConstants.S_OK);

                case (uint)VSConstants.VSStd97CmdID.Paste:

                    // ICommonCommandSupport _UIControl.DoPaste();
                    return(VSConstants.S_OK);

                case (uint)VSConstants.VSStd97CmdID.Redo:

                    // ICommonCommandSupport _UIControl.DoRedo();
                    return(VSConstants.S_OK);

                case (uint)VSConstants.VSStd97CmdID.Undo:

                    // ICommonCommandSupport _UIControl.DoUndo();
                    return(VSConstants.S_OK);

                case (uint)VSConstants.VSStd97CmdID.SelectAll:

                    // ICommonCommandSupport _UIControl.DoSelectAll();
                    return(VSConstants.S_OK);

                default:
                    return(ExecuteVSStd97Command(execArgs) ? VSConstants.S_OK : (int)Microsoft.VisualStudio.OLE.Interop.Constants.OLECMDERR_E_NOTSUPPORTED);
                }
            }

            // Execute commands owned by the editor
            if (pguidCmdGroup == commandSetGuid)
            {
                return(ExecuteOwnedCommand(execArgs) ? VSConstants.S_OK : (int)Microsoft.VisualStudio.OLE.Interop.Constants.OLECMDERR_E_NOTSUPPORTED);
            }

            // Execute any other command
            return(ExecuteCommand(execArgs) ? VSConstants.S_OK : (int)Microsoft.VisualStudio.OLE.Interop.Constants.OLECMDERR_E_NOTSUPPORTED);
        }
 protected virtual bool ExecuteVSStd97Command([CanBeNull] ExecArgs execArgs)
 {
     return(false);
 }
 protected virtual bool ExecuteOwnedCommand([NotNull] ExecArgs execArgs)
 {
     return(false);
 }