- 1 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:20:46 ]
- スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんやお姉さんたちが答えてくれるかも。 過去スレ、関連リンクは>>2-10くらい。 ■注意 ・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。 ・日本語版MSDN Online Libraryは不完全です。英語版(msdn2.microsoft.com/library/)の利用推奨。 ・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。 ・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで - Win32API質問箱 wiki wiki.livedoor.jp/program1/d/FrontPage Win32API質問箱 Build66 pc11.2ch.net/test/read.cgi/tech/1210775622/
- 51 名前:38 mailto:sage [2008/06/10(火) 01:37:26 ]
- >>50
なるほど! ということは、Restoreさせた後にウィンドウのアニメーションをさせたい場合は、 独自メッセージを飛ばす必要があるのでしょうか? それともRestoreされたことを通知するメッセージがあるのでしょうか? WM_ACTIVEをキャッチすることも考えたんですが、 Restoreされたときだけを抜き出す方法が思いつかなかったのでアドバイスお願いします。 また、アニメーションさせるとき1度SW_HIDEで非表示にしてAW_ACTIVATEで表示させるという流れでいいのでしょうか
- 52 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 03:43:33 ]
- 少しは自分で調べろ
- 53 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 06:09:59 ]
- >>47
間違っています。 以上。 はい次の方。
- 54 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 08:00:26 ]
- >>53
間違ってないよ 知らないならレスしないでね
- 55 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 08:03:19 ]
- Win32APIによるファイルの入出力を実装しています.
入出力自体はできた(と思う)のですが,最後の CloseHandle(hFile); の戻り値を HRESULT result としてデバッガで 追いかけてみると, 正常終了したはずなのに S_FALSE が返ってきます. 下記のサイトのサンプルでも試してみたのですが,同じでした. 同様の問題をご存知の方がいらっしゃいましたら教えて下さい. wisdom.sakura.ne.jp/system/winapi/win32/win113.html
- 56 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 08:05:40 ]
- CloseHandleの戻り値の型はBOOL。
0が偽(失敗)で、それ以外の値は真(成功)。 ちなみにS_FALSEの値ははたしか1のはず。
- 57 名前:55 mailto:sage [2008/06/10(火) 08:40:38 ]
- >> 56
すみません. 調べてみたらその通りでした. CloseHandle() で F1 押して CBlobCache::CloseHandle の説明を見てました. それにしても, 戻り値の 1, 0, -1 の区別は統一性が無いですね. (自分が知らないだけで良い覚え方とかあるのかな.) 素早い返信ありがとうございました. さすが2ch.
- 58 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 09:08:46 ]
- Win32APIは統一性の無さがウリ
- 59 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 09:58:59 ]
- HRESULTはCOMまわり
- 60 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 10:05:17 ]
- >>56
それ、せめてMSDNには "戻り値はTRUE, FALSE" って書いてほしい 戻り値がnonzeroとか書かれると、if文で戻り値を判定するときにそういう条件文を書くべきなのか迷う
- 61 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 10:13:43 ]
- いや、最初からC/C++のifその他の判定は0か非0かだろ
- 62 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 10:24:00 ]
- if (Hoge() == TRUE)
なんてやってる人のコードは信用できないよな
- 63 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 10:40:28 ]
- BOOLでTRUE/FALSE以外を返す関数の方が信用できない
どういう設計なんだよ
- 64 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 10:48:10 ]
- おっとGetMessageの悪口はそこまでだ
- 65 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 10:54:53 ]
- 所詮はDWORDさ。
- 66 名前:60 mailto:sage [2008/06/10(火) 11:28:06 ]
- >>62
そういうコードを書きたくないから言ってるんだよ… BOOLを戻すと宣言してあるなら、それ以上の判定は必要ないのはわかるよ。実際書かないし。 nonzero(数値)を戻すなら、せめて "ブール値の真として..." くらい書いてくれないかなってこと CのAPIである以上、数値のnonzeroとブール値の真は同じだからどっちが書いてあっても気にするなってことなのかな
- 67 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 11:44:39 ]
- Cの特徴だしな
- 68 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 11:57:25 ]
- >CのAPIである以上、数値のnonzeroとブール値の真は同じだからどっちが書いてあっても気にするなってことなのかな
間違いだらけだ。
- 69 名前:60 mailto:sage [2008/06/10(火) 12:13:01 ]
- >>68
マジか 規格の少なくともifやwhileの項にはブール値なんて存在しないとかそういうこと?
- 70 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 12:45:31 ]
- C++ならboolがあるが、C99でないCにブール値なんて概念自体存在してるのか?
- 71 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 13:00:18 ]
- >>70
ブール値の概念は存在しているが規格には書かれていない ってところかな
- 72 名前:デフォルトの名無しさん [2008/06/10(火) 15:45:32 ]
- 初歩的な質問なのですが、CreateWindowExでボタンを作りました。
そのボタンにアクセラレータ?(SHIFT+'A')をつけたいのですが、 CreateWindowExで作成したボタンにアクセラレータをつけるにはどうすればいいのでしょうか? 環境はVC+SDKです。よろしくお願いします
- 73 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 15:49:07 ]
- >>72
CreateAcceleratorTable
- 74 名前:72 mailto:sage [2008/06/10(火) 17:07:40 ]
- >>73
レスありがとうございます。 CreateAcceleratorTableで作った場合、 ボタンアクションがありません ><。
- 75 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 17:16:00 ]
- BM_CLICKでも投げとけ
- 76 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 17:18:48 ]
- >>74
まさかとは思うが、「ボタン(A)」(Alt+A)のことじゃないだろうな? こっちはボタンのキャプションを「ボタン(&A)」にすれば勝手に機能するぞ。
- 77 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 17:23:27 ]
- アクセラレータは発動したときにあくまでWM_COMMANDを発行するものであって、
ボタンのクリックをシミュレートするものではない。
- 78 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 17:34:29 ]
- >>66
Win95で適当に試した結果 EnableWindow(hwnd, TRUE) で成功するとTRUEではなく 8 が返ってくる。 EnableWindow(hwnd, 0x10000) は失敗する。(下位16ビットしか見ていないらしい) GetWindowRect(hwnd, &rect) で成功するとTRUEではなく 500 〜 599 が返ってくる。 ShowWindow(hwnd, SW_SHOW) で直前に表示されているとTRUEではなく 16 が返ってくる。 こういう謎な仕様は9x系で終わっていてほしい。 とりあえず上のAPIはNTでは大丈夫っぽいが。
- 79 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 17:35:43 ]
- 76が正解の予感
- 80 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 17:37:41 ]
- TranslateAcceleratorしてないだけだろ
- 81 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 17:45:39 ]
- >>78
APIのリファレンスに、引数はTRUE/FALSEを指定するとある。 zero/nonzeroとは書いてない。 戻り値は、zero/nonzeroと書いてある。 TRUE/FALSEを返すなんて書いてない。 説明は正しい。
- 82 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 17:54:05 ]
- >>81
>>78は、仕様がおかしいって言いたいんだろ?
- 83 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 17:58:44 ]
- >>81
説明の正しさ、じゃなくてBOOLなのにTRUE/FALSE以外を返すなということ。 GetMessageのように意味があってTRUE/FALSE以外を返すわけでも無さそうだし。
- 84 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 18:27:39 ]
- Win16のときの、1バイトでも節約、て状況のせいなのかもな。
そして互換性のためにうっかり変えられない、と。
- 85 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 18:30:17 ]
- 8や500を返すのが互換性ってのもおかしな話だなぁ
- 86 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 18:33:22 ]
- if(GetOpenFileName(&ofn) == IDOK) { 〜 } とか書いてたら正常動作していたので間違いに気付かなかった事ならある
- 87 名前:72 mailto:sage [2008/06/10(火) 18:37:18 ]
- >>75-77 >>79-80
レスありがとうございます >>77 が僕が今詰まってる問題に一番近いっぽいです ><。 アクセラレータは動いてるのですが、ボタンシミュレートが問題です。
- 88 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 18:38:51 ]
- だからSendMessage(hButton,BM_CLICK,0,0)でいいだろうが
- 89 名前:72 mailto:sage [2008/06/10(火) 18:52:00 ]
- >>88
おおっ ボタンシミュレートできました >>88さん、どうもです。感謝ですー ><。
- 90 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 19:48:36 ]
- 人の話を聞かない性格の典型的パターンだな
- 91 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 23:50:18 ]
- >>83
実装効率を考えると真の際 TRUE 以外の値を返した方がいい場合もある。 TRUE しか返さない、としてしまうと、その効率のいい実装が取れなくなってしまう。 例えば is 系関数の戻り値を戻り値にしたい場合とか。 is 系関数はメモリ効率のため全ての関数で1つのテーブルを共有し、 ビット演算を使ってそれぞれの関数の戻り値を決めるよう実装されている場合がある。 int isalpha(int letter) { return table[letter] & 1; } int isdigit(int letter) { return table[letter] & 2; } int isalnum(int letter) { return table[letter] & 3; } みたいな感じで。 こういう関数を戻り値に直接指定したい場合とか、0/1 にならないことがある。 そして、果たして BOOL の戻り値を作成する際に使った関数が 全て真偽を 0/1 で返すと確かめることはできるだろうか? もしかしたら急に仕様が変えられるかもしれない。 それを考えて常に isalpha(ch) ? TRUE : FALSE のように書く事はできるかもしれないけど、 無駄も多いし書き忘れるミスを犯す事もあるだろう。 結局、bool 型のように true/false の2値性を保証する型で typedef されていない以上、 BOOL は 0/1 の2値性を保証しない方が安全ということになる。 TRUE や FALSE は真偽値を与える箇所で 条件式を書く事無くダイレクトに真か偽かを指定するために使う物であって、 比較に使う物ではない。 そもそも真偽値をさらに比較するという発想自体が 二度手間の無駄な発想としか言いようが無い。
- 92 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 23:53:36 ]
- C言語なんだから0/1じゃなくて
0/非0で考えろ
- 93 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 00:28:41 ]
- C言語で考えるとむしろ0/1じゃね?
比較とかの評価結果は0/1で返すと決まってるし。 どちらかというと、アセンブラレベルの話だな。 BOOLを0/1へ変換するなら !!value で一応はできるな。 見た目が宜しくないのでお勧めはしないけど。
- 94 名前:デフォルトの名無しさん [2008/06/11(水) 00:31:39 ]
- HTMLを解析したいのでIHTMLDocument2を使おうと思っています
CComPtr<IHTMLDocument2> aDoc; aDoc.CoCreateinstance(CLSID_HTMLDOCUMENT); aDoc->put_URL(CComBSTR("~")); //URLの読み込み(のつもり) aDoc->get_images() この put_URL を使うとブラウザで引数のURLを開いてしまい、また、get_imagesで取得したイメージコレクションのサイズが0になっています。 まず、「ブラウザを開かないでHTMLを解析したい」のと、「get_images で取得できていない」理由がよく解りません。 コマンドラインから使うツールのつもりなのでCUIの方がうれしいのですが、ダイアログかなにかで表示させる必要があるのでしょうか? #イメージとしてはURLを引数で渡すとそのページのIMG src="***" を抽出するプログラムです。
- 95 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 00:38:26 ]
- >>93
条件式は 0/1 を返すが、 if 文や while 文などの中身は 0/非0 で判定するから C で考えるなら 0/非0 だな。
- 96 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 00:50:47 ]
- >比較とかの評価結果は0/1で返すと決まってるし。
処理系依存
- 97 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 00:52:54 ]
- ↑馬鹿
- 98 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:58:43 ]
- はあぁ?
- 99 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 03:00:22 ]
- 妄想は日記の中でしてね。
- 100 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 08:44:32 ]
- 馬鹿かお前
Win32なんて基本的に妄想が中心だろ MSDNに載ってないような事をしたければ妄想するしかないし
- 101 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 08:45:32 ]
- ↑馬鹿
- 102 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 09:56:18 ]
- ↑阿呆
- 103 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 10:03:46 ]
- ↑馬鹿
- 104 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 10:07:05 ]
- ↑阿呆
- 105 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 10:08:20 ]
- ↑馬鹿
- 106 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 10:08:55 ]
- ↑ば、馬鹿じゃないのっ
- 107 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 10:10:01 ]
- ↑阿呆
- 108 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 10:21:25 ]
- ↑あ、阿呆じゃないのっ
- 109 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 10:25:26 ]
- ↑馬鹿
- 110 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 10:26:12 ]
- ↑ば、馬鹿じゃないのっ
- 111 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 10:33:12 ]
- 訳:かまってほしいな
- 112 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 10:36:37 ]
- かまってほしくない人はレスしないでください
- 113 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 10:39:16 ]
- >>94
IHTMLDocument2 を使うことが絶対条件なの?
- 114 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 12:32:55 ]
- 必要条件
- 115 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 12:36:22 ]
- BOOLを返すAP(Iは必ず
bool Successed = Hoge(...) != 0; としてる。
- 116 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 12:40:17 ]
- だから?
- 117 名前:60 mailto:sage [2008/06/11(水) 12:57:43 ]
- ちょっとした愚痴のつもりだったんだが…
いまさらMSDN書き替えられても困るし で、結局>>68の指摘してる間違いってなんなんだ? すごく気になるんだけど
- 118 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 13:06:50 ]
- 単なるかまって厨でFA
- 119 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 13:13:40 ]
- www.open-std.org/jtc1/sc22/wg14/www/standards.html
- 120 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 14:21:09 ]
- >>68の指摘は分からんが、CのAPIではないなw
API自体は言語関係ないからね。 そう考えると、Cの文法や流儀を元に議論するのはナンセンスかもしれん。
- 121 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 14:31:32 ]
- 馬鹿だなあ
文字列がナルターミネートな時点でC前提だろ
- 122 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 14:35:03 ]
- ↑馬鹿
- 123 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 14:54:48 ]
- ↑阿呆
- 124 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 14:58:36 ]
- 呼び出し規約そのものは、cdeclとpascalの中間だけど
まあC用だな、他の言語はそれにあわせてるだけ。
- 125 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 15:05:18 ]
- そもそもwin32API自体がCで書かれているのだからC前提で当然
そんな事もわからない素人が増えちゃったんだね・・・
- 126 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 15:17:41 ]
- ↑馬鹿
- 127 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 15:19:19 ]
- ↑阿呆
- 128 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 15:20:51 ]
- ↑馬鹿
- 129 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 15:21:36 ]
- 馬鹿も阿呆も漏れだけでいい
- 130 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 15:29:14 ]
- ↓馬鹿
- 131 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 15:29:52 ]
- え?おれも?
- 132 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 15:41:59 ]
- まとめ:かまってほしいな
- 133 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 15:53:55 ]
- (・ω・` )ヾ(・ω・* )ネェネェ カマッテヨ
- 134 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 16:34:53 ]
- 「↑馬鹿」と「↑阿呆」はそれぞれ同一人物による書き込み
つまり荒らしは2名
- 135 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 16:51:30 ]
- ↑はずれ
- 136 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 17:02:54 ]
- 1人だったのか
- 137 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 17:06:37 ]
- ↑はずれ
- 138 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 17:15:14 ]
- 答え:多重人格(一人)
- 139 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 17:23:45 ]
- ↑はずれ
- 140 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 17:43:15 ]
- 現在の稼動状況
人格1: >>135 人格2: >>137 人格3: >>139 人格4〜16: Idle 最大16人格まで拡張可能 それぞれの人格は並列動作 (例えば人格1から人格2〜16のレスを見ても同一人物であるという認識は本人には無い) 記憶装置(脳)は16人格で共有されるため、正常な人間に比べて人格それぞれの知識は16分の1
- 141 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 17:54:06 ]
- >>140みたいな事を平気で書き込めちゃう奴って本気で近づきたくない
- 142 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 17:57:37 ]
- ↑馬鹿
- 143 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 18:01:29 ]
- ↑阿呆
- 144 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 18:06:05 ]
- ビリーミリガンよりは少ないな
- 145 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 18:20:27 ]
- かまってほしいな
- 146 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 18:43:19 ]
- (・ω・` )ヾ(・ω・* )ネェネェ カマッテヨ
- 147 名前:94 [2008/06/11(水) 18:45:28 ]
- >>113
> >>94 > IHTMLDocument2 を使うことが絶対条件なの? いえ、HTMLの解析が簡単にできればIHTMLDocument2でなくても問題ないです。 MSDNの中を探してたらそれらしいメソッドがIHTMLDocument2に見つかったので使っている所です。 ブラウザを開かないのはIHTMLDocument4::CreateDocumentFromURLを使えばいいのかなぁ
- 148 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 00:36:01 ]
- >>147
もし、htmlソースが文字列として得られるのなら、 ・空のドキュメントにhtmlをwriteしてDOMを作ったことはあるなあ。 ・普通に文字列処理で何とかするのも手。 ・TidyとかでXHTMLにしてXMLパーサに読ませるとか。 URLがあるんなら、そういう時のためのいいやり方が別にあるような気はするけど。 あと、こっちのスレの方が詳しいかもしれない。 IEコンポーネントを使い倒すスレ Ver.2 pc11.2ch.net/test/read.cgi/tech/1145189322/
- 149 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 02:24:06 ]
- >>147
用途が分からないから判断が難しいけど、 IHTMLDocument2だとブラウザは開くねぇ。隠したとしても音が残る。 XMLパーサーだと規約に沿ってないとエラーになる。 簡単なのはWinInetを使って、正規表現を使って解析することかなぁ。
- 150 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 03:14:42 ]
- >>149
APIフックして音を消せば?ってのがこのスレ的な回答かな
- 151 名前:デフォルトの名無しさん [2008/06/12(木) 07:03:47 ]
- 全角半角キーをスイッチのように使いたいのですが
押しても全角モードに切り替わらない良い方法はありませんか
|

|