我需要重复生成带注册信息功能的Win32 DLL。此函数使用文字返回客户特定的注册信息,并为每个客户构建一个单独的DLL。
我有一个测试版本正常工作,有一个客户的硬编码信息。一些站点的紧迫性决定我手动生成一些DLL,但我想给客户端一个动态发出C源并按需构建DLL的应用程序。
最好的方法是什么?我有VS 2008 C ++ Express,因而是cl.exe编译器。我目前的方法只是让C#应用程序为C源提供字符串常量,在生成之前,用所需参数替换其中的标记,然后通过弹出和运行cl.exe来构建和链接。
答案 0 :(得分:5)
将所有客户信息作为字符串资源放在.rc文件中。将相应的.res文件链接到您的DLL中。 DLL中依赖于该客户信息的所有代码都会调用LoadString来获取它。
然后构建一个名为“UpdateDLL.exe”的单独程序(或函数),该程序使用Win32 API:BeginUpdateResource,UpdateResource等...以使用新信息更新DLL。
发送以下内容:
预编译的DLL,其中包含资源中客户信息的空(或默认)字符串。
您的UpdateDLL.exe工具,它将DLL名称和客户信息文件作为命令行参数。
您的客户运行“UpdateDLL.exe customer.dll myinfo.txt”以使用其信息更新其DLL副本。
答案 1 :(得分:2)
我的一般想法是建立一个这样的程序:
string UserName = "PLACEHOLDER UserName ";
string RegCode = "PLACEHOLDER RegCode ";
bool CheckRegistration(string UserName, RegCode) {
...
}
将其编译为.dll
文件。对于每个用户,加载.dll
文件,在其中找到两个PLACEHOLDER
,并将其替换为真实的用户数据。确保用空格填充字符串。
答案 2 :(得分:2)
.NET工具(特别是编译器)包含在.NET Framework安装中。如果你可以避免需要DLL是本机Win32,那么使用Code DOM和框架支持动态创建托管DLL。
要从Win32桥接到.NET,COM是最简单的方法,但这需要注册。要避免动态dll需要注册,请创建一个桥接管理的dll,它公开COM接口,将其与您的应用程序一起分发并在安装时注册。它加载(也可以创建)动态创建的dll。
这样您就可以避免需要确保用户安装了cl.exe和link.exe的Win32 SDK(或其他路由)。
答案 3 :(得分:1)
将文字定义为#define
,然后您需要做的就是生成一个头文件。自动构建系统将负责其余部分。
答案 4 :(得分:0)
我假设您需要生成的大多数DLL完全相同,唯一改变的是每个客户数据,可以说是一个字符串。如果是这种情况,那么最简单的方法是在代码中添加一个足够大的字符串数组,并用一些已知且独特的模式填充它。说"MYSTART-------------MYEND"
之类的东西并编译DLL
要生成每个客户端DLL,您不必实际重新编译DLL,只需用每个客户端字符串替换该唯一字符串。您需要确保替换的字符串与您在代码中添加的字符串的大小完全相同,这样就不会在文件中添加任何字节。
您可以使用十六进制编辑器或使用三行python / perl脚本手动执行此搜索和替换。