カスタムリソースを使用するには
リソースには、定義されているビットマップやアイコン、ダイアログ等以外でも指定してEXEに取り込んでおくことができます。
そしてプログラムからはいつでもそのリソースを取り出すことができます。
取り出す際には、LoadResource () API を使用します。あとはお決まりの手順で中身を読み込むことになります。
以下、サンプルになります。
■■■ customres プロジェクト
■ sample1.bin (4バイトのバイナリファイルです) ダウンロードはこちら
■ resource.h
■ resrc.rc
#include <winres.h>
#include "resource.h"
IDR_ABC SAMPLE DISCARDABLE "sample1.bin" |
■ main.cpp
#include <windows.h>
#include <tchar.h>
#include "resource.h"
// カスタムリソース IDR_ABCの中身
// 0x41, 0x42, 0x43, 0x00
// エントリポイント
int WINAPI _tWinMain ( HINSTANCE hThisInstance,
HINSTANCE,
_TCHAR *,
int )
{
// リソースタイプが "SAMPLE" という種類のカスタムリソースの中の IDR_ABC を探す
HRSRC hRsrc;
hRsrc = FindResource ( hThisInstance, MAKEINTRESOURCE ( IDR_ABC ), _TEXT ( "SAMPLE" ) );
if ( NULL == hRsrc )
{
MessageBox ( NULL,
_TEXT ( "FindResource failed" ),
_TEXT ( "Error" ),
MB_OK | MB_ICONSTOP );
return 0;
}
// 探したリソースを読み込む
HGLOBAL hGlobal;
hGlobal = LoadResource ( hThisInstance, hRsrc );
if ( NULL == hGlobal )
{
MessageBox ( NULL,
_TEXT ( "LoadResource failed" ),
_TEXT ( "Error" ),
MB_OK | MB_ICONSTOP );
return 0;
}
// リソースの先頭ポインタを取得する
void *pRes;
pRes = LockResource ( hGlobal );
if ( NULL == pRes )
{
MessageBox ( NULL,
_TEXT ( "LockResource failed" ),
_TEXT ( "Error" ),
MB_OK | MB_ICONSTOP );
return 0;
}
// リソースの中身を表示
_TCHAR *psz;
#ifndef _UNICODE // _MBCS のとき
psz = new char[ lstrlen ( reinterpret_cast < char * > ( pRes ) ) + 1 ];
wsprintf ( psz, _TEXT ( "%s" ), pRes );
#else // _UNICODE のとき
UINT nSize;
nSize = mbstowcs ( NULL, reinterpret_cast < char * > ( pRes ), 0 );
psz = new wchar_t[ nSize + 1 ];
memset ( psz, 0, sizeof ( wchar_t ) * ( nSize + 1 ) );
mbstowcs ( psz, reinterpret_cast < char * > ( pRes ), nSize );
#endif
MessageBox ( NULL,
psz,
_TEXT ( "リソースの中身" ),
MB_OK );
delete[] psz;
return 0;
}
|
|