web-dev-qa-db-ja.com

dllの一部としてVC ++静的ライブラリにカスタムバイナリリソースをロードする方法は?

Visual Studio C++の静的ライブラリにリソースとして格納したいカスタムバイナリリソース(アニメーションカーソル)があります。カスタムバイナリリソースは、カスタムリソースであり、静的ライブラリにある場合、:: LoadCursor()によってロードされたり、:: FindResource()によって検出されたりしないことがわかります。

この質問 いくつかの回避策があります。

そのアドバイスに従って、*。resファイルを「構成プロパティ->リンカー->追加の依存関係」としてexeに追加すると、静的ライブラリはリソースを見つけることができます。

しかし、静的ライブラリがdllの一部であり、それを追加の依存関係としてリンクした場合、それは再び見つかりません!

Dll内のリソースをリンクするにはどうすればよいですか?

または、バイナリを静的ライブラリで見つけられるようにしますか?問題の方法はかなり面倒です。

17
meissnersd

[リソースの追加]ダイアログで[インポート]をクリックし、[すべてのファイル()]を選択して、任意のタイプのファイルをインポートできるようにします。次に、そこに欲しいファイル。 [カスタムリソースタイプ]ダイアログが表示されたら、[リソースタイプ]フィールドに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)の一部になります。

36
LihO

@LihOの答えの問題は次のとおりです。

FindResource の最初のパラメーターは、リソースを含むモジュールのModuleIDです。これが[〜#〜] null [〜#〜]に設定されている場合、関数はDLLではなく作成されたプロセス(.exe)を検索します。

しかし、HMODULEを静的LIBに含めるにはどうすればよいですか?

  • dLLからHMODULEを取得する関数/パラメーターを追加します。 HMODULE/HINSTANCE(同じ)は DLLMain で取得できます。
  • これを試してください GetCurrentModule

編集:

参照: ライブラリにlibリソースを追加

1
Ralph Erdt

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を指定すると、アプリケーションはリソースを見つけられません。

0
Michal Pokluda