Visual Studio C++の静的ライブラリにリソースとして格納したいカスタムバイナリリソース(アニメーションカーソル)があります。カスタムバイナリリソースは、カスタムリソースであり、静的ライブラリにある場合、:: LoadCursor()によってロードされたり、:: FindResource()によって検出されたりしないことがわかります。
この質問 いくつかの回避策があります。
そのアドバイスに従って、*。resファイルを「構成プロパティ->リンカー->追加の依存関係」としてexeに追加すると、静的ライブラリはリソースを見つけることができます。
しかし、静的ライブラリがdllの一部であり、それを追加の依存関係としてリンクした場合、それは再び見つかりません!
Dll内のリソースをリンクするにはどうすればよいですか?
または、バイナリを静的ライブラリで見つけられるようにしますか?問題の方法はかなり面倒です。
[リソースの追加]ダイアログで[インポート]をクリックし、[すべてのファイル(。)]を選択して、任意のタイプのファイルをインポートできるようにします。次に、そこに欲しいファイル。 [カスタムリソースタイプ]ダイアログが表示されたら、[リソースタイプ]フィールドにRCDATAと入力します。
.rcファイルを開くと、次のようなものが表示されます。
/////////////////////////////////////////////////////////////////////////////
//
// RCDATA
//
IDR_RCDATA1 RCDATA "myfile.whatever"
そしてそれは次の行でresource.hを生成します:
#define IDR_RCDATA1 101
コードでは、次のようにアクセスします。
#include "resource.h"
#include <windows.h>
int main(int argc, char* argv[])
{
HRSRC myResource = ::FindResource(NULL, MAKEINTRESOURCE(IDR_RCDATA1), RT_RCDATA);
HGLOBAL myResourceData = ::LoadResource(NULL, myResource);
void* pMyBinaryData = ::LockResource(myResourceData);
return 0;
}
ここで、pMyBinaryDataは、この実行可能ファイルの最初のバイトへのポインターです。詳細については、 リソース関数 をご覧ください。
このようなバイナリリソースをディスクに保存する方法の例を次に示します。
#include "resource.h"
#include <windows.h>
#include <fstream>
int main(int argc, char* argv[])
{
HRSRC myResource = ::FindResource(NULL, MAKEINTRESOURCE(IDR_RCDATA1), RT_RCDATA);
unsigned int myResourceSize = ::SizeofResource(NULL, myResource);
HGLOBAL myResourceData = ::LoadResource(NULL, myResource);
void* pMyBinaryData = ::LockResource(myResourceData);
std::ofstream f("C:\\x.bin", std::ios::out | std::ios::binary);
f.write((char*)pMyBinaryData, myResourceSize);
f.close();
return 0;
}
そのようなリソースでプロジェクトをビルドすると、このリソースはプログラム(dll)の一部になります。
@LihOの答えの問題は次のとおりです。
FindResource の最初のパラメーターは、リソースを含むモジュールのModuleIDです。これが[〜#〜] null [〜#〜]に設定されている場合、関数はDLLではなく作成されたプロセス(.exe)を検索します。
しかし、HMODULEを静的LIBに含めるにはどうすればよいですか?
編集:
参照: ライブラリにlibリソースを追加
MFC(およびCWinApp)を使用してdllを使用する場合は、CWinAppからHMODULEを取得できます。
extern MyDllApp theApp;
HMODULE module = (HMODULE)theApp.m_hInstance;
HRSRC myResource = ::FindResource(module,
MAKEINTRESOURCE(IDR_FILE_RESOURCE), _T("GROUP_NAME"));
FindResourceでNULL
を指定すると、アプリケーションはリソースを見つけられません。