VC.NET ~ アンマネージのリソースをマネージで使う

前置き

VC.NETでWindowsフォームアプリを作ると、デフォルトで、app.rcというアンマネージ・リソースが作成されます。従来の(.NET以前の)、Win32を使ったアプリ開発では、このアンマネージ・リソースの中にアイコンやメニュー、ダイアログなどの情報を格納していました。.NETの時代になっても、まだapp.rcが残っているのは意外な気がしますが、Windows2000やXPのエクスプローラ向けの処置なのかもしれません。

本記事では、アンマネージ・リソースに格納された情報を取り出してマネージ側で使うコードを示します。

本文

インスタンスハンドル

アンマネージ・リソースを扱うにはインスタンスハンドルが必要です。Win32ではお馴染みのインスタンスハンドルも、.NETでは隠蔽されてしまっており、ひと手間かけて入手する必要があります。

System::Reflection::Module^ mod = System::Reflection::Assembly::GetExecutingAssembly()->GetModules()[0];
IntPtr hinst = Marshal::GetHINSTANCE(mod);
HINSTANCE hinstance = (HINSTANCE)hinst.ToPointer();

Win32ではHINSTANCE型ですが、マネージ側ではIntPtrにラップされています。

インスタンスハンドルが手に入れば、Win32のLoadXxx系関数が使えるようになります。ためしに、アイコンをロードしてみましょう。

アイコンを取り出す

アンマネージ・リソースにアイコン(app.ico)が格納されているとします。app.rcは、こんな感じになります。

#include "resource.h"

...

IDI_ICON1    ICON         "app.ico"

resource.hは、リソースIDを定義するヘッダファイルです。

#define IDI_ICON1 101

残念ながらVisual C++ 2008 Express Editionは、ネイティブ・リソースやアイコンの編集をサポートしてません。app.rcはテキストエディタで、app.icoは何か適当なお絵かきソフトで編集する必要があります。

アイコンファイル

このアイコンをロードして、フォームのIconプロパティにセットしてみましょう。

public ref class MainForm : public System::Windows::Forms::Form {

  MainForm(void) {
    System::Reflection::Module^ mod =
      System::Reflection::Assembly::GetExecutingAssembly()->GetModules()[0];
    IntPtr hinst = Marshal::GetHINSTANCE(mod);
    mIcon = LoadIcon((HINSTANCE)hinst.ToPointer(), MAKEINTRESOURCE(IDI_ICON1));
    if ( mIcon ) Icon = System::Drawing::Icon::FromHandle(IntPtr(mIcon));
  }

private:
  HICON mIcon;

フォームのアイコン

ロードしたアイコンは、不要になったら廃棄する必要があります。アンマネージ・リソースの廃棄にはファイナライザを使いましょう(詳しくは別記事を参照)。

  ~MainForm() {
    this->!MainForm();
  }

  !MainForm() {
    if ( mIcon ) {
      DestroyIcon(mIcon);
      mIcon = NULL;
    }
  }
Last modified:2012/05/08 14:02:11
Keyword(s):
References:[.NETアプリ開発] [VC.NET ~ フォームのアイコンをカスタマイズする]
This page is frozen.