2

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

但是我想将某些功能限制为某些用户。
例如,让我们说,

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

因此,当我们向B提供库文件(headers/libs/dlls 等)时,

  1. 我们可以创建我们库的副本并删除 foo() 函数及其相关内容并将其发送给B
  2. 或者我们可以将整个库发送给他,并通过某种方式阻止他使用foo().

    • 第一种方法不好,因为它是一项巨大的工作,并且必须小心依赖关系。即使我们确实知道bar()并且hoo()不依赖于foo(),删除东西并给他们一个定制版本的 lib 仍然是一件令人头疼的事情,其中​​还包括更多的测试。维护将更加成问题。SVN也会很混乱。
    • 第二种方法是我猜的最好方法。但是怎么做呢?

如果Bfoo()以后为功能付费怎么办?那我就得让他用了。

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

4

4 回答 4

1

我会尝试使用Windows Forwared-Library 机制(部分导出转发)来实现此机制。这种机制允许您构建一种可以分发的代理库,它“什么都不做”,只是将真正的代码执行转发给其他库。这将有利于提供一个单一的通用接口,但区分用户及其在其他库层中使用 API 的“权限”。

于 2012-06-27T08:06:10.400 回答
1

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

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

您构建的任何类型的保护/锁定(无论是对has_paid布尔值、公钥方案还是代理库的简单检查)都可以被规避。有些更容易绕过,有些则更难绕过。

通过不给他们必要的导入库,比如 module foo,你给诚实的客户一个温和的提示。

有些人还会为了你的钱骗你吗?他们当然会(如果你的产品足够有趣的话),但无论哪种方式,这些人都会这样做。他们不妨从一开始就盗版完整的软件包。他们是那种无论如何都不会为你的产品买单的人。那就是你使用律师的地方

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

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

  • 我们是一家拥有5名开发人员的小型软件公司,我们已经经营了3年,我们公司拥有50,​​000的股权。我们已经为foo许可证支付了 500 美元,bar许可证将花费我们另外 500 美元。您知道我们正在使用您的库,因为我们购买了foo. 我们知道你知道。一场诉讼将花费我们大约 50,000 - 哦该死,让我们多付 500。
  • 我们是微软。如果有人发现我非法使用这个库,我会被解雇。现在,如果我在他午饭后的睡眠中打扰他,超出另外 500 的预算,我的主管会怎么说?该死,我们可能需要另外两次无聊的会议来决定。让我们看看,我想我们可以在这个帐户上预订...
  • 我是一个酷酷的cracka d00d。我很酷,但我仍然会使用你的图书馆来做一个我在学校的 5 个朋友会使用的程序。执照?许可证是给失败者的。反正你不会知道我的名字的。

前两个有损失,第三个没有。前两个会付钱给你,不会(故意)欺骗你。最后一个你不能关心的少。

于 2012-06-27T08:36:28.970 回答
0

第三方许可库正是为此目的而存在的。我可以命名 Flex(无从属关系),我知道它具有您正在寻找的确切功能。

于 2012-06-27T07:10:53.813 回答
0

您可以发明一种公钥/私钥“解锁”机制。但这可能是很多工作却收效甚微。我提出的任何建议都不是不可能有人破解的。

为什么不根据您提供的不同许可方案将代码二进制文件拆分?即:上面的客户 A 得到 foo.lib、bar.lib 和 hoo.lib。客户 B 只获得 bar.lib 和 hoo.lib。两者都得到一个具有所有常见依赖项的“sharedcode.lib”。

于 2012-06-27T08:07:40.713 回答