欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C# Com组件注册Regsvr32

程序员文章站 2022-06-25 18:46:30
...

Regsvr32命令用于注册COM组件,是Windows系统提供的用来向系统注册控件或者卸载控件的命令,以命令行方式运行。

命令格式:regsvr32 [/u] [/s] [/n] [/i[:cmdline]] dllname 其中dllname为activex控件文件名,建议在安装前拷贝到system文件夹下。

参数:

/u  反注册控件

/s  指定 regsvr32 安静运行,在成功注册/反注册DLL文件的前提下不显示结果提示框。

/n  指定不调用 DllRegisterServer。此选项必须与 /i 共同使用。

/i:cmdline  调用 DllInstall 将它传递到可选的 [cmdline]。在与 /u 共同使用时,它调用 dll 卸载

dllname  指定要注册的 dll 文件名

/?  在命令提示符显示帮助。

组件注册:

注册一个组件使用regsvr32 xxx.dll命令。其中DLL(即xxx.dll)输出四个函数。DllGetClassObject,DllRegisterServer,DllUnregisterServer和DllMain。下面简单介绍这四个函数的用途

1、DllGetClassObject用于返回classfactory对象指针,classfactory用于创建组件实例,详情参看《COM技术内幕》

2、DllRegisterServer由词义看出其用于注册组件,在windows的注册表中给某个dll的登记。注意DLL(xxx.dll)内部包含一个或多个组件。regsvr32 -s xxx.dll即regsvr32调用xxx.dll中的此函数完成组件的注册。多说一句,注册是为了能够索引到xxx.dll然后创建组件。

3、DllUnregisterServer在windows的注册表中取消某个dll的登记

4、DllMain:c++程序有一个main函数作为程序入口,windows程序使用WinMain作为程序入口,Dll使用的是DllMain作为入口。主要用于获取模块句柄。下面是其实现方式

BOOL APIENTRY DllMain(HINSTANCE hModule,DWORD dwReason, void* lpReserved)
{
    if(dwReason==DLL_PROCESS_ATTACH)
    {
        g_hModule=hModule;
    }
}

可以看到,DllMain将模块句柄保存到一个全局g_hModule中,以供DllregisterServer和DllUnregisterServer使用

https://baike.so.com/doc/4436542-4644614.html

C#注册方式:

1、使用COM组件的DllRegisterServer注册

        /// <summary>
        /// 判断使用已经注册成功
        /// </summary>
        /// <returns></returns>
        public static bool HaveZc()
        {
            bool exist1 = RegEdit.KeyExist(Registry.ClassesRoot, @"CLSID\{C58C0BBB-C055-45FE-9C10-0F9731F8FE19}");
            bool exist2 = RegEdit.KeyExist(Registry.LocalMachine, @"SOFTWARE\Classes\CLSID\{C58C0BBB-C055-45FE-9C10-0F9731F8FE19}");
            return (exist1 || exist2);
        }

        [DllImport("SOFAtl.dll")]
        public static extern int DllRegisterServer();//注册时用
        public static void RegCom()
        {
            if (!HaveZc())
            {
                if (DllRegisterServer() < 0)
                {
                    MessageBox.Show("SOFAtl.dll注册失败!");
                }
            }
        }

2、执行批处理命令注册

        public static void RunBatchCmd(string cmdstr)
        {
            WinExec("cmd.exe /c " + cmdstr, 0);
        }

        public static void RegComBatch()
        {
            //注册
            ProcHelper.RunBatchCmd("regsvr32 /s \"" + AppPath + "\\SOFAtl.dll\"");
            //反注册
            ProcHelper.RunBatchCmd("regsvr32 /u /s \"" + AppPath + "\\SOFAtl.dll\"");

            !!注意:批处理命令 COM文件绝对路径用双引号括住
        }

3、方式2的改良

        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        public static extern int GetShortPathName(
            [MarshalAs(UnmanagedType.LPTStr)]string path,
            [MarshalAs(UnmanagedType.LPTStr)]StringBuilder short_path,
            int short_len
            );

        /// <summary>
        /// 计算路径的短路径
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public static string GetShortPath(string name)
        {
            int lenght = 0;

            lenght = GetShortPathName(name, null, 0);
            if (lenght == 0)
            {
                //new nghmp.GenericErrorForm("Can't get short path name", name, true);
                return name;
            }
            StringBuilder short_name = new StringBuilder(lenght);
            lenght = GetShortPathName(name, short_name, lenght);
            if (lenght == 0)
            {
                //new nghmp.GenericErrorForm("Can't get short path name", name, true);
                return name;
            }
            return short_name.ToString();
        }

        private void button17_Click(object sender, EventArgs e)
        {
            //string filename = @"D:\Program Files\JJEorMgr\FUNCTION\AAA\regsvr32\SOFAtl.dll";
            string filename = @"D:\SOFAtl.dll";
            string shortname= GetShortPath(filename);
            ProcHelper.RunBatchCmd("regsvr32 " + shortname);
        }//GetShortPath

https://baike.so.com/doc/539063-570712.html

相关标签: C#