RegSvr和RegServer有什么区别?

时间:2010-06-16 08:47:36

标签: com registration

/RegServer/RegSvr是相同还是不同,如果不同为什么/如何?

例如我见过(32位操作系统的例子)这种风格:

RegSvr32 COM.exe

RegSvr32 COM.dll

或者作为替代方案(在64位操作系统上):

COM.exe /RegServer
COM.exe /RegSvr

这些不同的方法是否做同样的事情?

2 个答案:

答案 0 :(得分:8)

COM服务器在32位64位操作系统中的注册方式相同。问题与自注册有关,这是注册COM服务器最直接的方式 - 要求服务器分别更新HKLM / HKCR注册表。

由于无法直接运行DLL,因此使用帮助程序regsvr32应用程序。简而言之,它会查看DLL是32位还是64位并使用相应版本的应用程序。然后它加载DLL并传递控件进行注册。

EXE COM服务器可以直接运行,所以这就是你传递它们/ regserver或/ unregserver参数。

这些方法适用于32位和64位COM服务器,适用于32位和64位操作系统。

进一步阅读 - Self-Registration

  

如果服务器打包在DLL模块中,则DLL必须导出函数DllRegisterServer和DllUnregisterServer。任何希望指示服务器注册自身的应用程序(即其所有CLSID和类型库ID)都可以通过GetProcAddress函数获取指向DllRegisterServer的指针。在DllRegisterServer中,DLL创建所有必需的注册表项,为所有InprocServer32或InprocHandler32项存储DLL的正确路径。

     

当应用程序希望从系统中删除组件时,应通过调用DllUnregisterServer取消注册该组件。在此调用中,服务器会准确删除先前在DllRegisterServer中创建的条目。服务器不应盲目删除其类的所有条目,因为其他软件可能存储了其他条目,例如TreatAs密钥。

     

如果服务器打包在EXE模块中,则希望注册服务器的应用程序使用命令行参数/ RegServer或-RegServer(不区分大小写)启动EXE服务器。如果应用程序希望取消注册服务器,它将使用命令行参数/ UnregServer或-UnregServer启动EXE。自注册EXE检测这些命令行参数,并分别调用与DllRegisterServe和DllUnregisterServer中的DLL相同的操作,在LocalServer32下注册其模块路径,而不是InprocServer32或InprocHandler32。

答案 1 :(得分:-1)

32位和64位注册表存在显着差异。

Windows 64-bit registry v.s. 32-bit registry

更具体地说,您无法使用regsvr32注册64位DLL。

http://social.msdn.microsoft.com/forums/en-US/vcgeneral/thread/f8898224-76ca-4047-90d3-20c63f71a2d8/