C++:采用添加资源的方式将模型文件悄悄封入dll

来源:互联网 发布:大数据技术与应用 编辑:程序博客网 时间:2024/06/06 05:14

本博记录为卤煮使用时的记录,如有疏漏,请指正。

卤煮:非文艺小燕儿

本博地址: 采用添加资源的方式将模型文件悄悄封入dll


对于搞神经网络和深度学习的公司来说,模型文件算是核心技术文件之一。

如果给别人SDK的时候,把模型文件以原来的样子直接给人家,无疑就是把自己的核心技术拱手送人,估计很多公司还是没有这个魄力的。

所以要么给模型加密,要么直接封入API的dll文件中。第二种无疑更保险一些。

接下来就介绍一下如何将文件封入dll。

简单来说就是通过添加资源文件的方式来实现的。

首先,你的API项目生成的目标文件是dll。


项目右键--添加--资源,选择你的模型文件,根据提示给文件起个对应的名字。


添加完成后,会生成一个resource.h文件,这个文件中的宏定义就是你刚才添加文件的名字构成的索引,之后会用它来关联你的文件。所以不要乱改其值哟。


在你要用到这些文件数据的cpp中,加俩头文件:

#include"resource.h"
#include<Windows.h>


再加俩函数

一个是加载当前module的函数

HMODULE GetCurrentModule(BOOL bRef = FALSE){HMODULE hModule = NULL;if (GetModuleHandleEx(bRef ? GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS : (GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS| GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT), (LPCSTR)GetCurrentModule, &hModule)){return hModule;}return NULL;}

另一个就是如何使用资源文件中的数据的函数

BOOL load_fromResource(const int source_type, const string data_class, layer *dst){HMODULE g_hInstance;g_hInstance = GetCurrentModule();HRSRC hRes = FindResource(g_hInstance, MAKEINTRESOURCE(source_type), (LPCTSTR)data_class.c_str());if (hRes == NULL){cout << "ERROR: FindResource error." << endl;return FALSE;}HGLOBAL hResLoad = LoadResource(g_hInstance, hRes);if (hResLoad == NULL){cout << "ERROR: LoadResource error." << endl;return FALSE;}const int cbSize = SizeofResource(g_hInstance, hRes);//cout << "cbSize:" << cbSize << endl;void *lpResLock = LockResource(hResLoad);//LockResource(hResLoad)相当于把你的模型文件加载到一块内存里,内存首地址为lpResLockif (lpResLock == NULL){cout << "ERROR: LockResource error." << endl;return FALSE;}// decrypt & uncompress/*read start here,具体怎么读,就看你的数据是啥样的了*/ const int * pSource = (const int *)lpResLock; //将指针转换成你的数据的格式,如intint w = ppSource[0];//这句就类似fread(w, sizeof(int), 1, file)的功能。return TRUE;}


好啦,周末该休息啦,先简单写这些,如有遗漏,后续补正。



 
阅读全文
1 0
原创粉丝点击