c++ - 在 C++ 库中动态阻止函数的使用

标签 c++ visual-c++ dynamic dll c++03

我们创建了一个库,同时作为 .lib.dll 创建(这是一个完全用 C++ 为 Windows 平台编写的大型库)。用户可以在他们的程序或库中或任何他们想要使用它的地方使用该库。

但我想将某些功能限制为某些用户。
例如,可以说,

  • 我们的库有 3 个函数 foo() , bar()hoo() .
  • 用户A为功能付费foo() , bar()hoo() .
  • 用户B为功能付费 bar()hoo()

所以,当我们给B库文件(头文件/libs/dll等)时,

  1. 我们可以创建库的拷贝并删除 foo() 函数及其相关内容,然后将其发送到 B
  2. 或者我们可以向他发送整个图书馆,并通过某种方式阻止他使用 foo() .

    • 第一种方法不好,因为它是一项艰巨的工作,并且必须小心依赖关系。即使我们确定bar()hoo()不依赖于foo() ,删除一些东西,并为它们提供一个自定义版本的库,其中还将包括更多测试,这仍然是一件令人头疼的事情。而且维护会更加成问题。而且SVN也会很困惑。
    • 第二种方法是我认为最好的方法。但如何做到呢?

如果B支付foo()怎么办?稍后功能?那我就得让他用了。

我想现在你已经明白这个问题了。这两种方式只是我的意见,也许我的结论也可能是错误的。所以,我想询问是否有人对此事有任何想法/建议。

最佳答案

我只会创建一个包含 header 的 .dll 版本,并让用户为其付费下载导入库。对于其他一切,律师是最好的工具。

有人购买了额外的模块?让他们下载额外的导入库。

您在中构建的任何类型的保护/锁定(无论是对 has_paid bool 值、公钥方案还是代理库的简单检查)都可以是被规避。有些绕过起来比较简单,有些则有点难。

通过不向他们提供模块 foo 所需的导入库,您可以向诚实的客户提供温和的提示。

还会有人骗你的钱吗?他们当然会(如果你的产品足够有趣),但这些人无论如何都会这样做。他们还不如从一开始就盗版完整的软件包。他们是那种无论如何也不会为你的产品付费的人。 这就是你聘请律师的地方

大多数人会为了钱而欺骗你吗?不太可能。愿意为你的产品付费的人不太可能欺骗你一半的许可费,至少是故意的。这是大风险的小 yield 。您很容易发现有人在欺骗您。
他们是有身份的人,但他们也会失去一些东西。他们不想卷入一场花费几十万的诉讼(这意味着失去他们的 Assets ),也不想卷入负面宣传。
它可能只会无意发生,但由于您没有提供必要的导入库,所以这是不可能的。

您可以以非常简单的方式将您的用户视为以下三个类别之一:

  • 我们是一家小型软件公司,拥有 5 名开发人员,我们已经经营了 3 年,公司股本为 50,000。我们已经为 foo 许可证支付了 500 美元,bar 许可证将花费我们另外 500 美元。您知道我们正在使用您的库,因为我们购买了 foo我们知道您知道。打一场官司会花费我们大约 50,000 美元——天哪,我们宁愿多付 500 美元。
  • 我们是微软。如果有人发现我非法使用这个库,我就会被解雇。现在,如果我打扰他午餐后的 sleep ,预算又超过 500 美元,我的主管会怎么说?该死,我们可能还需要另外两次无聊的 session 才能做出决定。让我们看看,我想我们可以用这个帐户预订...
  • 我是一个酷炫的 d00d。我很酷,但我仍然会使用你们的库来编写我的 5 个学校 friend 将使用的程序。执照?许可证是给失败者的。反正你也不会知道我的名字。

前两个会失去一些东西,第三个则不会。前两个会付钱给你并且不会(故意)欺骗你。最后一个你不能不关心的。

关于c++ - 在 C++ 库中动态阻止函数的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11221068/

相关文章:

Javascript: "Cancelling"动态脚本标签?

c++ - 难以理解某个功能的元素如何工作

c# - 等待带有动态参数的方法时抛出异常(有时)

c++ - 将复选框列添加到树左侧的 QTreeView 的方法?

c++ - 将 CRC 数据写入 .txt 文件

c++ - 是否有可以在 Visual Studio 6 C++ 上运行的反编译器

c++ - 构建一个不依赖 dll 的 C++ 二进制文件

android - 将 textView 动态添加到 linearLayout

c++ - 如何让柯南生成 FindXXX.cmake?

c++ - 错误 : pasting "tmp_UINT" and "+" does not give a valid preprocessing token