c++ - 使用 DLL 作为 C++ 游戏 SDK 发布的安全性(dll 已修改,exe 永不修改)

标签 c++ dll sdk shared-libraries

我一直在努力想出最好的方法来分发我的部分游戏代码,但不是全部,以允许人们修改游戏而不是使用我的代码创建独立游戏。这就是许多游戏已经运行的情况,例如 Doom3 - 在 GPL 发布之前,SDK 只是为不可修改的 EXE 创建 DLL 的代码的一部分。

为此,我成功地将我的代码拆分为一个 EXE/SDK,但我担心的是 EXE 引用了 SDK 中的类。例如,如果我编译的 EXE 包含一个 Entity 类型的对象数组,在 SDK 中声明了 Entity,然后我将另一个成员变量添加到该类,编译 DLL,然后运行旧的 EXE新的 DLL,这是否意味着 EXE 具有关于实体大小的错误信息?

还是我想多了?

最佳答案

“如果你修改这个类,它不会与其他地方定义的类一起工作。”有一大堆问题。

对于这些问题也有很多解决方案。

通常使用(智能)指针和/或引用而不是类本身来形成接口(interface)可以避免代码的两个部分必须就类的大小达成一致。

因此,例如,而不是:

class EntityCollection
{
  private:
   vector <Entity> entities;
  public:
   void addEntity(Entity e) { entities.push_back(e); }
   void removeEntity(Entity e) { ... } 

};

我们将使用指针式存储(实际上应该使用智能指针,但为了简短起见,我没有这样做):

class EntityCollection
{
  private:
   vector <Entity*> entities;
  public:
   void addEntity(Entity* e) { entities.push_back(e); }
   void removeEntity(Entity* e) { ... } 

};

现在,无论实体有多大,或者它包含什么,它在 vector 中仍然是“指针大小”。

另一种变体是具有“pimpl”界面。您有一个主类定义,其中是一个指向实现类的(智能)指针,它提供了一组已知的虚函数。

像这样:

class Entity
{
   public:
     class EntityImpl 
     {
        virtual int func()  = 0;
        ...
     };
     Entity(EntityImpl* impl) pImpl(impl) {}
     ...
     int func() { return pImpl->func(); }
   private:
     EntityImpl* pImpl;
};

这些当然不是您唯一可能关心的问题,但应该会给您一些“这是您用来解决问题的东西”的想法。

关于c++ - 使用 DLL 作为 C++ 游戏 SDK 发布的安全性(dll 已修改,exe 永不修改),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17279647/

相关文章:

c++ - mac pretty-print gdb

c++ - 字节数组到 Variant

c++ - node-gyp 和 contextify - 找不到 v140 的构建工具(平台工具集 = 'v140')

c++ - atomic_int_fastN_t 和 atomic_int_leastN_t 类型之间有什么区别

android-studio - 无法从 android sdk 找到 zipalign.exe

java - Cassandra -f 找不到依赖库 java.lang.UnsatisfiedLinkError

java - 从在 32 位 jre 上运行的桌面应用程序内部使用 64 位 jre 调用第 3 方 API?是否可以?

c++ - 在Win10上用VS2015编译的C++ SDL2程序调试加载时间错误

iphone - 以编程方式更改 UITableView 的滚动插图以反射(reflect) iPhone 键盘的大小

javascript - SoundCloud 流 API 为某些 URL 提供 401 和 403 错误