visual 阻止在C++库中动态使用函数

visual Blocking use of functions dynamically in a C++ library

本文关键字:动态 函数 C++ visual      更新时间:2023-10-16

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

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

  • 我们的库有3个功能foo()bar()hoo()
  • 用户 Afoo()bar()hoo()的功能付费。
  • 用户 Bbar()hoo()的功能付费。

因此,当我们给 B 库文件(标头/库/dll 等)时,

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

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

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

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

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

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

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

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

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

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

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

    我们
  • 是一家拥有 5 名开发人员的小型软件公司,我们已经开展业务 3 年,我们公司的股权为 50,000。我们已经为foo许可证支付了 500,bar许可证将花费我们另外 500。您知道我们正在使用您的图书馆,因为我们购买了foo.我们知道你知道。一场官司要花我们大约5万——哦,该死,让我们宁愿多付500。
  • 我们Microsoft。如果有人发现我非法使用这个库,我会被解雇。现在,如果我在午饭后睡觉时打扰他,超过另外500的预算,我的主管会怎么说?的,我们可能需要另外两次无聊的会议来决定。让我们看看,我想我们可以在这个帐户上预订它......
  • 我是一个酷坏的裂缝d00d。我很酷,但我仍然会使用你的图书馆来制作我在学校的 5 个朋友会使用的程序。许可证?许可证是为失败者准备的。反正你也不会知道我的名字。

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

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

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

你可以发明一个公钥/私钥"解锁"机制。 但这可能是很多工作,但收效甚微。 我提出的任何事情对于某人来说都不是不可能破解的。

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