What is difference between RegSvr and RegServer?

2020-03-10 15:31发布

Are /RegServer and /RegSvr the same or different, if different why/how?

For example I have seen (example from a 32-bit OS) this style:

RegSvr32 COM.exe

or

RegSvr32 COM.dll

Or as an alternative (which was on a 64-bit OS):

COM.exe /RegServer
COM.exe /RegSvr

Are these different approaches doing the same thing?

1条回答
三岁会撩人
2楼-- · 2020-03-10 15:56

COM servers are registered the same way in 32- bit 64-bit operating systems. The question is related to self-registration, the most straightforward way to register COM server - by asking the server to update HKLM/HKCR registry respectively.

As you cannot run a DLL directly, you use a helper regsvr32 application. To cut long story short it looks whether DLL is 32- or 64-bit and uses respective version of the application. Then it loads the DLL and passes control to do registration.

EXE COM servers can be run directly, so this is what you do passing them /regserver or /unregserver parameters.

The methods are valid for 32- and 64-bit COM servers, for 32- and 64-bit operating systems.

Further reading - Self-Registration:

If the server is packaged in a DLL module, the DLL must export the functions DllRegisterServer and DllUnregisterServer. Any application that wishes to instruct the server to register itself (that is, all its CLSIDs and type library IDs) can obtain a pointer to DllRegisterServer through the GetProcAddress function. Within DllRegisterServer, the DLL creates all its necessary registry entries, storing the correct path to the DLL for all InprocServer32 or InprocHandler32 entries.

When an application wishes to remove the component from the system, it should unregister that component by calling DllUnregisterServer. Within this call, the server removes exactly those entries it previously created in DllRegisterServer. The server should not blindly remove all entries for its classes because other software may have stored additional entries, such as a TreatAs key.

If the server is packaged in an EXE module, the application wishing to register the server launches the EXE server with the command-line argument /RegServer or -RegServer (case-insensitive). If the application wishes to unregister the server, it launches the EXE with the command-line argument /UnregServer or -UnregServer. The self-registering EXE detects these command-line arguments and invokes the same operations as a DLL would within DllRegisterServerand DllUnregisterServer, respectively, registering its module path under LocalServer32 instead of InprocServer32 or InprocHandler32.

查看更多
登录 后发表回答