【发布时间】:2013-08-31 09:58:30
【问题描述】:
在构建 COM DLL 时,为什么要将 DllGetClassObject、DllCanUnloadNow、DllRegisterServer、DllUnregisterServer 等导出在 EXPORTS 部分标记为 PRIVATE关联.DEF 文件?
【问题讨论】:
在构建 COM DLL 时,为什么要将 DllGetClassObject、DllCanUnloadNow、DllRegisterServer、DllUnregisterServer 等导出在 EXPORTS 部分标记为 PRIVATE关联.DEF 文件?
【问题讨论】:
当您构建 DLL 时,链接器会自动为 DLL 创建一个导入库。它包含所有导出函数的列表。您在另一个使用 DLL 的项目中使用该导入库。
COM 服务器的特殊之处在于,始终可以使用 GetProcAddress() 找到这 4 个导出函数,并且您永远不会隐式依赖于 COM dll。您总是使用 CoCreateInstance() 创建 COM 对象,COM 管道负责定位 DLL 并使用 GetProcAddress() 来查找 DllGetClassObject() 函数。 Regsvr32.exe 发现的 DllUn/RegisterServer 也是如此。和 DllCanUnloadNow,由 COM 管道找到。因此,您不需要导入库。
使用 PRIVATE 可确保函数不会导出到导入库。由于它们都是私有的,因此您根本没有导入库。如果您忽略它不会出错,您只会从链接器中获得一个永远不会使用的额外文件。
【讨论】: