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

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

卤煮:非文艺小燕儿

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


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

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

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

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

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

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


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


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


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

#include"resource.h"
#include


再加俩函数

一个是加载当前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)相当于把你的模型文件加载到一块内存里,内存首地址为lpResLock

	if (lpResLock == NULL)
	{
		cout << "ERROR: LockResource error." << endl;
		return FALSE;
	}

	// decrypt & uncompress
	/*read start here,具体怎么读,就看你的数据是啥样的了*/
 	const int * pSource = (const int *)lpResLock; //将指针转换成你的数据的格式,如int
	int w = ppSource[0];//这句就类似fread(w, sizeof(int), 1, file)的功能。
	return TRUE;
}


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






你可能感兴趣的:(C++)