转载>怎样使控件注册到VS2005 工具箱中(二)

 是感觉他写的this 的用法比较合我个人用法也是我可以接受的思想,以备以后参考吧
一、创建一个新的控制台程序项目,别忘了添加DTE引用哦,具体就参考方法一。
二、建立控件注册类StandardToolBoxCreator,其中包括一个子类ComponentData,你也可以把独立出来:
         /// <summary>
        
/// 控件数据类
        
/// </summary>

         public   class  ComponentData
        
{
            
public ComponentData(string name, string fullPath)
            
{
                
this._name = name;
                
this._fullPath = fullPath;
            }


            
private string _name;
            
private string _fullPath;

            
/// <summary>
            
/// 控件类型的完全限定名称
            
/// </summary>

            public string Name
            
{
                
get return _name; }
                
set { _name = value; }
            }


            
/// <summary>
            
/// 控件文件的完全路径
            
/// </summary>

            public string FullPath
            
{
                
get return _fullPath; }
                
set { _fullPath = value; }
            }

        }

1.对象初始化的时候读取控件DLL文件列表INI文件ComponentList.ini,每个DLL文件之间用“;”隔开,可以是相对路径也可以是绝对路径,其方法是GetDllFiles();
2.如果有可用的DLL文件则进行注册操作RunCreator(DTE dte)
首先打开一个临时Solution激活DTE,然后获得DTE的工具箱窗体Window中的工具箱ToolBox,再通过工具箱获取选项卡集合,并创建自己的选项卡,最后在自己的选项卡内注册控件。

         变量区

        
构造函数

        
获取需要安装的控件Dll文件

        
获取所有需要安装的控件数据

        
获取所有需要安装的控件类型

        
控件注册到工具箱的方法

        
注册组件

        
查找标签或创建标签



三、改写Main方法,代码如下:

static   void  Main( string [] args)
        
{
            
try
            
{
                
if (Program.IsOpenVS())
                
{
                    Console.WriteLine(
"请关闭VS2005!");
                }

                
else
                
{
                    Type typeFromProgID 
= Type.GetTypeFromProgID("VisualStudio.DTE.8.0"false);
                    DTE myDTE 
= (DTE)Activator.CreateInstance(typeFromProgID);

                    
if (myDTE == null)
                    
{
                        Console.WriteLine(
"无法打开DTE!");
                        
return;
                    }


                    MessageFilter.Register();

                    
try
                    
{
                        ToolBoxCreator creator 
= new ToolBoxCreator();
                        creator.RunCreator(myDTE);
                    }

                    
catch
                    
{
                        
throw;
                    }

                    
finally
                    
{
                        myDTE.Quit();
                        MessageFilter.Revoke();
                    }

                }

            }

            
catch (Exception ex)
            
{
                Console.WriteLine(ex.Message);
            }
  

           Console.Read();
        }

IsOpenVS()方法用来判断VS2005是否启动,如果启动,注册控件到工具箱将不会成功!

/// <summary>
        
/// 是否打开VS2005
        
/// </summary>
        
/// <returns></returns>

         public   static   bool  IsOpenVS()
        
{
            
foreach (System.Diagnostics.Process process in System.Diagnostics.Process.GetProcesses())
            
{
                
if (process.ProcessName == "devenv")
                
{
                    
return true;
                }

            }

            
return false;
        }

接下就启动DTE,如果成功则进行消息过滤器注册,这样主要为了避免程序在进行注册时发生中断。过滤器实现IMessageFilter接口,为了避免与System.Windows.Form.IMessageFilter接口重名,这里改作IOleMessageFilter:

     /// <summary>
    
/// 用来处理当前线程的并发事件,只有一个消息过滤器能够注册到单线程中,多线程没有消息过滤器
    
/// <remarks>
    
/// MessageFilter:消息过滤器
    
/// </remarks>
    
