C++:リソースを追加することでモデルファイルをdllにこっそり封入

2482 ワード

このブログは、煮込み使用時の記録ですが、漏れがあればご指摘ください.
ハロゲン煮:非文芸ツバメ
このブログのアドレス:リソースを追加することでモデルファイルをdllにこっそりカプセル化
ニューラルネットワークと深い学習を行う会社にとって、モデルファイルは核心技術ファイルの一つです.
他の人にSDKを渡すとき、モデルファイルをそのまま渡すと、間違いなく自分のコアテクノロジーを人に渡すので、多くの会社がこの迫力を持っていないと思います.
したがって、モデルを暗号化するか、APIのdllファイルに直接カプセル化します.2つ目は間違いなくもっと安全です.
次に、dllにファイルをカプセル化する方法について説明します.
簡単に言えば、リソースファイルを追加することで実現されます.
まず、あなたのAPIプロジェクトが生成したターゲットファイルはdllです.
プロジェクトの右クリック--追加--リソース、モデルファイルを選択し、プロンプトに従ってファイルに対応する名前を付けます.
追加が完了するとresourceが生成されます.hファイル、このファイルのマクロ定義は、さっきファイルの名前を追加して構成されたインデックスであり、その後、ファイルに関連付けられます.だからむやみに値を変えないでね.
これらのファイルデータを使用するcppに、2つのヘッダファイルを追加します.
#include"resource.h"#include
2つの関数を追加
1つは現在の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;
}

もう1つは、リソースファイルのデータをどのように使用するかの関数です.
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;
}

はい、週末は休みです.まず簡単に書きます.もし漏れがあれば、後続の補正をします.