从没有extern“C”的dll导出C++函数

zte4gxcn  于 2023-06-25  发布在  其他
关注(0)|答案(3)|浏览(197)

目标:应用程序应该能够使用LoadLibrary动态加载dll,并使用GetProcAddress调用其导出函数。
我的dll类有一个函数返回类类型的unique_ptr。
我想导出这个函数,以便在dll加载成功后,应用程序可以使用getProcAddress调用这个函数。
使用extern“C”将不允许在函数签名中使用C++类(在本例中为unique_ptr类模板)。
我知道,如果不使用extern“C”,它将导出函数(通过__declspec(dllexport)),并带有一个损坏的名称。
在调用getProcAddress期间,客户端将不知道损坏的名称,那么客户端将如何调用此函数呢?
有没有办法导出这样的函数?

wxclj1h5

wxclj1h51#

是的,老办法。按名称查找函数是“现代”的方式(尽管它早于Windows 95)。老方法是查找by ordinal
您需要提供一个带有EXPORTSmodule definition file来为函数编号。

brc7rcf0

brc7rcf02#

如果你想从DLL中导出一个C函数而不使用extern "C",你仍然可以通过使用一种叫做名称修饰或名称修改的技术来实现。名称修饰以基于函数签名和其他因素的特定方式修改函数名称。
要允许客户端使用GetProcAddress调用函数而不知道损坏的名称,可以使用一种名为名称导出转发的技术。使用这种方法,您可以创建一个单独的C样式 Package 器函数,该函数具有众所周知的名称,并在内部调用实际的C
函数。
下面是一个示例,说明如何从DLL导出C++函数,并提供一个C风格的 Package 器供客户端用途:

  1. // DLL header file
  2. #ifdef MYLIB_EXPORTS
  3. #define MYLIB_API __declspec(dllexport)
  4. #else
  5. #define MYLIB_API __declspec(dllimport)
  6. #endif
  7. // Forward declaration of C-style wrapper function
  8. extern "C" MYLIB_API void entryPoint_wrapper();
  9. // Actual C++ function definition
  10. MYLIB_API void entryPoint();
  11. // C-style wrapper function implementation
  12. void entryPoint_wrapper()
  13. {
  14. entryPoint();
  15. }

使用这种方法,客户端可以使用已知名称为entryPoint_wrapperGetProcAddress调用entryPoint_wrapper函数。 Package 器函数将在内部调用实际的entryPoint函数。
请注意,您需要使用__declspec(dllexport)从DLL导出C++函数(entryPoint)和C风格的 Package 函数(entryPoint_wrapper)。

展开查看全部
t98cgbkg

t98cgbkg3#

使用extern“C”将不允许在函数签名中使用C++类(在本例中为unique_ptr类模板)
这根本不是事实。使用extern "C"导出您喜欢的任何签名。课程推荐信什么的只是works

相关问题