要注册COM服务器,我们运行类似于提升模式的东西:
regsvr32.exe com.dll
要执行每用户注册,请在用户帐户中执行:
regsvr32.exe /n /i:user com.dll
regsvr32.exe支持以下参数:
/u - Unregister server
/i - Call DllInstall passing it an optional [cmdline]; when used with /u calls dll uninstall
/n - do not call DllRegisterServer; this option must be used with /i
/s – Silent; display no message boxes (added with Windows XP and Windows Vista)
在Delphi中创建COM服务器时,导出了这些方法:
exports
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer,
DllInstall;
我注意到这些情况会发生:
我对参数/ n和/ i以及DllUnregisterServer和DllInstall感到困惑。有什么不同吗?
另外,为什么“/ u / n / i:user”会调用Dllinstall?我注意到“HKEY_CURRENT_USER \ Software \ Classes”中相应的注册表项已被删除。
答案 0 :(得分:6)
The documentation for DllInstall()解释了不同之处:
DllInstall仅用于应用程序安装和设置。它 不应该由应用程序调用。它的目的是相似的 DllRegisterServer或DllUnregisterServer。与这些功能不同, DllInstall接受一个输入字符串,可用于指定a 各种不同的行动。这允许安装DLL 不止一种方式,基于任何适当的标准。
要在regsvr32中使用DllInstall,请添加" / i"标志后面跟冒号 (:)和一个字符串。该字符串将作为传递给DllInstall pszCmdLine参数。如果省略冒号和字符串,请输入pszCmdLine 将被设置为NULL。以下示例将用于安装 DLL。
regsvr32 / i:" Install_1" dllname.dll
使用调用DllInstall bInstall设置为TRUE,pszCmdLine设置为" Install_1"。卸载一个 DLL,使用以下内容:
regsvr32 / u / i:" Install_1" dllname.dll
使用 以上两个示例,DllRegisterServer或DllUnregisterServer 也将被称为。要仅调用DllInstall,请添加" / n"标志。
regsvr32 / n / i:" Install_1" dllname.dll
答案 1 :(得分:2)
我的建议是完全跳过使用regsvr32.exe - 这很容易让你自己完成这项工作:
int register(char const *DllName) {
HMODULE library = LoadLibrary(DllName);
if (NULL == library) {
// unable to load DLL
// use GetLastError() to find out why.
return -1; // or a value based on GetLastError()
}
STDAPI (*DllRegisterServer)(void);
DllRegisterServer = GetProcAddress(library, "DllRegisterServer");
if (NULL == DllRegisterServer) {
// DLL probably isn't a control -- it doesn't contain a
// DllRegisterServer function. At this point, you might
// want to look for a DllInstall function instead. This is
// what RegSvr32 calls when invoked with '/i'
return -2;
}
int error;
if (NOERROR == (error=DllRegisterServer())) {
// It thinks it registered successfully.
return 0;
}
else
return error;
}
此特定代码调用DllRegisterServer
,但根据您的意愿,将其参数化以调用DllInstall
,DllUninstall
等是微不足道的。这样可以删除有关在等等时调用的内容的任何问题。