meideru blog

meideruが書いているブログです。主に電子工作・プログラミング・ガジェット類などを中心に記事を書いています。

【Windows API】リソース名はMAKEINTRESOURCEを使用しなければならない?

      2016/08/03

昨日と今日はWin32APIと格闘してました。大喧嘩です。疲れました(´;ω;`)

苦戦した理由は、リソース(ダイアログボックス)を使用するときに上手くいかなかったことです。

解決策も見つかりました。簡単に説明すると、リソース名を入力するときは、MAKEINTRESOURCEというマクロを使う必要があるようです。

meideru blogの読者の方の中にも、同じような内容で苦労している方がいるかもしれないので、今日の記事に詳しく書こうと思います。

事の発端

事の発端は、ダイアログボックスを表示しようと思ったことです。

以下のようなソースを書きました。

 

リソースヘッダは以下のように記述しました。

 

リソースファイルは以下のように記述しました。

 

予定だと、以上のコードをコンパイルすると、ダイアログボックスが表示されるはずですが

実際にはそうはなりませんでした・・・。

 

問題点は、DialogBox関数の第二引数のTEXT(“IDD_DIALOG1”)にあります。デバッグによって発見しました。

MSDNでDialogBox関数を調べると以下のように書いてあります。

第二引数はLPCTSTRですので、const char*と同じ意味です。引数としては、TEXT(“IDD_DIALOG1”)は正しいはずです。

しかし、正常に動作せず・・・。

解決策

実は、以前にも同じような問題に出くわしたことがありました。

それは、「【Win32API】リソースをバイナリで出力する方法」という記事に書いてあります。

【関連記事】
【Win32API】リソースをバイナリで出力する方法

そのときは、リソース名にMAKEINTRESOURCEというマクロを使用していました。なので、今回のケースにもそれを適用してみました。

具体的には、DialogBox関数の第二引数のTEXT(“IDD_DIALOG1”)をMAKEINTRESOURCE(IDD_DIALOG1)と入れ替えてみました。

 

すると・・・

上手く行きました!!!

しっかりとダイアログボックスが表示されました!!

原因は何だったのか

原因は、未だに不明です(・.・;)

ネットで調べてみたのですが、わかりませんでした。

LPCTSTR = const char* なので、TEXT(“リソース名”)で正しいと思うんですけどね・・・。

謎です。

 

なにか知っている方は是非教えて下さい!

 

ノシ

 - プログラミング