1 名前:デフォルトの名無しさん mailto:sage [2008/08/02(土) 23:23:58 ] スレ立てるまでもない、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質問箱 Build68 pc11.2ch.net/test/read.cgi/tech/1215348804/
287 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 19:45:18 ] GdiSetBatchLimitを上げればいいんでねーの?
288 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 21:36:18 ] >287 全然違うんじゃね? GDI関数呼び出しをまとめて性能を上げるのと、一連の描きかけの絵を バックバッファに描画しておいて描き終わったら前面をInvalidateRect して(=WM_PAINT発生)からバックバッファから一気に転送(BitBlt) するのでは見え方が違う。 >286 の言ってることが正解。さらに描画を1シーケンスで完了できない場合、 描画中の絵が見えないと言うメリットもある。 性能向上の方式ではないので性能あげたいならInvalidateRectの 範囲を描画更新したい場所に限定する必要があるし、そういうの やりたいならGDIでなくDirectXで物理サーフィス×2面のFlipで やるのが普通。
289 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 22:15:07 ] てか消してるところが見えるって何世代前のPCだよw
290 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 22:17:56 ] 最新のPC
291 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 22:32:57 ] >289 最新のPCであっても、GDI関数で描画する時間は人間の一生のような 長い時間ってことが分からない素人かw 消しているトコロがリアルに人間に分からないように処理するには 液晶とグラボの垂直同期周期が60Hzとして、16.6666...msec 以内に 一連の描画処理を完了する必要があるけど? もちろん一度もVSYNC跨がずに、だ。
292 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 23:24:41 ] 一連の描画処理が16ms以上かかるってどんだけ重い描画なんだよ
293 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 23:30:17 ] でも、次の画面更新タイミングまでが偶々1msだったら・・・?
294 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 23:40:15 ] そんなの気にしなくていいよ、今時GDIなんてせいぜいコントロールの描画ぐらいしか使わないんだから Windows標準のコントロールだって物によってはダブルバッファリングされてなくてちらつくけど誰もそんなの気にしてないし
295 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 23:42:13 ] >292 かかるでしょ。 ・そのプロセスのプライオリティより高いスレッドやカーネルでの より優先度の高い処理が行われる場合。 ・そのプロセスのプライオリティより低いスレッドが一定周期で ダイナミックブーストされる場合。 ・そのプロセス自身が描画処理中に、HDD等の単一リソースにアクセスした場合。 ・例えば1280x1024x32bit(フルカラー)の描画面(=5MBytes)をグラボに転送するのに、 DMA転送が使えなかった場合。 ・使えたとしても、メモリと他のデバイス間で先にDMA転送の帯域を食いつぶされていた場合。 いくらでもある。292がMS-DOSでシングルタスクのプログラマか、カーネルの設計者と いうなら謝るよ。ここWin32API質問箱なので勘違いしてた。 293は「もちろん一度もVSYNC跨がずに、だ。」を読み取ってくれたね。
296 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 23:44:45 ] もういいよ > 例えば1280x1024x32bit(フルカラー)の描画面(=5MBytes)をグラボに転送するのに 今時こんな描画にGDIなんて使わない アンタだって暗にそう言ってるじゃん > GDIでなくDirectXで物理サーフィス×2面のFlipでやるのが普通。
297 名前:デフォルトの名無しさん mailto:sage [2008/08/11(月) 23:53:08 ] >>295 こういうKYがいるとテスト工程が無駄に増えるよなw
298 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 00:00:55 ] >>297 そうやってシステム見られない自称SEもいるね。 手戻り工数増えるんだよなw 後になって性能が出ない時に言い訳しないようにね。
299 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 00:09:35 ] 文章から加齢臭がものすごいんですが・・・
300 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 00:11:58 ] WPF使えばちらつきなんか無縁
301 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 00:21:40 ] とっととCからWPF使えるようにしろと
302 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 00:25:25 ] つ MC++
303 名前:デフォルトの名無しさん [2008/08/12(火) 00:25:46 ] ListViewのレポート形式で、表示領域が足りなくて 省略されて表示されているとき(例えば、あいう...)に、 その文字の上にカーソルを持っていくとツールチップが 表示されますが、これを無効に設定することはできない のでしょうか?
304 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 00:36:49 ] >>303 出来る。
305 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 00:46:45 ] LVS_EX_INFOTIP,LVS_EX_LABELTIPあたりじゃない?
306 名前:デフォルトの名無しさん [2008/08/12(火) 01:26:44 ] >>305 だと思うのですが、参考になるプログラムが 見つからなくて...
307 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 01:27:28 ] フラグの説明読んで書いてみりゃいいだろ なんで自分から動こうとしないんだよ
308 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 01:28:02 ] >>306 普通にググれば見つかるのだが
309 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 10:19:12 ] LVS_EX_LABELTIP Version 5.80. If a partially hidden label in any list view mode lacks ToolTip text, the list-view control will unfold the label. If this style is not set, the list-view control will unfold partly hidden labels only for the large icon mode. 別に複雑な操作がいる訳でもなし このくらい試してみようぜ
310 名前:デフォルトの名無しさん [2008/08/12(火) 10:57:03 ] CS_OWNDCにしたときに増えるメモリってどれくらい? 猫でもをみたらちょっとだけメモリを消費するって書いてあったけど タスクマネージャを見たけどあんまり変わってないっぽいけど
311 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 11:38:05 ] 見たまんまだ 確認したならそれを受け入れろ
312 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 13:35:46 ] 640KBで動く時代からあるAPIdsと説明がそういう風になることもあるw
313 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 13:40:12 ] TextOut関数で背景を部分的に変える関数等ありますでしょうか?
314 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 15:00:59 ] たかだが背景色だけ変えるなら SetBkMode で OPAQUE 指定 { SetBkColor して TextOut } を変えたい単位で分割呼び出し 複雑な背景をどうこうしたいなら SetBkMode で TRANSPARENT 指定 先に背景を描画しきって TextOut
315 名前:デフォルトの名無しさん [2008/08/12(火) 15:58:29 ] ShowWindowをAdvancedWindowsのやつでAPIフックしたらアドレス違反になるんだけどなんで?? 全プロセスにDLLにして注入ではなく、自プロセスのフックのみでやってる。適当なexeにDLLにして注入してもやっぱり違反。 他のAPIはフックできてる。環境はBCBなんだけど。
316 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 19:08:36 ] WriteProcessMemoryでやれ。権限もクリアしていて、それでできなきゃアドレス間違っている。メモリ覗いて確認しろ。
317 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 20:00:27 ] >>316 俺VirtualProtectでやってるんだけど WriteProcessMemoryのほうがいいわけ?
318 名前:317 mailto:sage [2008/08/12(火) 20:01:46 ] >>315 その事象で俺が経験した事といえばスタックオーバーフロー
319 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 20:38:48 ] どうせエラー値確認していないんだろ
320 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 21:30:16 ] アドレス違反で落ちてたらエラー値も何も無いだろ
321 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 21:58:43 ] だから何でVirtualProtectのエラーチェックしないの?ゆとり?
322 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 22:01:10 ] 書き込みでAVになるか、書き換えた関数が呼ばれた時例外発生するか質問者ははっきりさせないといかんな。
323 名前:317 mailto:sage [2008/08/12(火) 22:09:50 ] >>321 俺別にエラーチェックしてないとは一言も言ってないんだがwwwww >>320 の言ってる通りアドレス違反で落ちてるんだから・・・・・ 多分だけどやっぱ>>315 はスタックオーバーフローしてるんじゃない? GetProcAddressもあわせてAPIフックしてるならその辺を睨んだ方がよさげ つーかコード掲示するかAdvancedWindowsのページがわからないと これ以上なんともいえない
324 名前:デフォルトの名無しさん mailto:sage [2008/08/12(火) 22:27:47 ] 呼び出し規約かw
325 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 10:19:47 ] Ollyか何かで追跡してみれば
326 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 11:24:58 ] エディットコントロールの文字列選択の処理ってどうなっているのですか? どうやって選択範囲を計算してるのですか?
327 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 11:37:19 ] GetTextExtentPoint
328 名前:315 mailto:sage [2008/08/13(水) 12:55:18 ] コードも例外発生の場所も書いてなくてスマン。 なのに原因を見抜けるってのはもうすげぇな、感謝!例外は置き換えた関数が呼ばれたときにおきてた。 きちんとstdcallだってのを置き換え関数で宣言したら、うまく動くようになった。 BCBとかdelphiは標準だとcdeclとかfastcallとかだったっけ。 とにかくみんなサンクス!!
329 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 15:10:46 ] >>327 キャレット位置をどうやって計算しているかわかりますか?
330 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 15:26:17 ] 一文字ずつ幅を足していく
331 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 15:34:53 ] WM_LBUTTONDOWN クリック位置x.y座標取得 GetTextExtentPoint32関数で得られた文字列のサイズと比較していく、って事ですか?
332 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 19:09:19 ] GetTextExtentExPointを流用してもいいけど
333 名前:デフォルトの名無しさん [2008/08/13(水) 20:11:50 ] あるアプリのタブコントロールを別のプロセスから変化させたいのですが 別プロセスからTCM_SETCURSELをSendMessageすると、タブの位置は 変化するものの、TCN_SELCHANGEなどの通知メッセージがアプリ側で 発生しないので、肝心の内容が置き換わりません。 仕方なく、別プロセスから続けてWM_NOTIFYを発生させる事を考えたのですが、 別プロセスからでは構造体(NMHDR)を渡すようなメッセージは 伝わらない様です。 別プロセスからうまくタブが変化した事を通知する方法はないでしょうか。 該当コード SendMessage(htab, TCM_SETCURSEL, 3, 0); { NMHDR nmhdr; nmhdr.hwndFrom = htab; nmhdr.idFrom = GetDlgCtrlID(htab); nmhdr.code = TCN_SELCHANGE; SendMessage(hmain, WM_NOTIFY, GetDlgCtrlID(htab), (LPARAM)&nmhdr); }
334 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 20:29:33 ] VirtualAllocEx WriteProcessMemory
335 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 20:41:43 ] sendinputを使おうと思って検索したらこんな2種類の書き方が出てきました。 lpKey->type = INPUT_KEYBOARD; inputKey[cnt].type = INPUT_KEYBOARD; この -> と [ ].type はどう違うんですか?
336 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 20:53:59 ] >>335 C言語スレ池
337 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 21:30:56 ] ステータスバーの文字の色を変えるにはどうすればよいですか?
338 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 21:38:25 ] MSDN読め
339 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 21:56:25 ] >>336 分かりました。
340 名前:デフォルトの名無しさん [2008/08/13(水) 22:14:10 ] >>334 ありがとうございます。 できました。 かなり泥臭いですね・・
341 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 07:25:29 ] BitBltする大きさが少し違っただけで、いきなり速度が変わるんですが、なんか理由があるんですか。 あとディスプレイを2つつないでる環境でも、速度が結構落ちるんですが。
342 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 07:31:47 ] そりゃそうでしょうね
343 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 07:54:37 ] ヒントでもいいから教えて
344 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 08:11:23 ] おっ 典型的ゆとり発言
345 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 09:15:43 ] 知らないならレスしないでください
346 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 09:52:15 ] 自己解決しました ありがとうございました
347 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 11:19:44 ] 間違ってました やっぱり教えてください
348 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 14:55:53 ] 教えてもいいが 気に入らない態度がお前の
349 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 15:50:41 ] 知らないならレスしないでください
350 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 17:42:44 ] 自己解決しました ありがとうございました
351 名前:デフォルトの名無しさん mailto:質問age [2008/08/14(木) 18:46:37 ] 標準入力にデータが存在するかを調べるにはどうすれば良いでしょうか。 _kbhitやPeekConsoleInputを試してみたのですが、リダイレクトされた場合に機能しないようです。 CreateFileでOVERLAPPEDが使えるかとも思ったのですが、Consoleでは無視されると説明されていて 実際試してもうまくいきませんでした。
352 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 19:22:58 ] そういうときには実際に読んでみればいいんだよ。
353 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 19:41:47 ] DialogBoxやCreateDialogから行くcallback関数に変数等を渡す場合 はグローバルで宣言しておくしかないですか?
354 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 19:48:42 ] >>353 DialogBoxParam・CreateDialogParamの初期値で適当な構造体のポインタでも渡しとけ
355 名前:デフォルトの名無しさん [2008/08/14(木) 20:00:22 ] >>352 申し訳ありません、情報が足りませんでした。 入力がない間は他のことをしたいのです。
356 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 20:04:00 ] スレッド分けれ
357 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 20:05:00 ] >>354 出来ました。ありがとうございます
358 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 20:20:26 ] >>356 元が*nixなコンソールプログラムの処理中に、 出来るだけ手を加えずにほんのちょっと通信したかっただけなんで スレッド分けとかソケットは遠慮していたのですが、やはりそこまでやらないと駄目ですかね。 シグナルとかあればそれでもいいのですが。
359 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 20:40:50 ] Win32APIをC++でラッパしたフリーのライブラリ でお勧めのものがありましたら教えて下さい.
360 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 20:44:41 ] Boost
361 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 20:53:10 ] msdn.microsoft.com/ja-jp/magazine/cc534994.aspx これとか?
362 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 21:08:18 ] WTLを勧める
363 名前:359 mailto:sage [2008/08/14(木) 21:57:02 ] ありがとうございます。 自作ライブラリの参考にしたいので、 単純で解析しやすいのは無いでしょうか? eGUI++は、相当頑張ればなんとか読めそうでしたが、 WTLの方は[!endif]とか変な記号があってわかりませんでした。
364 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 22:00:52 ] へ?俺が見た限り、WTLに[!endif]なんて存在しないけど・・・
365 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 22:39:08 ] >>359 STLSoft
366 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 23:43:56 ] >>363 [!endif]はVSのプロジェクトテンプレートだろうがw
367 名前:359 mailto:sage [2008/08/15(金) 08:00:34 ] Win32APIとなんらかのC/C++コンパイラ・リンカ があれば使えるようにできるといいなと思います。 つまり、リソースは使わずに、 マクロも極力避けるという感じで。 STLSoftも良さそうですね。
368 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 11:32:16 ] Perl. system ('notepad.exe','abcde.txt'); ↑これでメモ帳が開けるんだけど、 win32APIの観点から、なにか アドバイスはありませんか?
369 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 11:42:45 ] ありません
370 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 12:23:23 ] 何を求めてるのか具体的に書かんと分からんよ アドバイスって何よ 同じ事をしたいだけならShellExecute
371 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 13:47:36 ] Perlは便利というアドバイス
372 名前:351 mailto:sage [2008/08/15(金) 22:39:32 ] 自己解決しましたので報告します。 GetStdHandleなどで得たハンドルを直接WaitForSingleObjectに入れることが出来ます。 ただしそのままではKeyDownだけではなくKeyUpでもシグナル状態になってしまうため、 WaitForSingleObject+ReadFileまたはWaitForSingleObject+ReadConsoleの組み合わせだけではブロックします。 FlushFileBufferやCancelIOではキーボードイベントをフラッシュする事が出来ず、 他にフラッシュできそうなAPIを見つけることが出来ませんでしたので今回は採用を諦めます。 どうしても直接入力/リダイレクト両対応でノンブロッキングな標準入力を行いたい方は シグナル状態になった際にPeekConsoleInputで無関係なシグナルを検出し、 その時だけReadConsoleInputでイベントを取り除いてください。 >>356 さんの言うようにスレッド化するのも手だと思いますが、ブロックするのでスレッドを終了できなくなるはずです。
373 名前:デフォルトの名無しさん mailto:sage [2008/08/15(金) 22:48:15 ] 別にスレッド終了せんでもええやん?
374 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 01:25:25 ] CreateThreadまたは__beginthreadexを使用する時に 指定するスタックサイズは皆さん「0」指定で使ってますか? 通常は「0」で問題は無いのでしょうが もし仮に明示的なスタックサイズを指定している方がいれば その利点などについて詳しく教えてもらえるとうれしいです。
375 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 01:46:41 ] 0って言ってもデフォルトサイズを使うって指定しているんだから、サイズによって何が変化するか自分で考えろよゆとり馬鹿
376 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 01:49:05 ] ・デフォルトのスタックサイズでは足りない場合に増やす スタックがあふれるようなアルゴリズムが悪いんだが、やむを得ない場合があるかもしれない ・スタックを減らしてアドレス空間を節約する スレッドを大量に作るとき、スレッド1個ごとに何MBも取ってると、アドレス空間の枯渇が早い という利点は思いつくが、今のところ俺は0以外を指定したことはない
377 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 04:24:02 ] STACK_SIZE_PARAM_IS_A_RESERVATION が指定できない2000以前じゃデフォルトより下げても意味なかったし0以外ねーな
378 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 04:51:04 ] 64bitコードならともかく、32bitコードじゃスタックサイズを増やすのはまずねーだろ。 アドレス空間足りねーよ。
379 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 12:18:14 ] デフォルトで1MBくらいなんだから、スタックサイズちょっと増やしたくらいでアドレス空間足らなくはならんだろ。
380 名前:374 mailto:sage [2008/08/16(土) 12:24:45 ] >>375-379 回答ありがとうございます。 >>376 の言うとおりスタックを減らしてアドレス空間の 節約をした方がいいのか迷っていたので、 ほかの人の意見を聞いてみようと思って質問しました。 スレッドのスタックサイズに関しては特に意識する必要は無いという事ですね。
381 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 12:50:42 ] 質問です。。。 現在keybd_eventを使用して実際のキー操作をシミュレートしようとしているのですが, keybd_event( 'A', 0, 0, 0 ); のようなコードでは,実際にAをずっと押しているときのように,動作しません。 (例えば,テキストエディタをアクティブにしていたらAがいくつも入力される。 どうしたら,実際のキーボードを押しているように動作させることが出来るのでしょうか?
382 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 12:54:08 ] スタック領域って減らせるのか? 最初は4KBぐらいしか確保されてなくて必要に応じて動的拡張されるとかじゃなかったっけ?
383 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 14:27:15 ] GetOpenFileNameのダイアログ使ってるとMAX_PATH超えられないけれど 対策もしくは代替手段て有りますか?
384 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 15:13:42 ] ダイアログを自作する
385 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 17:02:35 ] perlで ShellExecuteで、 notepad.exeを開きたい場合は どう書けばいいの?
386 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 17:14:04 ] `notepad.exe`
387 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 17:18:04 ] >>386 試してみたら、確かにメモ帳が開きましたが、 それってShellExecuteで開いてるの?