/// </summary>

    [ComImport, Guid( " 00000016-0000-0000-C000-000000000046 " ), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    
internal   interface  IOleMessageFilter
    
{
        [PreserveSig]
        
int HandleInComingCall(int dwCallType, IntPtr hTaskCaller, int dwTickCount, IntPtr lpInterfaceInfo);
        [PreserveSig]
        
int RetryRejectedCall(IntPtr hTaskCallee, int dwTickCount, int dwRejectType);
        [PreserveSig]
        
int MessagePending(IntPtr hTaskCallee, int dwTickCount, int dwPendingType);
    }

}

实现类:
     /// <summary>
    
/// 消息过滤器类
    
/// </summary>

     internal   class  MessageFilter : IOleMessageFilter
    
{
        
/// <summary>
        
/// 向OLE 注册登记 IOleMessageFilter(IMessageFilter) 实例
        
/// </summary>
        
/// <param name="newfilter">将被注册到当前线程中的消息过滤器</param>
        
/// <param name="oldfilter">以前注册到当前线程中的消息过滤器,如果没有则为NULL</param>
        
/// <returns>
        
/// S_OK 注册或取消注册成功;
        
/// S_FALSE 注册或取消注册失败。
        
/// </returns>

        [DllImport("Ole32.dll")]
        
private static extern int CoRegisterMessageFilter(IOleMessageFilter newfilter, out IOleMessageFilter oldfilter);

        
/// <summary>
        
/// 注册消息过滤器
        
/// </summary>

        public static void Register()
        
{
            IOleMessageFilter newfilter 
= new MessageFilter();
            IOleMessageFilter oldfilter 
= null;
            CoRegisterMessageFilter(newfilter, 
out oldfilter);
        }


        
/// <summary>
        
/// 取消注册
        
/// </summary>

        public static void Revoke()
        
{
            IOleMessageFilter oldfilter 
= null;
            CoRegisterMessageFilter(
nullout oldfilter);
        }


        
/// <summary>
        
/// 
        
/// </summary>
        
/// <param name="dwCallType"></param>
        
/// <param name="hTaskCaller"></param>
        
/// <param name="dwTickCount"></param>
        
/// <param name="lpInterfaceInfo"></param>
        
/// <returns>
        
/// SERVERCALL_ISHANDLED 
        
/// SERVERCALL_REJECTED 
        
/// SERVERCALL_RETRYLATER
        
/// </returns>

        int IOleMessageFilter.HandleInComingCall(int dwCallType, IntPtr hTaskCaller, int dwTickCount, IntPtr lpInterfaceInfo)
        
{
            
return 0;//SERVERCALL_ISHANDLED
        }


        
/// <summary>
        
/// 当COM等待远程调用回复的时候,有Windows消息出现在COM应用程序消息队列中时调用
        
/// </summary>
        
/// <param name="hTaskCallee"></param>
        
/// <param name="dwTickCount"></param>
        
/// <param name="dwPendingType"></param>
        
/// <returns>
        
/// PENDINGMSG_CANCELCALL 
        
/// PENDINGMSG_WAITNOPROCESS
        
/// PENDINGMSG_WAITDEFPROCESS
        
/// </returns>

        int IOleMessageFilter.MessagePending(IntPtr hTaskCallee, int dwTickCount, int dwPendingType)
        
{
            
return 2;//PENDINGMSG_WAITDEFPROCESS 
        }


        
/// <summary>
        
/// 
        
/// </summary>
        
/// <param name="hTaskCallee"></param>
        
/// <param name="dwTickCount"></param>
        
/// <param name="dwRejectType">SERVERCALL_REJECTED 或 SERVERCALL_RETRYLATER</param>
        
/// <returns>
        
/// -1                      取消调用
        
/// Value >= 0 & &lt 100    立即重试
        
/// Value >= 100            等待Value毫秒再重新调用
        
/// </returns>

        int IOleMessageFilter.RetryRejectedCall(IntPtr hTaskCallee, int dwTickCount, int dwRejectType)
        
{
            
if (dwRejectType == 2) //SERVERCALL_RETRYLATER
            {
                
return 99;          //如果返回值>=0 & <100 立即重试
            }

            
return -1;              //取消调用
        }

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薇薇吴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值