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


本博記錄為鹵煮使用時的記錄,如有疏漏,請指正。

鹵煮:非文藝小燕兒

本博地址: 采用添加資源的方式將模型文件悄悄封入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)相當於把你的模型文件加載到一塊內存里,內存首地址為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;
}


好啦,周末該休息啦,先簡單寫這些,如有遺漏,后續補正。




   

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com