1
4
通过使用 dumpbin /符号myclass.obj 以我为例
这个
将此符号放入.def文件会导致链接器在导出符号中创建A::A(int)符号。 但是! 正如@paercebal在他的评论中所说的那样:手工输入修饰的(损坏的)名称很容易出错,而且很遗憾,不能保证在编译器版本之间是可移植的。 |
2
8
如果我记错了,你可以用
微软对此有更多信息 here . |
3
4
我找到了成为一家抽象工厂的最佳途径。 首先定义一个纯粹的虚拟基类。这是一个没有实现的类,纯虚拟接口类。 您可以导出这个虚拟基“抽象接口”类,但没有真正的理由这样做。当调用者使用它时,他们将通过一个指针(pimpl或指向实现的指针)来使用它,因此调用者所知道的只是一个简单的内存地址。一个def文件,虽然需要做更多的工作来跟上,但它提供的好处远远超出了declspec(dllexport)所能达到的。你会问什么好处?我们会解决的,你等着。 让真正的类公开地从虚拟基继承。现在创建一个工厂方法来构造对象和 释放 “ish可调用析构函数执行清理。把这些方法命名为 构造类 “和” 释放类 “。请更换” 类名 “-” 如果需要任何参数(简单的旧数据:整数、字符等),那么这些工厂/发布方法应该只采用pod类型。返回类型应该是虚拟抽象接口基类——或者更确切地说,是指向它的指针。 imyclass*创建对象类型imyclass(); 也许现在很明显我们为什么需要虚拟基类?由于虚拟接口类没有实现,它本质上是所有POD类型(排序),因此类的“数据类型”可以被大多数调用方理解,如VisualBasic、C或非常不同的C++编译器。 如果你有足够的想象力,你就可以摆脱对 手动释放 “方法(抱歉,必须这么做)。怎样?通过智能指针和PIMPL类型的体系结构来管理类中您自己的资源,这样当对象死亡时,它将自己清理掉。这样做意味着你的班级,用我们圣人和救世主不朽的话来说 Scott Meyers, " easy to use correctly and hard to use incorrectly " 让呼叫者忽略清理的必要性。让我们当中那些从未忘记打电话的人 关闭 “铸造第一块石头。 也许这个建筑听起来很熟悉?它应该,基本上是一个微机械版的COM。嗯,至少是接口、工厂构造和发布的概念。 最后,您已经导出了类的接口,made(和exported) 创造 和 破坏 方法,现在调用方可以调用 请解释类 工厂函数使您的dll在其接口的伪装下返回一个完全构造、完全实现和完全烘焙的对象。它们可以调用类中的所有公共方法(至少是抽象虚拟接口中的公共方法),并完成所有有趣的工作。 当它们完成工厂函数返回的对象时,它们可以调用 释放类 函数要求您的dll清理对象的资源,或者您可以通过使类自己清理来帮助它们,使 释放类 “方法多余无用。 如果有人对使用def文件和接口的具体收益和折衷感兴趣(除了我的瞎子说的那样),请竖起管道,我们可以更深入地挖掘。 你不喜欢这些东西吗? |
4
0
解决方案如下:
希望有人能从中受益。 |
Mr.H. · 如何在外部文件中定义函数? 6 年前 |
Jon Goe · 实现SeekArc时生成同步失败 6 年前 |
Farzad J · VSTS中PowerShell脚本的打包管理器 6 年前 |
vladfau · Maven没有在多模型项目中构建兄弟依赖关系 6 年前 |