C# Com组件注册Regsvr32
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
上一篇: 红旗linux中的ftp配置过程
推荐阅读
-
接口的 COM 组件调用 QueryInterface 因以下错误而失败: 库没有注册。
-
易语言中锐浪报表绿色发布指南(免COM组件DLL注册)
-
C# 无需COM组件创建快捷方式的实现代码
-
C# 基于NPOI+Office COM组件 实现20行代码在线预览文档(word,excel,pdf,txt,png)
-
检索 COM 类工厂中 CLSID 为 {13C28AD0-F195-4319-B7D7-A1BDAA329FB8} 的组件失败,原因是出现以下错误: 80040154 没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG))。
-
如何在C#中调用COM组件
-
C# Com组件注册Regsvr32
-
64位操作系统中注册32位COM组件的方法
-
实现通过COM组件方式实现java调用C#写的DLL文件的完整demo
-
[Access] C#通过COM组件访问Access文件