我真的不喜欢花费大量的精力去精心开发和设计一个 C++ 库,而最终的结果却是,唯一能阻止那些链接 DLL 的人访问他们不应该访问的数据的东西,甚至是意外访问的,是.h
DLL 附带的文件中提供的手写访问修饰符。
我可以考虑哪些解决方案来在 DLL 编译后重新创建访问修饰符的概念,.h
而这些概念不能像在 DLL 的分发版本中打包的文件中重写访问修饰符那样简单地进行更改?
我考虑过但不完全理解的一个解决方案是__declspec(dllexport)
仅指定public
API 方法、class
es 等,这样重写.h
文件中的某些项目以使其变为public
应该的状态private
并不重要,因为 LIB 文件不会填充该项目,因此链接 DLL 的人无法使用它。就像我说的,我不完全理解这个解决方案,因此不能自信地说这是否会回答我的问题(似乎只是一个.def
文件的更简单版本,该文件是昨天向我解释过的文件)但我只是想提高我对它的认识,如果你认为它会起作用,请在我投入大量精力用它来扩大现有库之前告诉我,结果却发现它根本不起作用(我想我应该设置一个 MRE,但现在我只是在胡言乱语)。
正如您和其他人在评论中提到的,PIMPL 模式背后的主要动机之一正是解决您描述的问题。
简化的实现可能如下所示:
本质上,只有类的外部接口
Foo
在其标题中可见,即消费者实际使用类所需的函数和定义。所有实现细节(包括私有函数和成员变量)都隐藏在第二层,即类之下FooImpl
。请注意,虽然这会为您的库的用户隐藏实现细节,但它当然不是任何意义上的针对反编译或其他此类黑客工具的安全措施。