実行ファイルと同じフォルダに特定の名前にしておく。
それすらも禁止したい場合、無いですか?
ずいぶんむかしに、そんなケースがありました。んでもって、実現する方法がありました。
/*
*
* ハンドルは、RemoveFontMemResourceEx で開放
*/
HANDLE LoadResourceFont( HINSTANCE hInst, UINT uID )
{
HANDLE hResFont;
HGLOBAL hGlobal;
HRSRC hRSrc;
DWORD dwSize, dwInst;
LPVOID lpLock = NULL;
hResFont = NULL;
hRSrc = FindResource( hInst, MAKEINTRESOURCE(uID), RT_FONT );
if( hRSrc != NULL ){
hGlobal = LoadResource( hInst, hRSrc );
if( hGlobal != NULL ){
dwSize = SizeofResource( hInst, hRSrc );
lpLock = LockResource( hGlobal );
if( lpLock != NULL ){
hResFont = AddFontMemResourceEx( lpLock, dwSize, NULL, &dwInst );
}
FreeResource( hGlobal );
}
}
return hResFont;
}
*
* ハンドルは、RemoveFontMemResourceEx で開放
*/
HANDLE LoadResourceFont( HINSTANCE hInst, UINT uID )
{
HANDLE hResFont;
HGLOBAL hGlobal;
HRSRC hRSrc;
DWORD dwSize, dwInst;
LPVOID lpLock = NULL;
hResFont = NULL;
hRSrc = FindResource( hInst, MAKEINTRESOURCE(uID), RT_FONT );
if( hRSrc != NULL ){
hGlobal = LoadResource( hInst, hRSrc );
if( hGlobal != NULL ){
dwSize = SizeofResource( hInst, hRSrc );
lpLock = LockResource( hGlobal );
if( lpLock != NULL ){
hResFont = AddFontMemResourceEx( lpLock, dwSize, NULL, &dwInst );
}
FreeResource( hGlobal );
}
}
return hResFont;
}
まず、フォントファイルはリソースに登録できます。
そのリソースは、FindResourceでハンドルを取得できます。
LoadResource、SizeofResource、LockResourceとリソースからグローバルハンドル(メモリブロック)へデータの型を切り替えていきます。
メモリ上のフォントリソースをAddFontMemResourceExで登録することで、リソースのフォントを使用することができます。
登録されたフォントは、CreateFont系APIで書体を指定できます。
AddFontMemResourceExで登録したフォントリソースはRemoveFontMemResourceExで開放することができます。
ただ、フォントの多くは、ファイルサイズが大きいです。10メガ越えも珍しくありません。
# ビットマップフォントは比較的軽いですが
ファイルサイズの大きすぎる実行ファイルは「なにがあるんだ?」と思われてしまいます。
圧縮でもできればいいんですけどね。
3 件のコメント:
>ファイルサイズの大きすぎる実行ファイルは「なにがあるんだ?」と思われてしまいます。
圧縮でもできればいいんですけどね。
(仕様的に可能なら)リソースだけDLLにすると良いよ。
> (仕様的に可能なら)リソースだけDLL
技術的には可能だよね。
リソースDLLとか多言語対応用DLLの作り方も需要があれば書こうかな。
以前リソースDLLをはじめて作った時、リソースDLL=サテライトDLLっていうのにたどり着くのに時間かかった。
需要がどの程度かは判らないけど、世の中の困っている誰かをいつか助けるかもしれない、って意味では書いておくと良いかもねー
コメントを投稿