トップページ⇒tech
995コメント264KB

Win32API質問箱 Build87

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/03/28(日) 10:23:58
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんやお姉さんたちが答えてくれるかも。
「知らないならレスしないで下さい。ウザイだけです。 」なんて言わないでねっ!

過去スレ、関連リンクは>>2-10くらい。

■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版( http://msdn.microsoft.com/en-us/library/ )の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで

- Win32API質問箱 wiki
http://wiki.livedoor.jp/program1/d/FrontPage

Win32API質問箱 Build86
http://pc12.2ch.net/test/read.cgi/tech/1265350980/
0286デフォルトの名無しさん2010/04/16(金) 15:06:33
関数呼び出しにに必要な構造体とか関数ポインタ型へのリンクがないだけでも
使いものにならないのに。
0287デフォルトの名無しさん2010/04/16(金) 15:23:47
>>271
すいません、調べてみても
HANDLE_FLAG_PROTECT_FROM_CLOSE
を使う必要性が感じられないのですが。

そもそも_beginthread はCREATE_SUSPENDが使えませんし。

総合すると _beginthreadex を使えばOK
ということになりそうなのですが、exを使った場合でも
HANDLE_FLAG_PROTECT_FROM_CLOSE
の出番はありますでしょうか?
0288デフォルトの名無しさん2010/04/16(金) 15:25:13
いまだにVC6使ってる俺は2001年10月版の日本語MSDN使ってるけど
ちゃんと

CreateFile が返したオブジェクトハンドルを閉じるには、CloseHandle 関数を使います。

てなってるな。劣化してるのかな?
0289デフォルトの名無しさん2010/04/16(金) 15:33:56
>>287
>>271は良くわかっていない初心者だから放置していいよ。
exから得たハンドル使えば解決。
0290デフォルトの名無しさん2010/04/16(金) 15:35:36
>>287
無い。 が、終了確認後に CloseHandle してやらないとまずい。

_beginthread
○ スレッド終了時に自動的にハンドルをクローズする(リソース漏れは自動回避される)
 そのかわり 終了判定は困難
 「終了確認前にスレッドが終了しているか否か」 で判定の意味が変化してしまう
 # そして、終了確認側で既にスレッドが終了しているか否かを知る術は?… と自己矛盾な記述に…

_beginthreadex
○ スレッド終了後もハンドルは維持され終了判定は容易。
 だが、自前でハンドルをクローズしないと漏れ漏れ
0291デフォルトの名無しさん2010/04/16(金) 15:36:27
>>287
CREATE_SUSPENDが使えないなら新規スレッド側で待機
_beginthreadexを使うなら必要ない
0292デフォルトの名無しさん2010/04/16(金) 16:17:33
すいません、何度も細かく聞いて申し訳ないのですが。

_beginthreadexで作ったスレッドには、解放すべきものが二つある。
1・_endthreadex で解放する「何か」
2・ CloseHandleで解放する「スレッドの生死などを確認するなどに利用する、何か」

1は、スレッド用の関数を抜ければ自動で呼ばれるので、きちんと抜ける場合は呼んでも呼ばなくても良い

2は、明示的にクローズしてやる必要がある。
スレッドを作った側でクローズしても、スレッド側でクローズしてもOK(だけど二重にクローズしないようにな!)
また、スレッドが生きている間にクローズしても(生死確認などができなくなるだけで)問題ない。

という認識正しいでしょうか?
0293デフォルトの名無しさん2010/04/16(金) 16:21:35
>>292
1 おけ
2 おけ  生死判断したいなら、生死判断した後にクローズ(おおよそ スレッドを作った側ではある)
0294デフォルトの名無しさん2010/04/16(金) 16:40:50
ありがとうございます。

exじゃない版は、連絡用の「何か」とスレッド用の「何か」が分離されていないから色々扱いづらかったんですね
ex版を使うべきっていう意見を正しく理解できたと思います。
0295デフォルトの名無しさん2010/04/16(金) 16:45:05
>>294
「何か」=「_begintheadがCreateThreadを呼んで返された『スレッドハンドル』」な
0296デフォルトの名無しさん2010/04/16(金) 16:58:09
>>294
スレッド用の何かというが、exでもランタイムが使うTLSなんてユーザー側に見せてないだろ
分離できてないのはお前の頭じゃね?
0297デフォルトの名無しさん2010/04/16(金) 17:03:03
だから「何か」って表現してんだろ
0298デフォルトの名無しさん2010/04/16(金) 17:28:55
>>296
インストール時にCRTのソースもインストールしておくと実装が見れるが
TLS だけじゃなく、浮動小数点周辺や構造化例外(C++ の例外をうまくスレッド別に配送)の面倒を見てるね

ま、ランタイムにかかわる表面には出てこない何かとひとくくりの表現で良いんでない? (1の何かに関して)
0299デフォルトの名無しさん2010/04/16(金) 20:45:03
最近打ち合わせでは分かり切ったことは飛ばして話を進めているのに
知識として持っててあたりまえのことを質問する馬鹿が増えた
03001182010/04/16(金) 21:13:46
そうかあ。

 俺、ブラやぱんつに興味ないんだ。
 スリップが透けてるといいと思うけど、いないしな。
 下着なしも、もっといないしな。
 透けてなくていいよ。
0301デフォルトの名無しさん2010/04/18(日) 16:42:20
質問
環境はWin7、VC6++でダイアログベースのアプリです。
マウスオーバーでダイアログを非表示にして、表示されていた位置からマウスを
離すと再びダイアログを表示させることはできますか?

非表示はWM_MOUSEMOVEのときにShowWindow(SW_HIDE)でできるんですが
マウスを離して表示させるのはどうやったらできるでしょうか。
0302デフォルトの名無しさん2010/04/18(日) 16:47:07
>>301
やった事無いけどパッと思いつく方法としては、
その非表示のタイミングでマウスをSetCaptureしつつ、Screen座標ひろっておいて、
移動中、一定距離離れたタイミングで再び表示&ReleaseCaptureしてやるとか

きちんと動作確認して、不意な操作や例外的な対処もしないとマズいけど
0303デフォルトの名無しさん2010/04/18(日) 16:49:07
WM_MOUSEMOVE (1回目はマウスをキャプチャするだけ)
SetCapture
ShowWindow(SW_HIDE)

WM_MOUSEMOVE (2回目はHIDE中に呼ばれていればマウスキャプチャをリリース)
ReleaseCapture
ShowWindow(SW_SHOW)
0304デフォルトの名無しさん2010/04/18(日) 16:58:01
>>302,303
回答ありがとうございます。
SetCapture試してみます。
0305デフォルトの名無しさん2010/04/18(日) 17:23:35
>>304 じゃないけど試してみた
使い方間違ってるのかもしれないけど
Hide した直後から WM_MOUSEMOVE が来なくなってるみたいだw
Release しようにもマウス座標が取れないw
0306デフォルトの名無しさん2010/04/18(日) 17:34:16
>>305
304です
同じくうまくいきませんでした。

SetCapture後にHideしたらかってにReleaseされて
Hide後にSetCaptureした場合はキャプチャされないような動きです。
0307デフォルトの名無しさん2010/04/18(日) 17:36:58
TrackMouseEventとWM_MOUSELEAVEを使ったらいけるんでない?
0308デフォルトの名無しさん2010/04/18(日) 17:54:07
LayeredWindowにして
alphablendを0にして
translatedにするといいかも
0309デフォルトの名無しさん2010/04/18(日) 17:59:07
× translated
○ transparent
0310デフォルトの名無しさん2010/04/18(日) 18:05:09
SetCapture関数はフォアグラウンドウィンドウでしか使えなかった筈なので、
フォアグランドで且つオーナーなウィンドウがSetCaptureしてやればいいと思うよ。
例えばGetDesktopWindow()で取得したHWNDをSetCapture()に渡すとか。
03113042010/04/18(日) 18:38:44
>>307
Hideした瞬間にWM_MOUSELEAVEが来てしまいました。
そのときのWM_MOUSELEAVEを無視するとして
ダイアログがあった場所から離れてもWM_MOUSELEAVEはこないようです。

>>308
透明ウィンドウにするという発想ですか。なるほど・・
半透明にもできたりしてそれはそれでよさそうです。

>>310
デスクトップのHWNDをSetCaptureに渡してみましたが、
渡さない場合と同じくWM_MOUSEMOVEがこないようです。。
ん〜、いけるような気はするのですが。
0312デフォルトの名無しさん2010/04/18(日) 19:27:25
>>310
それだとSetCaptureしたあとのマウスイベントがDesktopWindowの方に逝っちゃう
0313デフォルトの名無しさん2010/04/18(日) 19:36:54
とりあえずアイコン化(最小化)するっていう手もあるかもね
自分で戻さないといけないみたいだけど
0314デフォルトの名無しさん2010/04/19(月) 02:26:36
コントロールを透明化したら、下のコントロールじゃなくてデスクトップまで透けてしまった
0315デフォルトの名無しさん2010/04/19(月) 03:13:04
荒れてないときのWIN32スレはすごいぬ、天才ばっかりだぬ
0316デフォルトの名無しさん2010/04/19(月) 03:24:02
単純にタイマーでカーソル位置を監視ってのじゃ駄目かな…
0317デフォルトの名無しさん2010/04/19(月) 03:32:37
TrackMouseEvent で MOUSELEAVE は無視して MOUSEMOVE を見れば良いと思う
0318デフォルトの名無しさん2010/04/19(月) 07:08:01
TrackMouseEvent で WM_MOUSEMOVE はこないようです
0319デフォルトの名無しさん2010/04/19(月) 08:27:38
面倒だからフックしろよ
0320デフォルトの名無しさん2010/04/19(月) 10:17:08
フックだ、チンだ、あーらのびちゃった
03211182010/04/19(月) 14:06:18
>>320
↑
2ちゃんの画一的なコメント 乙
0322デフォルトの名無しさん2010/04/19(月) 14:49:52
DrawIconExでマウスカーソルを縮小してHDCに埋め込みたいんだが、
beamのアイコンがつぶれてしまう。
なんかいい方法ない?
0323デフォルトの名無しさん2010/04/19(月) 14:53:10
>HDCに埋め込みたい
関係無いけど、この表現に物凄い違和感

0324デフォルトの名無しさん2010/04/19(月) 17:52:12
塗り込みたい
03251182010/04/19(月) 18:15:19
ネトウヨうぜえ
03263042010/04/19(月) 20:23:25
>>316
一応その方法で行くことにしてうまく実現できました。

今回のやりたいことを実装してるツールがVectorにあったので、
Spy++で見てみるとそれもTimerでやってるみたいだったので
真似することにしました。
0327デフォルトの名無しさん2010/04/20(火) 16:17:39
ノートPCで現在AC電源か、バッテリーを使ってるかを識別できるAPIを教えてください
03281182010/04/20(火) 16:52:02
ノートPCかデスクトップを判別するAPIが無いから不可能
0329デフォルトの名無しさん2010/04/20(火) 16:57:10
http://www.microsoft.com/japan/whdc/system/pnppwr/wmi/wmi-acpi.mspx
0330デフォルトの名無しさん2010/04/20(火) 17:00:46
相変わらず糞の役にも立たないゴミ共だなww
GetSystemPowerStatusであっさり出来たわ役立たず共
03311182010/04/20(火) 17:25:45
>>330
おまえがな
0332デフォルトの名無しさん2010/04/20(火) 17:39:21
お前はアホー知恵袋でオナニーでもしてろゴミ
03331182010/04/20(火) 17:49:42
>>332
おまえがな
0334デフォルトの名無しさん2010/04/20(火) 18:38:04
何だか近頃無用のレスと自己主張をしていて他人を多少なりとも面倒くさい気持ちにさせるだけのために存在するんだろうと思わせる何かをよく見かけるが

それすら全くどうでもいい
0335デフォルトの名無しさん2010/04/20(火) 18:47:02
何てどうでもいいレス
0336デフォルトの名無しさん2010/04/20(火) 18:54:52
結局、質問スレに書き込んでも自己解決が一番最適な方法だ、というオチ。
他人に質問する前にテディベアに質問しなさい、てやつですな。
書き込んだ質問の内容でググればあっさり見つかったりするしね。
0337デフォルトの名無しさん2010/04/20(火) 18:57:13
質問です。

HeapAllocとかHeapFreeとかのフラグ、HEAP_NO_SERIALIZEの説明の「相互排他」って何ですか?
ググッた結果、マルチスレッドであちこちからメモリ確保するときに、何かしてくれる?と思うのですが、
その「何か」がよく分かりません。

>HEAP_NO_SERIALIZE:この関数がヒープにアクセスしている間、相互排他を行わないようにします。
 ↑この一文を分かりやすく解説してください。
03381182010/04/20(火) 19:40:01
>HEAP_NO_SERIALIZE:この関数が動的に確保した領域にアクセスしている間、他のスレッドからもアクセス可能になる。
0339デフォルトの名無しさん2010/04/20(火) 19:49:08
クリティカルセクションを使わない
0340デフォルトの名無しさん2010/04/20(火) 19:50:05
なんかところどころレスが空欄になってるんだが
0341デフォルトの名無しさん2010/04/20(火) 20:42:04
キチガイが居るだけだ
気にするな
03421182010/04/20(火) 20:48:34
↑
おまえがな
0343デフォルトの名無しさん2010/04/20(火) 21:00:50
「ファイルを開く」DLGでUNCなどのMAX_PATHを越える深いパスを扱えるようにするにはどうするのですか?
ちなみに cygwin を用いて深いディレクトリ、ファイルは生成できます・・・
0344デフォルトの名無しさん2010/04/21(水) 10:18:37
タスクマネージャーのプロセスシートに自作アプリを列挙させないようにするにはどうしたらいいですか?
0345デフォルトの名無しさん2010/04/21(水) 10:49:53
>>343
UNICODEで開発
>>344
ダイアログスタイルで開発
0346デフォルトの名無しさん2010/04/21(水) 11:03:34
>>344
MFCを使ってダイアログベースで作ってます。
0347デフォルトの名無しさん2010/04/21(水) 11:07:46
常駐プログラム隠蔽テクニック でぐぐる
0348デフォルトの名無しさん2010/04/21(水) 11:09:47
なんだ、結局しらねーんだw
0349デフォルトの名無しさん2010/04/21(水) 11:13:08
他所様のプロセスにインジェクションして寄生すれば
0350デフォルトの名無しさん2010/04/21(水) 13:01:02
>>345
>UNICODEで開発

343です。
当初私もそう思っていました。
UNICODE版のGetOpenFileNameWを使っているのですが、
開くDLG(コモンダイアログ)内部でMessageBoxを表示しているようです。
OFNHookProcも試したのですが、CDN_FILEOKが呼び出されません。
WndProc をHOOKして[OK]ボタンや[ファイル名DBLCLK]を横取りしないといけないのでしょうか?
0351デフォルトの名無しさん2010/04/21(水) 16:29:38
IPヘルパAPIでDOSコマンドのroute printで表示される
Persistent Routesリストの取得方法を教えてくださいください
0352デフォルトの名無しさん2010/04/21(水) 16:48:48
たぶん隠しAPIのAllocateAndGetIpForwardTableFromStackを使う
0353デフォルトの名無しさん2010/04/21(水) 17:02:10
ぐぐっても出てきません><
0354デフォルトの名無しさん2010/04/21(水) 17:02:42
regmonで見た限りではAPIではなくレジストリを直接読み書きしている模様
System\CurrentControlSet\Services\Tcpip\Parameters\PersistentRoutes
System\CurrentControlSet\Services\Vxd\MSTCP\PersistentRoutes
0355デフォルトの名無しさん2010/04/21(水) 17:10:51
>>354
ありがとうございます。
確かにレジストリに存在しました!
これを弄くり倒します。
0356デフォルトの名無しさん2010/04/21(水) 17:15:33
あ、そういやこれで確かにリストは取得できるけど
route add ができない><
いやレジストリに追加しただけでは実際にルート処理されないですよねこれ?
0357デフォルトの名無しさん2010/04/21(水) 17:20:53
ちなみにPersistentRoutesを検索してみたら3箇所でてきた。
んで>>354の2つ目のServicesの中にVxdは存在しませんですた。
とりあえず、レジストリエディタで適当にルートぶち込んでみっかなあ
0358デフォルトの名無しさん2010/04/21(水) 17:46:07
おっと!!!
そういやActiveアレには普通にaddできるんだから
レジストリに追加しといてヘルパapiでActiveにaddすりゃーいいってことか!!!
レジストリにかいときゃリブったらちゃんとアレされたのは確認できたし

いやはや>>354に感謝
0359デフォルトの名無しさん2010/04/21(水) 17:54:26
vxdはwindows98等
自分なら裏でroute.exeを実行する
0360デフォルトの名無しさん2010/04/21(水) 18:20:35
>>359
vxdありがとう。
ちなみに最初はShellExecuteでroute.exeを実行してaddやdeleteをやってたんだけど
ヘルパAPIなるものでActiveの操作は普通にできたからPersistentもいけるんじゃないかなとかおもって
深みにざっくり嵌ったわけですよ

ぶっちゃけレジストリ弄くるのも不本意なんだがAPIでできないっぽいからそこは曲げてアレ
0361デフォルトの名無しさん2010/04/21(水) 23:42:23
GDI+のImageクラスでbmpファイルを読み込み、
CreateCompatibleBitmapで作成した領域に描画して、
BitBltの背景色を利用して白黒の1bitモノクロ画像に変換しようとしたところ、
GDI+で読み込んだビットマップがうまく変換されませんでした。

ちなみにCreateCompatibleBitmapのところをCreateDIBSectionすると期待どうりに変換されるのは分かったのですが、
どうしてCreateCompatibleBitmapだと変換できないのかが理由が分かりませんでした。

言語はC++でMFCなどは使用していません。

理由が分かる方がいましたら教えてください。
0362デフォルトの名無しさん2010/04/22(木) 00:01:31
背景色指定が合っていないんじゃないか?
GetPixelで返ってきた実際の値を使わないと駄目、とかありそう。
素直にDIBSection使っといた方が良い気がするけど。
03633612010/04/22(木) 05:46:16
>>362
有難うございます。
GetPixelで取得した値を使用してみても駄目でした。
なぜCreateCompatibleBitmapだとSetBkColorで設定した色が変換されないのかが分からないままです。
0364デフォルトの名無しさん2010/04/22(木) 07:15:17
パレット
0365デフォルトの名無しさん2010/04/22(木) 10:35:43
パレット
0366デフォルトの名無しさん2010/04/22(木) 12:39:06
プディング
0367デフォルトの名無しさん2010/04/22(木) 12:57:16
パンナコッタ
0368デフォルトの名無しさん2010/04/22(木) 13:50:04
なんてこった
03691182010/04/22(木) 14:32:00
黙れゴミ共
03701182010/04/22(木) 14:33:04
>>368
>>367
爆笑、お前面白すぎ、
エンタに出てる芸人以上じゃね?
久々にわらかしてもらったわw
03711182010/04/22(木) 14:33:46
>>369
おまえがな
0372デフォルトの名無しさん2010/04/22(木) 15:02:55
どこに書いたらいいかと思ったけど、Windows系の質問なのでこちらにしました。
シリアルポート com1とかが他アプリから開いたイベントを取得したいのですがどうすればよろしいでしょうか?

案としては
CrateFile("com1" ・・・
で開いて閉じてを繰り返し開の失敗したら開かれてるとする。
 デメリット:ちょっとカッコ悪いし、もし開いて閉じる間に空いてが開こうとすると相手側がエラーになる
 
LoadLibraryのhook
 デメリット;comのオープン方法がCreateFileで開かれなかった場合。他にもAPIありますよね?

なんてのを考えてるんですが、他に良い案ないでしょうか?
0373デフォルトの名無しさん2010/04/22(木) 15:20:26
フィルタドライバを作成して、IRP_MJ_CREATEを捕まえる
0374デフォルトの名無しさん2010/04/22(木) 15:29:19
返答ありがとうございます。
フィルタドライバですか、経験なかったです。
調べてみるとちょっと敷居高そうですが、チャレンジしてみます。
ありがとうございました。
0375デフォルトの名無しさん2010/04/22(木) 15:52:04
RegEnumValueでキーの値を取得しているのですが
登録されている数分ループするのですが正常に値が取得できないのがあります。
4個登録されていてループは5回目で抜けるのでそこはOKなんですが
データも3個までは正常にとれてますが4個目は何故かNULLになっています。
どうしてですか?
0376デフォルトの名無しさん2010/04/22(木) 15:58:10
できましたおさわがせしましたごみすみませんどもでしたしね。
0377デフォルトの名無しさん2010/04/22(木) 17:39:34
おいおい、せっかくYahoo!知恵袋のアカウント変えたのにまだいるのか118もどき。
相変わらず118を名乗る理由がよくわからんがな。
03781182010/04/22(木) 17:48:52
↑
お前の発言ワケワカラン
0379デフォルトの名無しさん2010/04/22(木) 20:50:13
>>343
>>345
>>350
Given up
0380デフォルトの名無しさん2010/04/22(木) 21:58:23
>>378
んじゃいいや笑
まぁ見づらいからあんま無駄レスすんなよ。

以上無駄レスでした。
0381デフォルトの名無しさん2010/04/22(木) 22:09:49
UNICODE, _UNICODE指定でビルドすればいいんじゃないのん?
03821182010/04/22(木) 22:19:48
>>380
黙れゴミ
0383デフォルトの名無しさん2010/04/22(木) 22:57:50
    ヘ⌒ヽフ
   ( ・ω・) �d�d
   / ~つと)
03841182010/04/22(木) 23:05:49
www
03851182010/04/22(木) 23:12:21
VS2010もう入れた?
■ このスレッドは過去ログ倉庫に格納されています