質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.45%

  • Windows

    1738questions

    Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

  • Win32 API

    299questions

    Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

hCurInstとは何ですか?

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 765

watarusugimoto

score 34

hCurInstとは何ですか?

ウィンドウズプログラミングをしていて、hCurInstという変数がWinMain関数の引数となっていますが、
「現在のインスタンスハンドルを示す変数」という説明が書かれているのですが良くわかりません。
hCurInstはどのような変数なのでしょうか?
具体的に説明できるかたいらっしゃればお願いします。

また、おそらくWindowsの仕組みが分かっていないから理解できないのかもしれないのですが、
参考となる本や書籍があれば教えてください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

こんにちは。

インスタンスハンドルが参考になりそうです。

HINSTANCE については当面 "おまじない" でも問題ないと思います。
必要なときにインスタンスハンドルが取得できれば十分です。

と書かれてますが、この見解に私も同意です。
必要が生じたらグローバル変数に保存しておいて、必要な関数でそれを使ってました。
何かの処理をしたい時に呼び出すべきAPIがインスタンスハンドルを要求していることがあります。
その時が必要な時です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/17 17:15

    例えば、LoadBitmap関数で
    HBITMAP LoadBitmap(
     HINSTANCE hInstance, //インスタンスハンドル
     LPCTSTR lpBitmapName //ビットマップリソースの名前
    );
    となっている場合、hInstanceにはアプリケーションのインスタンスハンドルを指定しますとありますが、この「アプリケーションのインスタンスハンドル」とは、「現在のインスタンスハンドル」を指定するということですか?
    何だか良くわかりませんがとりあえずそうしとけということでしょうか?
    インスタンスハンドルが複数必要になったりする場合はないのかな?と疑問に感じています。

    キャンセル

  • 2016/07/17 18:28

    > この「アプリケーションのインスタンスハンドル」とは、「現在のインスタンスハンドル」を指定するということですか?

    大抵の場合は、その通りです。
    普通にアプリケーションのリソースとしてビットマップを保存している場合です。

    ビットマップ・リソースをアプリケーションのexeファイル以外から取り出したい時は異なりますが、それはその時に気にすればよいと思います。

    > 何だか良くわかりませんがとりあえずそうしとけということでしょうか?

    正直、その通りと思います。

    > インスタンスハンドルが複数必要になったりする場合はないのかな?と疑問に感じています。

    ああ、ありますよ。DLLの場合はDllMain()でインスタンス・ハンドルが渡されます。
    DLLが複数のアプリで使われて同時に起動する時などにインスタンス・ハンドルで何か処理した記憶が薄っすらとあります。(もう随分前のことなので記憶が定かでないです。すいません。)
    他のプロセスに対してフックをかけたいような時はウィンドウ・ハンドルからモジュールのインスタンス・ハンドルを取り出す等の面倒なことをやったような気がします。

    しかし、必要が生じた時に調べれば十分なので、事前に気にしても仕方がないように思います。

    キャンセル

  • 2016/07/17 18:39

    ありがとうございます。
    何だかすっきりしました。

    キャンセル

0

解決済みになっていますがうっすら不安なのでひと言…

インスタンス ハンドルは、モジュール ハンドルと同じものです。
ですから、インスタンス ハンドル(HINSTANCE)を要求する関数にモジュール ハンドル(HMODULE)を渡すことができますし、逆も同様に可能です。

ひとつの EXE ファイルが実行されるときには、複数の DLL ファイルも同時にロードされます。
自動的にロードされる場合もあるし、LoadLibrary で明示的にロードする場合もあります。
LoadLibrary 等の関数の戻り値であり、メモリ上にロードされている DLL を識別する値がモジュール ハンドルです。
(さらに踏み込んで言えば、モジュール ハンドルは DLL がメモリ上に存在する位置を表すポインターでもあります)

実行時には EXE も DLL と同じ仕組みでメモリ上にロードされます。
DLL の場合はモジュール ハンドル、EXE の場合はインスタンス ハンドルと呼び分けているだけです。

「『現在の』インスタンス ハンドル」という言い方は歴史的な事情によるものです。
WinMain の引数には hPrevInst とかいうものもあり、昔はこれが「以前のインスタンス ハンドル」でした。
現在は hPrevInst は常に NULL になるので、インスタンス ハンドルは hCurInst が「唯一のインスタンス ハンドル」です。
従って「現在の」という言い回しに意味はありません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/19 15:28

    インスタンスハンドルは、EXEの場合にのみ適用されるハンドルの名称なんですね。
    詳しい説明ありがとうございます。
    かなりすっきりしました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.45%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Windows

    1738questions

    Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

  • Win32 API

    299questions

    Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

閲覧数の多いWindowsの質問