C++ 导出C++;不带外部的dll中的函数;";

C++ 导出C++;不带外部的dll中的函数;";,c++,dllexport,C++,Dllexport,目标: 应用程序应该能够使用LoadLibrary动态加载dll,并使用GetProcAddress调用其导出的函数 我的dll类有一个返回类类型的唯一\u ptr的函数 我想导出此函数,以便在成功加载dll后,应用程序可以使用getProcAddress调用此函数 使用外部“C”将不允许在函数签名中使用C++类(UnQuyJPTR类模板)。 我知道,如果不使用extern“C”,它将以一个损坏的名称导出函数(通过u declspec(dllexport)) 在调用getProcAddress期

目标: 应用程序应该能够使用LoadLibrary动态加载dll,并使用GetProcAddress调用其导出的函数

我的dll类有一个返回类类型的唯一\u ptr的函数

我想导出此函数,以便在成功加载dll后,应用程序可以使用getProcAddress调用此函数

使用外部“C”将不允许在函数签名中使用C++类(UnQuyJPTR类模板)。 我知道,如果不使用extern“C”,它将以一个损坏的名称导出函数(通过u declspec(dllexport))

在调用getProcAddress期间,客户机将不知道损坏的名称,因此客户机将如何调用此函数


有没有办法导出这样的函数?

是的,老式的方法。按名称查找函数是“现代”方式(尽管它早于Windows95)。老办法是查一查


您需要提供一个带有
EXPORTS
的名称来对您的函数进行编号。

当然,如果您在使用
GetProcAddress
时愿意使用损坏/修饰的名称,那么“有没有办法导出这样的函数?”。你可以从C++程序中使用它,在那里你可以实际创建C++类的对象。@ USE2100866:你的客户端应用程序已经被迫使用同一个编译器,<代码> STD::UnQuyJPPT是依赖于实现的。@ USE2100866“这将迫使我的客户端应用程序使用与我的DLL相同的编译器来构建”-抱歉,但无论您做什么,这都是一个要求,因为您的函数返回的类类型取决于特定的实现。这在编译器之间是不可移植的。“而且,是的,客户端是C++应用程序,因此在导出C++类作为返回类型时没有问题”——是的,确实存在。DLL和客户端必须使用相同的编译器,甚至相同的标准库进行编译,以确保使用相同的类实现以及内存管理器…@user2100866。。。DLL和客户端之间的类的二进制布局及其运行时行为必须兼容。如果它们不共享同一个内存管理器,则不能在DLL中
新建
内存,也不能在客户端应用程序中
删除
内存。因为DLL和客户端都编译在任何C++编译器中,所以不能保证。即使使用同一个编译器也不能保证.Tip:DLL中也可以提供一对老式的C函数,而C++的头可以通过客户选择C++编译器将其封装在代码编译器中。code>std::unique_ptr支持自定义删除程序,这将是第二个C函数。我尝试使用序号,结果成功了。我不明白的一件事是,为什么我们需要一个def文件,只是为了让客户端知道它想要调用的函数的编号?如果我确定只有一个导出函数,那么我可以去掉def文件并使用序号1(作为硬编码值)吗。我尝试了这个方法,它成功了,所以我只是想确定一下。考虑到这是一项已有25年历史的技术,我不会期待突然的变化:D如果它现在起作用,它很可能在未来25年内起作用。