目标:应用程序应该能够使用LoadLibrary动态加载dll,并使用GetProcAddress调用其导出函数。
我的dll类有一个函数返回类类型的unique_ptr。
我想导出这个函数,以便在dll加载成功后,应用程序可以使用getProcAddress调用这个函数。
使用extern“C”将不允许在函数签名中使用C++类(在本例中为unique_ptr类模板)。
我知道,如果不使用extern“C”,它将导出函数(通过__declspec(dllexport)),并带有一个损坏的名称。
在调用getProcAddress期间,客户端将不知道损坏的名称,那么客户端将如何调用此函数呢?
有没有办法导出这样的函数?
3条答案
按热度按时间wxclj1h51#
是的,老办法。按名称查找函数是“现代”的方式(尽管它早于Windows 95)。老方法是查找by ordinal。
您需要提供一个带有
EXPORTS
的module definition file来为函数编号。brc7rcf02#
如果你想从DLL中导出一个C函数而不使用
extern "C"
,你仍然可以通过使用一种叫做名称修饰或名称修改的技术来实现。名称修饰以基于函数签名和其他因素的特定方式修改函数名称。要允许客户端使用
GetProcAddress
调用函数而不知道损坏的名称,可以使用一种名为名称导出转发的技术。使用这种方法,您可以创建一个单独的C样式 Package 器函数,该函数具有众所周知的名称,并在内部调用实际的C函数。下面是一个示例,说明如何从DLL导出C++函数,并提供一个C风格的 Package 器供客户端用途:
使用这种方法,客户端可以使用已知名称为
entryPoint_wrapper
的GetProcAddress
调用entryPoint_wrapper
函数。 Package 器函数将在内部调用实际的entryPoint
函数。请注意,您需要使用
__declspec(dllexport)
从DLL导出C++函数(entryPoint
)和C风格的 Package 函数(entryPoint_wrapper
)。t98cgbkg3#
使用extern“C”将不允许在函数签名中使用C++类(在本例中为unique_ptr类模板)
这根本不是事实。使用
extern "C"
导出您喜欢的任何签名。课程推荐信什么的只是works。