2012-02-11 14 views
13

Visual Studio C++の静的なlibにリソースとして保存するカスタムバイナリリソース(アニメーションカーソル)があります。カスタムのバイナリリソースは、:: LoadCursor()によって読み込まれることも、カスタムリソースであり静的ライブラリである場合には、FindResource()によって見つけられることが分かります。dllの一部としてVC++静的ライブラリにカスタムバイナリリソースをロードする方法は?

This question いくつかの回避策があります。

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

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

どのようにリソースをDLLにリンクできますか?

また、バイナリを静的ライブラリで見つけることができますか?問題の方法はかなり面倒です。

+0

DLLプロジェクトで必要な.resファイルを追加するのを忘れたかどうかは、かなり不明です。最も典型的な失敗モードは、間違ったモジュールハンドルをFindResource()に渡しています。 DLLのモジュールハンドルでなければなりません。あなたはDllMain()からそれを取得します。そして、はい、これを一緒に糊付けするのは面倒です。 –

答えて

29

[リソースの追加]ダイアログで、[すべてのファイル()]を選択すると、任意のタイプのファイルをインポートできるようになります。 「カスタムリソースタイプ」ダイアログが表示されたら、「リソースタイプ」フィールドに「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はこの実行可能ファイルの最初のバイトへのポインタです。より多くの情報訪問 Resource Functions

についてここでは、ディスク上にこのようなバイナリリソースを節約する方法を例です:

#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の一部となります)。

+0

また、リソースのロックを忘れることも忘れないでください: 'BOOL bResult = :: UnlockResource(hRes);および' bResult = :: FreeResource(hRes); – DitherSky

+11

@DitherSky:いいえ、もう必要ではありません。 [FreeResource関数](http://msdn.microsoft.com/en-us/library/windows/desktop/ms648044(v = vs.85).aspx):* "この関数は廃止されており、下位互換性のためにのみサポートされています* – LihO

+0

'UnlockResource'はSDKのノーオペレーションマクロですが、変わって' FreeResource'には実数型のものがありますが、これは16ビット版のWindowsでは32ビットのWindowsアプリケーションではLoadResourceを使って読み込まれたリソースを解放する必要はありません。バックコンパイルのための 'kernel32'に対するno-op export。 – wqw

関連する問題