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

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

新規登録して質問してみよう
ただいま回答率
85.51%
Windows

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

Win32 API

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

Q&A

解決済

2回答

2199閲覧

hCurInstとは何ですか?

watarusugimoto

総合スコア47

Windows

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

Win32 API

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

0グッド

0クリップ

投稿2016/07/17 07:51

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは。

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

HINSTANCE については当面 "おまじない" でも問題ないと思います。

必要なときにインスタンスハンドルが取得できれば十分です。

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

投稿2016/07/17 07:59

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

watarusugimoto

2016/07/17 08:15

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

2016/07/17 09:28

> この「アプリケーションのインスタンスハンドル」とは、「現在のインスタンスハンドル」を指定するということですか? 大抵の場合は、その通りです。 普通にアプリケーションのリソースとしてビットマップを保存している場合です。 ビットマップ・リソースをアプリケーションのexeファイル以外から取り出したい時は異なりますが、それはその時に気にすればよいと思います。 > 何だか良くわかりませんがとりあえずそうしとけということでしょうか? 正直、その通りと思います。 > インスタンスハンドルが複数必要になったりする場合はないのかな?と疑問に感じています。 ああ、ありますよ。DLLの場合はDllMain()でインスタンス・ハンドルが渡されます。 DLLが複数のアプリで使われて同時に起動する時などにインスタンス・ハンドルで何か処理した記憶が薄っすらとあります。(もう随分前のことなので記憶が定かでないです。すいません。) 他のプロセスに対してフックをかけたいような時はウィンドウ・ハンドルからモジュールのインスタンス・ハンドルを取り出す等の面倒なことをやったような気がします。 しかし、必要が生じた時に調べれば十分なので、事前に気にしても仕方がないように思います。
watarusugimoto

2016/07/17 09:39

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

0

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

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

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

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

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

投稿2016/07/19 02:56

aetos

総合スコア42

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

watarusugimoto

2016/07/19 06:28

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問