• COM相关操作(C#)


    在项目中一个关键的功能需要特别注册第三方的dll控件,以前的操作方式写一个bat处理文件,双击进行注册。问题来了,虽然双击可以注册,但是客户实在是不理解这个东西,为什么要双击这个文件啊?我怎么知道要点击这个文件?更要命的是系统是分布式的,一旦遇到问题,都要到给客户那里进行注册。几百号人,问一个回答一个,肯定不能这样操作,所以到网上研究通过C#代码后台进行注册,如果通过代码注册失败再写到中央服务器的日志系统中。那样只需要关注少量无法注册的用户了,而且在用户发现问题之前或许维护者已经知道了。下面是参照网络写成的,感谢大家的分享。

    • 检查dll是否已经注册

    检查是否已经注册的代码为:

       #region Is dll register
        public bool IsDllRegistered()
        {
          bool reg=true;
          RegistryKey rk=Registry.ClassesRoot.OpenSubKey("CLSID\{AC53EFE4-94A7-47E6-BBFC-E9B9CF322299}");
          if(rk==null)
          {
            MessageBox.Show("未注册");
            reg=false;
          }
          else
          {
            MessageBox.Show("已注册");
          }
          return reg;
        }
        #endregion

    其中GUID串{AC53EFE4-94A7-47E6-BBFC-E9B9CF322299}为注册dll的Class ID。此Class ID在不同的电脑上面注册和重复注册皆不变,开始时在注册表搜索了半天没有找到,可通过一个名叫RegDllView的小工具进行查找。

     

    • 注册dll控件
        #region Open dwg file
        [DllImport(@"../ja-JP/com/DwgViewX.dll")]
        private static extern int DllRegisterServer();
        private void OpenDwgFile(string savePath)
        {
          if(!IsDllRegistered())
          {
            int i = DllRegisterServer();
            if (i >= 0)
            {
              /*
               * Inoke special function to open dwg file
               * */          
            }
            else
            {
              /*
               * Register failed and open dwg with CAD
               * */
              System.Diagnostics.Process.Start(savePath);
            }
          }
        }
        #endregion

    其中@"../ja-JP/com/DwgViewX.dll"是你的dll存储的相对路径。注意需要引用名空间:

    using System.Runtime.InteropServices;
    using Microsoft.Win32;
  • 相关阅读:
    arrayPointer
    shellAPP
    docker
    程序运行时内存管理
    C++ deepin
    coreOS+Docker新一代企业轻量级Linux
    玩转docker
    古典小说丛书系列软件
    读《追随智慧》(一)
    高速基于echarts的大数据可视化
  • 原文地址:https://www.cnblogs.com/jiangxiaoqiang/p/4278698.html
Copyright © 2020-2023  润新知