Re: 便利なこと ( No.1 ) |
- 名前:通 日時:2008/02/12 14:12
この手の作法は、「動作する=正しいプログラム」
では無いところがなんともいえないところですね。
最近のWindowのエントリーポイントに渡される
Instanceはプロセス内での一意なIDって事に
なっているはずなので、使用しなければ問題は
無いと思いますが、Windowを作成した際に登録する
アプリケーション毎のインスタンスハンドルが
無い為、どういった動きをするのかは、
明確にならない(作法として間違っているからエラー
になったりデバッグした時とリリースした物の
動きが違っても文句言えない)という意味では
使うのは避けるべきかも知れません。
ログならDXライブラリでもprintfと似たような
感じでファイルに出力できますし、自分専用に
ライブラリを作ればもっと効率よくできると
思いますので、簡単なテストプログラム程度の
ものなら効果を発揮するかもしれません。
ちなみにOpenGLのサンプルのエントリーポイントも
mainになっていたような気がします。
まぁ、WinMainってエントリー自体がWindows固有の
物なので、他の環境ではmainで始まるのが当然といえば
当然かもしれませんね。
|
Re: 便利なこと ( No.2 ) |
- 名前:優柔不断 日時:2008/02/12 22:45
第2引数にはNULLでもかまわないようですが、第3引数には"",第4引数にはSW_SHOWとでも渡しておくのがいいでしょう。
インスタンスハンドルを得る方法は、
(HINSTANCE)GetModuleHandle(0)とすればよいですから、それを第2引数を引き渡せばいいのではないでしょうか?
|
Re: 便利なこと ( No.3 ) |
- 名前:通 日時:2008/02/13 04:05
言葉足らずで申し訳ない。
実際問題としてインスタンスハンドルが問題になる
のは余程特殊なアプリケーションですが、
MSDNなどでもLoadLibrayとGetModuleHandleの返す
ハンドルは同じと書いてありますが、
アプリケーションのインスタンス=モジュールの
インスタンスという説明は見たこと無かったので、
作法の問題と書いたわけです。
32Bit環境だとインスタンスは複数のプロセスで
重複することもありえるようなので、プロセスを
区別するにしても既に過去の産物かもしれません。
#32BitではProcessIDを使うようです
第2引数は16Bitを意識しないなら不要ですね。
#いまどきこんな環境使っている人が
#居るかどうかは置いときましょう。。。
第3引数はここを使わずにGetCommandLine関数使う
方が確実なのでNULLにしておいても良いかと。
WinMainの引数はUnicodeも対応していないようなので。
|
Re: 便利なこと ( No.4 ) |
- 名前:tok 日時:2008/02/13 04:38
普通に::OutputDebugString使えばいいと思うんですけど・・・ご存知でしたらごめんなさい。
手法的には面白いですね。参考にさせていただきます。
|
Re: 便利なこと ( No.5 ) |
- 名前:通 日時:2008/02/13 18:45
OutputDebugStringは可変引数に対応していないので
それを対応させるために薄皮を被せますが、
それを行うのと、WinMainに薄皮を被せて
printfを使うのとどちらが良いかという感じですね
可変引数はいろいろ面倒なので、端的に見れば
mainを書くだけのほうが楽かも知れません。
|
Re: 便利なこと ( No.6 ) |
- 名前:tok 日時:2008/02/14 03:47
> 可変引数はいろいろ面倒なので
と思いつつも、作ってしまったクチです。(UNICODEに対応するのもメンドかった...)
ソースファイルの最終更新日時とかも一緒に、さらにタグジャンプに対応した形式でログを吐き出すようにして、「俺すげぇw」とか1人で楽しんでいました。
結構凝っちゃいますよね。
可変個引数に関してはたしかに一度ハマると抜け出せない怖さがありますね。;;
最初に勉強しようとした時、識者の方なんでしょうが、解説がドヘタなページに迷い込んでしまって一時期トラウマになっていました。
ということで勉強して理解するよりも素直にこの辺をコピペして、理解したフリをするのが良いかもしれません。
プログラミング Tips&メモ@福ちゃんの自作ソフト公開ページ
ttp://hp.vector.co.jp/authors/VA012320/memo.html
|
Re: 便利なこと ( No.7 ) |
- 名前:通 日時:2008/02/14 15:32
可変引数はログなどの機能だと必須な
気もしますが逆に言うと危険性を理解してるヒトは
無理に使いたいとは思わないかもしれません。
一度作っておくとすごく便利なのは確かなんですが
実績がないと逆に、そのログを出力している中で
バグってるとかいう落ちが怖いので。。。
まぁ、その当たりはprintfだって同じですし、
気にしないヒトは気にしないのかもしれませんが
わざわざ危険なものを使ってまで、それをやるか
用意されてある程度実績のある標準関数を使うかという問題な気もします :-p)
ちなみにOutputDebugStringはデバッガ必須なので、
単体でテストしたいとかいうと今回紹介されてる
方法は結構有用かもしれません。
|
Re: 便利なこと ( No.8 ) |
- 名前:憂煉 日時:2008/02/17 00:43
なんだかしばらく見ない間に大量のコメントがついていてびっくりです。ありがとうございます。
この手法はDXライブラリを使う場合にはあまり問題ないと思います。
第一引数のインスタンスIDはGetModuleHandle関数でNULLを渡せば取得できますし、
第二引数は16ビットの遺物なのでDxライブラリを使う場合は考慮する価値無し、
第三コマンドライン情報は通さんの仰るとおりGetCommandLineを使えば片付きます。
第四引数の初期表示指定もDxライブラリに任せちゃえば無問題。
ただ、やっぱり必ず実行結果が同じになると言えるかどうかが怪しいですね…検証が必要です。
|
Re: 便利なこと ( No.9 ) |
- 名前:憂煉 日時:2008/02/17 00:45
ちょっと間違えました。
○ 第三コマンドライン情報
× 第三引数のコマンドライン情報
|
Re: 便利なこと ( No.10 ) |
- 名前:優柔不断 日時:2008/02/18 16:00
これはコンパイルの問題になると思います。
BCCの場合は、コンソールアプリケーションでもWin32 アプリケーションにはなるはずですが…
|