利用RegSvr32来注册.NET COM组件
利用RegSvr32来注册.NET COM组件
∙背景
前一段时间由于业务关系,须要在一个比较旧的系统编写一个补丁。
原系统使用VB编程,但如果要使用VB来实现这个补丁的内容,对于我这个并不怎么接触VB的人来说太头痛了。
由于平时使用的是C#来开发,于是便想到能否用编写.NET COM组件的方式来让VB调用。
想到这两三下便写了个.NET COM 测试组件,用VB测试调用测试OK。
接下来就是进行后续的开发,可等到开发完成后到了补丁打包环节却傻眼了。
原来的补丁打包工具在诞生时还不知道.NET为何物,所以根本没有使用RegAsm来注册.NET COM组件的功能。
现在更改打补丁工具那是不现实的,可要使得VB调用.NET COM又必须使用RegAsm 注册,这下怎么办呢?
∙解决方式
原打包工具是支持使用RegSvr32来注册Com组件的,忽然想到能否使用RegSvr32来注册.NET COM组件呢?印象中regsvr32在注册DLL的时候会有个CallBack函数的,于是赶紧Google找找相关资料最终解决了这个问题。
主要原理是写一个代理的dll,在这个DLL的注册响应函数DllRegisterServer里调用RegAsm来注册.NET COM,同理在DllUnregisterServer里反注册。
∙代理DLL代码
stdafx.h
#pragma once
#include <windows.h>
#include <tchar.h>
Register.cpp
/*----------------------------------------------
此组件主要解决C#编写的COM组件无法用RegSvr32注册的问题
原理是增加一个代理DLL,在代理DLL注册时,响应DllRegisterServer注册函数,
在响应函数中使用RegAsm来注册.Net Com组件,反注册同理。
----------------------------------------------*/
#include "stdafx.h"
#define MAX_PATH 260
//全局变量,存放注册代理dll路劲
TCHAR g_FilePath[MAX_PATH];
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
//记录代理DLL的路径,主要是为了方便后面获取代理DLL所在目录
GetModuleFileName(hModule, g_FilePath, 255);
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
//注册响应函数
extern"C" _declspec(dllexport) long DllRegisterServer(void)
{
return Register(TRUE);
}
//反注册响应函数
extern"C" _declspec(dllexport) long DllUnregisterServer(void)
{
return Register(FALSE);
}
//注册组件
//install : TRUE for install, FALSE for unstall
BOOL Register(BOOL install){
TCHAR cmd[MAX_PATH];
PROCESS_INFORMATION processInfo;
STARTUPINFO stInfo;
//获取注册命令
GetCmdLine(cmd, install);
ZeroMemory( &processInfo, sizeof(processInfo) );
ZeroMemory( &stInfo, sizeof(stInfo) );
stInfo.cb = sizeof(stInfo);
BOOL ret;
//创建注册进程
ret =
CreateProcess(NULL,cmd,NULL,NULL,FALSE,CREATE_NO_WINDOW,NULL,NULL,&stInfo,&processInfo);
if(ret==TRUE){
CloseHandle(processInfo.hProcess);
CloseHandle(processInfo.hThread);
return TRUE;
}else{
//DWORD error = GetLastError();
return FALSE;
}
return FALSE;
}
//获取注册命令,加/s开关可以免除确认步骤。
//注册: RegAsm.exe /s Test.dll
//反注册:RegAsm.exe /s /u Test.dll
void GetCmdLine(LPTSTR cmd, BOOL install){
TCHAR regAsmPath[MAX_PATH];
TCHAR regDllPath[MAX_PATH];
TCHAR temp[10];
regAsmPath[0] = '\0';
regDllPath[0] = '\0';
temp[0] = '\0';
GetRegAsmPath(regAsmPath); //获取RegAsm.exe程序绝对路径
GetRegDllPath(regDllPath); //获取需要注册的.NET COM组件绝对路径
if(install){
lstrcpy(temp, _T(" /s "));
}else{
lstrcpy(temp, _T(" /s /u "));
}
cmd[0] = '\0';
lstrcat(cmd, regAsmPath);
lstrcat(cmd, temp);
lstrcat(cmd, regDllPath);
}
//获取需要注册 .Net Com 组件路径,此处写死为Test.dll,与代理dll在同一个目录//后期可以改成读取ini配置文件
void GetRegDllPath(LPTSTR path){
int count = 0;
for(int i=0; i < MAX_PATH; i++){
if(g_FilePath[i] == _T('\\')){
count = i + 2;
}
}
TCHAR temp[MAX_PATH];
lstrcpyn(temp, g_FilePath, count); //代理DLL所在目录
lstrcat (path, _T("\""));
lstrcat (path, temp);
lstrcat (path, _T("Test.dll\""));
}
//获取 .NET COM 注册程序 RegAsm.exe 的路径
//方法:读取[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\InstallRoot]的值,
//然后拼接上"v2.0.50727\RegAsm.exe"
void GetRegAsmPath(LPTSTR path){
HKEY hKey;
DWORD dwBufLen = MAX_PATH;
LONG lRet;
lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SOFTWARE\\Microsoft\\.NETFramework"),0, KEY_READ, &hKey);
lRet = RegQueryValueEx(hKey, _T("InstallRoot"), NULL, NULL, (LPBYTE)path, &dwBufLen); RegCloseKey(hKey);
lstrcat(path, _T("v2.0.50727\\RegAsm.exe"));
}。
win7系统注册COM组件失败的解决办法和解决方案
win7系统注册COM组件失败的解决办法和解决方案win7系统注册COM组件失败的解决办法和解决方案win7系统注册COM组件失败的解决办法和解决方案COM组件实际上是系统内一些比较小的二进制可执行程序,它们能为应用程序,操作系统以及其他组件提供一定的服务。
所以注册COM组件是一个重要的事情,但这同时也是win7系统的一个硬伤,win7系统注册COM组件总是失败,让人烦心。
解决办法:运行:regsvr32xxx.ocx提示:模块"xxx.ocx"已加载,但对调用dllregisterserver的调用失败,错误代码0x80004005。
问题分析:由于win7权限导致解决方案:1.开始->在搜索框中输入‘cmd’->搜出的cmd.exe文件上点击右键,选择‘已管理员身份运行’:2.再次执行:regsvr32xxx.ocx命令,如指定完整路径需要用上引号""括起,"d:/组件/xxx.ocx"3.提示:注册成功!COM组件是微软系统内一个重要的组成部分,禁止了COM组件,可能会导致视频无法正常播放,音乐无法正常使用,多种情况都有可能出现,希望用户在注册COM组件失败的时候,这个能对大家有所帮助。
win7系统注册COM组件失败的解决办法和解决方案操作方法:1、点击“开始——搜索”,在搜索框中输入“cmd”命令后按回车2、在搜出的“cmd.exe“文件上点击右键,选择“以管理员身份运行”。
3、再次注册执行:regsvr32xxx.ocx命令,在指定的完整路径上需要用上引号""括起,比如"d:/组件/xxx.ocx"。
4、就会出现注册成功的提示。
dll注册方法(一)
dll注册方法(一)DLL注册方法什么是DLL注册?DLL(Dynamic Link Library)是一种在Windows操作系统中常见的文件类型,它包含了程序运行时所需的一组函数和资源。
DLL注册是指将DLL文件的信息注册到Windows注册表中,使得应用程序可以在运行时正确地加载和使用该DLL文件。
注册DLL的方法1.使用regsvr32命令–打开命令提示符窗口(按下Win + R,输入cmd,点击确定)–输入命令:regsvr32 <DLL文件路径>,例如:regsvr32 C:\Windows\System32\–按下回车键执行命令,等待注册成功的提示信息。
2.使用注册表编辑器–打开注册表编辑器(按下win + R,输入regedit,点击确定)–导航到以下注册表路径:HKEY_CLASSES_ROOT\CLSID–找到与DLL文件相对应的CLSID项,右键点击该项,选择“导入”–选择DLL文件所在路径,点击确定,完成注册。
3.使用安装程序–如果DLL文件是作为某个应用程序的一部分提供的,那么可以通过运行安装程序来注册DLL文件。
安装程序会自动将DLL文件的信息添加到注册表中。
4.使用COM组件服务管理器–打开组件服务管理器(按下Win + R,输入``,点击确定)–展开“组件服务”>“计算机”>“我的电脑”>“DCOM配置”–找到对应的DLL文件,右键点击选中的DLL文件,选择“属性”–在弹出的属性窗口中,点击“组件服务”选项卡,勾选“组件服务可以使用该组件”的复选框,点击确定。
注意事项•注册DLL文件需要管理员权限,所以在执行上述方法时,确保以管理员身份运行相应的程序或命令。
•注册失败或注册后出现问题时,可以尝试重新注册或者卸载并重新安装DLL文件。
•注册不当可能会引发应用程序的错误或不稳定性,所以在注册DLL文件前,最好备份相关文件和注册表。
以上是几种常见的DLL注册方法,在使用时需要根据具体情况选择合适的方法。
控件注册方法
控件注册方法控件是计算机程序中常用的一种元素,用于显示和交互。
在开发应用程序时,我们常常需要使用各种控件来实现各种功能。
但是,要使用一个控件,必须先将其注册到系统中,才能够在程序中使用。
本文将介绍几种常见的控件注册方法。
一、动态链接库(DLL)注册DLL是一种包含可重用代码和数据的文件,它可以被多个程序同时使用。
在使用DLL中的控件之前,我们需要先将DLL文件注册到系统中。
注册DLL文件的方法有两种:一种是使用Regsvr32命令,另一种是使用注册表编辑器。
1. 使用Regsvr32命令注册DLL文件的方法如下:a. 打开命令提示符窗口,定位到DLL文件所在的目录;b. 输入命令“Regsvr32 文件名.dll”,其中“文件名.dll”是要注册的DLL文件名;c. 按下回车键,等待注册完成的提示信息。
2. 使用注册表编辑器注册DLL文件的方法如下:a. 打开注册表编辑器,定位到HKEY_CLASSES_ROOT\CLSID;b. 在CLSID下创建一个新的子项,子项的名称是要注册的DLL 文件的GUID;c. 在新的子项下创建一个新的子项,子项的名称是控件的类名;d. 在控件的类名下创建一个新的子项,子项的名称是控件的版本号;e. 在控件的版本号下创建一个新的子项,子项的名称是InprocServer32;f. 在InprocServer32下创建一个新的字符串值,值的名称是“Default”,值的数据是DLL文件的完整路径。
二、ActiveX控件注册ActiveX控件是一种可以在Web浏览器中使用的控件,它可以用于实现各种动态交互的功能。
要使用ActiveX控件,我们需要先将其注册到系统中。
注册ActiveX控件的方法有两种:一种是使用Regsvr32命令,另一种是使用注册表编辑器。
1. 使用Regsvr32命令注册ActiveX控件的方法与注册DLL文件类似。
2. 使用注册表编辑器注册ActiveX控件的方法如下:a. 打开注册表编辑器,定位到HKEY_CLASSES_ROOT\CLSID;b. 在CLSID下创建一个新的子项,子项的名称是控件的GUID;c. 在新的子项下创建一个新的子项,子项的名称是控件的类名;d. 在控件的类名下创建一个新的子项,子项的名称是控件的版本号;e. 在控件的版本号下创建一个新的子项,子项的名称是InprocServer32;f. 在InprocServer32下创建一个新的字符串值,值的名称是“Default”,值的数据是控件的完整路径。
regsvr32命令详解
在“开始→运行”中键入“regsvr32 /u scrrun.dll”就可以禁用FSO对象;如果需要使用FSO对象,键入“regsvr32 scrrun.dll”命令即可。
4.卸载Win XP自带的“鸡肋”功能
7.屏蔽视频预览和刻录功能
每当用资源管理器选中一个视频文件时,XP会在左侧面板预览显示,不过这对于较大的视频文件时,往往要读上半天。用户在大多数情况下并不需要预览,禁止的方法也非常简单,在运行输入框中输入“regsvr32
/u shmedia.dll”即可撤消视频预览。
8.屏蔽Windows图片和传真查看器
在“开始→运行”中键入“regsvr32
wupdinfo.dll”,点击“确定”按钮,这样在系统中就重新注册了“WindowsUpdate”组件,重新启动后问题已经解决。
3.防范网络脚本病毒有新招
网络脚本病毒嵌在网页中,上网时在不知不觉中机器就会感染上这种病毒。笔者认为单纯使用杀毒软件并不能有效地防范这些脚本病毒,必须从病毒传播的机理入手。网络脚本病毒的复制、传播都离不开FSO对象(FileSystem
thumbvw.dll”。
5.让Windows Media Player支持RM格式
很多朋友喜欢用Windows Media
Player(以下简称WMP)播放器,但是它不支持RM格式,难道非得安装其他播放软件吗?笔者有办法。
以Win
XP为例,首先下载一个RM格式插件,解压缩后得到两个文件夹:Release(用于Windows9x)和Release
XP的搜索界面空白无物,昔日的搜索助手已“不见踪影”,右窗口仍然有文件列表框,使用其它系统功能正常。何故?
regsvr32命令小集注册OCX控件,注册控件
Regsvr32进程文件:regsvr32 or regsvr32.exe进程名称:Microsoft DLL Registration Service英文描述:regsvr32.exe is a processes belonging to the Windows OS and is used to register dynamic-link libraries and ActiveX controls in the registry.中文描述:regsvr32.exe用于注册和取消注册Windows操作系统的DLL(动态链接库)文件和ActiveX控件。
这个命令行工具将dll 文件注册为注册表中的命令组成。
语法regsvr32 [/u] [/s] [/n] [/i[:cmdline]] dllname 其中dllname为activex控件文件名,建议在安装前拷贝到system文件夹下。
参数/u 反注册控件/s 指定regsvr32 安静运行,且不显示任何消息框。
/n 指定不调用DllRegisterServer。
此选项必须与/i 共同使用。
/i:cmdline 调用DllInstall 将它传递到可选的[cmdline]。
在与/u 共同使用时,它调用dll 卸载。
dllname 指定要注册的dll 文件名。
/? 在命令提示符显示帮助。
例:要为“Active Directory Schema”注册 .dll,请在MS-DOS 提示符处键入以下命令:c:\regsvr32 schmmgmt.dllRegsvr32是系统文件很多朋友都用过Windows系统下提供的regsvr32.exe这个命令。
不要瞧不起这个小命令。
有时候它可能帮你解决大问题。
系统故障解决小方法:系统及系统自带的软件(如:ie,wmplayer等)出错,大部分由于动态链接库(DLL) 文件或ActiveX 控件(OCX) 文件损坏,会导致各种系统故障,甚至重装IE,甚至系统,问题依旧.这时您可以使用Regsvr32 工具修复.使用方法:开始→运行,输入regsvr32 *.dll 或regsvr32 *.ocx一、轻松修复IE浏览器regsvr32 Shdocvw.dllregsvr32 Oleaut32.dllregsvr32 Actxprxy.dllregsvr32 Mshtml.dllregsvr32 Urlmon.dllregsvr32 jscript.dll同时运行以上命令可以解决以下IE问题:IE不能打开新的窗口,用鼠标点击超链接也没有任何反应的问题;网页显示不完整,JAVA效果不出现,网页不自动跳转,打开某些网站时总提示…无法显示该页‟;状态栏显示…网页上有错误‟的提示。
本机注册COM组件的函数Regsvr
本机注册COM组件的函数Regsvr
夏雨
【期刊名称】《电脑编程技巧与维护》
【年(卷),期】2002(000)004
【摘要】@@ 作为程序员的你有没有碰到过这种情况--需要手工注册一个COM 组件?你也许会说这个好办,用Windows自带的regsvr32.exe就可以了.但如果你要在自己的程序里注册本机的组件呢?比如,你在老板的指挥下,终于完成了一个项目,其中包括一个COM组件.
【总页数】2页(P42-43)
【作者】夏雨
【作者单位】无
【正文语种】中文
【中图分类】TP3
【相关文献】
1.ExceI函数在高校学籍电子注册工作中的应用 [J], 姜一波
2.用API HOOK揭开注册编辑表的的秘密通过拦截底层服务函数揭开注册编辑表的面纱 [J], 冉林仓
3.利用WindowsAPI函数自由地操作注册表 [J], 毛战军
4.基于COM组件技术的VISA-COM函数库的研究与设计 [J], 王学伟;李臣全
5.我国注册会计师产业的生产函数和规模效应研究 [J], 肖明;马冬鸣;卢洁
因版权原因,仅展示原文概要,查看原文内容请购买。
regsvr32 注册ocx 原理
regsvr32 注册ocx 原理regsvr32 是一个用于注册和注销动态链接库 (DLL) 或 ActiveX 控件 (OCX) 的命令行工具。
在 Windows 操作系统中,动态链接库和ActiveX 控件扮演着非常重要的角色,它们为应用程序提供了丰富的功能和扩展性。
而使用 regsvr32 来注册和注销这些组件,是确保它们能够正确加载和使用的关键步骤。
regsvr32 的原理非常简单,它会调用组件内部的注册函数,将组件的信息写入系统注册表中。
当应用程序需要使用这些组件时,系统会根据注册表中的信息来加载和初始化它们。
下面将详细介绍regsvr32 的原理和具体步骤。
我们需要了解动态链接库(DLL)和 ActiveX 控件(OCX)的概念。
DLL 是一种包含可由多个程序同时使用的代码和数据的文件。
它们可以包含函数、变量和资源,可以被多个应用程序共享,避免了代码的重复编写和内存的浪费。
而 OCX 是一种特殊的 DLL,它主要用于开发 Windows 桌面应用程序中的用户界面控件,例如按钮、文本框等。
当我们下载或获取到一个 DLL 或 OCX 文件时,它们并不能直接被应用程序使用,需要先进行注册。
注册的目的是告诉系统该组件的位置和相关信息,以便系统能够正确地加载和使用它。
而 regsvr32 命令则提供了一种简单的方式来完成这个过程。
在开始注册之前,我们需要打开命令提示符窗口(CMD),然后使用管理员权限运行 regsvr32 命令。
接下来,我们可以使用 regsvr32 命令加上组件文件的路径作为参数,执行注册操作。
例如,我们可以输入命令 regsvr32 C:\Path\To\Example.dll 来注册一个名为Example.dll 的 DLL 文件。
当 regsvr32 命令被执行时,它会尝试加载组件,并在组件内部查找一个特定的函数名为 DllRegisterServer。
这个函数是由组件开发人员提供的,用于在注册过程中执行一些特定的操作,例如向系统注册表中写入相关信息。
COM组件三个最基本的接口类和使用COM库的三种方法
COM组件三个最基本的接口类//VC6中使用COM库的三种方法COM组件有三个最基本的接口类,分别是IUnknown、IClassFactory、IDispatch。
COM规范规定任何组件、任何接口都必须从IUnknown继承,IUnknown包含三个函数,分别是QueryInterface、AddRef、Release。
这三个函数是无比重要的,而且它们的排列顺序也是不可改变的。
QueryInterface用于查询组件实现的其它接口,说白了也就是看看这个组件的父类中还有哪些接口类,AddRef用于增加引用计数,Release用于减少引用计数。
引用计数也是COM中的一个非常重要的概念。
大体上简单的说来可以这么理解,COM组件是个DLL,当客户程序要用它时就要把它装到内存里。
另一方面,一个组件也不是只给你一个人用的,可能会有很多个程序同时都要用到它。
但实际上DLL只装载了一次,即内存中只有一个COM组件,那COM组件由谁来释放?由客户程序吗?不可能,因为如果你释放了组件,那别人怎么用,所以只能由COM组件自己来负责。
所以出现了引用计数的概念,COM维持一个计数,记录当前有多少人在用它,每多一次调用计数就加一,少一个客户用它就减一,当最后一个客户释放它的时侯,COM知道已经没有人用它了,它的使用已经结束了,那它就把它自己给释放了。
引用计数是COM编程里非常容易出错的一个地方,但所幸VC的各种各样的类库里已经基本上把AddRef的调用给隐含了,在我的印象里,我编程的时侯还从来没有调用过AddRef,我们只需在适当的时侯调用Release。
至少有两个时侯要记住调用Release,第一个是调用了QueryInterface以后,第二个是调用了任何得到一个接口的指针的函数以后,记住多查MSDN 以确定某个函数内部是否调用了AddRef,如果是的话那调用Release的责任就要归你了。
IUnknown的这三个函数的实现非常规范但也非常烦琐,容易出错,所幸的事我们可能永远也不需要自己来实现它们。
安装说明_服务器端组件安装说明
服务器端组件安装说明一、前言金格目前的中间件产品,基本上都是基于前后台通信的工作原理。
所以服务器端都要部署一个组件(一般名称为iMsgServer2000.dll或.class),用来解析客户端发来的信息包以及封装发会给客户端的信息包。
服务器端的组件根据开发语言的不同分为COM类和JA V A类两大部分,不同的开发语言和环境注册服务器端组件的方式也不相同。
下面,我们介绍基于各种B/S开发语言和环境下的服务器端组件安装方法。
(C/S结构的开发方式用不到服务器端组件)二、COM组件安装2.1 ASPASP开发语言用到的COM组件,有两种安装方式:一是直接用Regsvr32命令方式注册;另一种是在组件管理中进行安装。
2.1.1Regsvr32命令方式注册:在“开始”→“运行”中用“Regsvr32+空格+控件地址”进行注册:(图2-1 打开“开始”菜单中的“运行”)(图2-2 输入注册代码)(图2-3 运行后的成功提示)注册成功后就部署完成了。
注意注册后控件的文件是不能移动的,一定要找一个不容易被删除到的目录来存放。
但是这种注册方式有一个缺点,就是权限不好控制,很有可能注册后在程序中依然引用不到而产生错误,这个时候只能用第二种方式,也就是组件服务的方式安装。
2.1.2组件服务安装首先打开控制面板,找到“管理工具”:(图2-4 控制面板)打开“管理工具”选择里面的“组件服务”:(图2-5 管理工具)(图2-6 组件服务)分别点击进入“组件服务”→“计算机”→“我的电脑”→“COM+应用程序”:(图2-7 COM+应用程序)点击右键,选择“新建”→“应用程序”:(图2-8 新建应用程序)(图2-9 新建应用程序)在向导中选择“创建空应用程序”按钮:(图2-10 创建空应用程序)给新建的应用程序起一个名称,这里我们起“GoldGrid”:(图2-11 创建空应用程序)(图2-12 用户回头选这里点“下一步”)(图2-13 完成应用程序的安装)应用程序安装好以后,我们需要把组件放入到刚才新建的应用程序中。
64位作系统中注册32位COM组件的方法
64位*作系统中注册32位COM组件的方法想要在64位的*作系统中注册32位组件,应该如何*作呢?下文是为大家精选的64位*作系统中注册32位组件的方法,欢迎大家阅读。
在64位*作系统中注册组件时,使用regsvr32命令注册成功,但在vbs文件中创建组件时失败,提示未能找到相关的组件,err.munber=429。
根据support.microsoft/kb/249873的提示:the64-bitversionis%systemroot%system32egsvr32.exe.the32-bitversionis%systemroot%syswow64egsvr32.exe. 看着有64的目录原来是32位程序所以在64位系统中注册32位组件时,应该使用syswow64目录下的regsvr32.exe命令。
并且创建组件的程序应该以管理员权限启动,否则没有足够的权限,创建仍然失败。
但当在asp文件中创建组件时仍然会失败,即使ie以管理员权限启动,err.munber=429。
下面是demon的补充:以旧版的dynamicwrapperx为例,这是32位的组件,如果直接用regsvr32命令注册,会*出错误:模块“dynwrapx.dll”可能与您正在运行的windows版本不兼容。
检查该模块是否与regsvr32.exe的x86(32位)或x64(64位)版本兼容。
跟wscript.exe一样,regsvr32.exe也有32位和64位两个版本,用64位版本的regsvr32.exe无法注册32位的组件。
微软也真是,难道就不能换个名字?64位的叫做regsvr64不就行了。
正确的做法是将dynwrapx.dll复制到c:windowssyswow64并运行c:windowssyswow64egsvr32.exe注册,这样就会*出:dllregisterserver在dynwrapx.dll已成功。
