visual 阻止在C++库中动态使用函数
visual Blocking use of functions dynamically in a C++ library
我们有一个创建为.lib和.dll的库(这是一个完全用Windows平台C++编写的大型库)。用户可以在他们的程序或库中使用该库,或者在他们想要使用它的任何方式中使用该库。
但是我想将某些功能限制为某些用户。
例如,让我们说,
- 我们的库有3个功能
foo()
,bar()
和hoo()
。 - 用户 A 为
foo()
、bar()
和hoo()
的功能付费。 - 用户 B 为
bar()
和hoo()
的功能付费。
因此,当我们给 B 库文件(标头/库/dll 等)时,
- 我们可以创建库的副本并删除 foo() 函数及其相关内容并将其发送到 B
-
或者我们可以向他发送整个库,通过某种方式阻止他使用
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"。
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在动态数组上使用搜索函数
- 通过构造函数动态确定类实现
- 对具有动态分配的内存和析构函数的类对象的引用
- 调用析构函数以释放动态分配的内存
- 为什么类和 main() 函数中也有动态内存分配
- 具有自定义构造函数 (C++) 的类型的动态数组分配
- 运行时的动态函数解析
- 在没有动态内存的世界中,我是否需要虚拟析构函数?
- 创建类类型的动态分配数组,其中类不得具有默认构造函数
- 编译时动态函数调用
- C 中的动态函数参数,可能
- 在不模板的情况下计算另一个类的动态函数指针
- C++:传递动态函数和存储函数
- 一个可以使用动态函数交换的函数
- 动态函数来调用函数
- c++中用于Callback / RPC的动态函数参数
- 运行时的动态函数调用(va_list)
- 如何在c++ 11和c++ 14中实现动态函数调用