从同一个DLL导出带有impl的DLL API和工厂
Exporting DLL API and Factory with impls from same DLL
好吧,我开始明白为什么它被称为Dll地狱了
这是我得到的代码
// API.h file
#ifdef EXPORTS
#define API __declspec(dllexport)
#else
#define API __declspec(dllimport)
#endif
struct API IClass {
virtual void foo() = 0;
}
extern "C" API IClass* CreateClass(const char* type);
// Impl1.h
class Impl1: public IClass
{
//...
}
// API.cpp file
#include "Impl1.h"
#include "Impl2.h"
#include "ImplX.h"
extern "C" API IClass* CreateClass(const char* type)
{
if (type == "type1")
return new Impl1();
// ...
return 0;
}
我收到链接器警告
warning LNK4217: locally defined symbol ??0IClass@DG@@QAE@XZ (public: __thiscall IClass::IClass(void)) imported in function...
我理解这是因为我已经在所有Impl中导入了这些符号,但另一方面,它们现在是本地的,因为我正在API的工厂中编译它们。
1) 我应该忽略这个警告吗?还是有不同的方法来处理这个问题
2) 我应该保留默认的__thiscall还是改为__stdcall?
编辑
不导出IClass
帮助我删除了警告
另一个问题出现了,我不确定同样的方法能否解决这个问题
假设IClass
也有一个方法virtual bar(IData* data) = 0
如果我希望客户端能够创建IData
的实例,我需要将其导出到dll中,返回到impl中的原始问题。除非我也为它们创建创建函数,但对于简单的数据结构来说,这似乎有点太大的开销。
因此,基本上的问题是,如何在不将IData
导出到DLL中的情况下向客户端公开CCD_5?
如果你正在开发COM这样的东西:没有必要通过导出接口
__declspec(dllexport|import).
调用约定是一个相当古老的概念,在x64上具有任何相关性(Windows和UNIX都只有一个64位调用约定!)您可以在32位上选择__cdecl
或__stdcall
。第一条规则应该是:保持一致!这两种约定本身都很好
COM和WinAPI使用__stdcall
,而标准库大多使用__cdecl
。就性能而言,这是完全无关的(stackoverflow上有一篇关于调用约定的速度差异的帖子)。
警告可能是由于您正在导出类而不是构造函数,因此我建议不要导出类。。。
相关文章:
- N-API include an .so or dll
- sf::Windows上的音乐:api-ms-win-crt-locale-l1-1-0.dll:无法打开共享对象文件
- 如何将第三方 dll、标头和库文件与 Node N-API 一起使用
- C++ API-MS-WIN-SERVICE-PRIVATE-L1-1-1.DLL依赖项问题
- 如果在 DLL 和调用应用程序中使用 GPGPU API,会发生什么情况
- Windows API "CreateWindowEx" 在 Python (3.6.8) 64 位使用的 DLL 中工作吗?
- 如何在 go 中调用带有 .lib 和.dll文件的预构建 API
- 可视化 使用 C++ API 注册 COM DLL 的所有接口
- 从非托管 DLL 调用 UWP api
- C++ API DLL Project
- 传送仅公开 C API 的 C++ dll
- 带有API的WinRT应用程序,该应用程序使用共享的MFC dll
- 如何在 C++ 中的 DLL API 中使用徽标获取日志
- 从同一个DLL导出带有impl的DLL API和工厂
- 在DLL的基地址处Win API ReadProcessMemory返回意外数据
- FindResource Api为DLL中的Text文件提供错误1813
- 如何将MQL4代码转换为C++/Delphi DLL(Forex Tester API)
- Api-ms-win-core-crt-l1-1-0.dll-Microsoft Visual C++2015 Redi
- 记录dll api,然后模仿它
- 如何调用DLL api