■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

Win32API質問箱 Build38
251 名前:デフォルトの名無しさん :2005/12/11(日) 18:51:27
>末尾にAやWの付かない名前の関数名

名前はどうでもいい
実体が問題なんだろ

252 名前:デフォルトの名無しさん :2005/12/11(日) 18:55:24
>>251
名は体を表わす

253 名前:デフォルトの名無しさん :2005/12/11(日) 19:00:29
馬鹿なリンカなら「無い」とエラーメッセージだすだろうな

254 名前:デフォルトの名無しさん :2005/12/11(日) 19:36:16
もう一つ気になるのは、例えばアプリケーションを終了するときはWindowsから何のメッセ
ージが通知されるのかな。
WM_DESTROYメッセージと言えば否定されるのかな、0x0002が通知されるのだと主張される
のかも知れんな。


255 名前:デフォルトの名無しさん :2005/12/11(日) 19:45:08
>>224
ありがとう。

こういうのを見つけました。
http://www.vector.co.jp/soft/win95/util/se238740.html

ただ、私の使いがってには合いませんでした。
教えてもらった情報でソフトを作っても同じ使い勝手になりそうです。
やはり、ダイアログのデフォルトを変える方法のほうがよさそうだけど困ったな。
該当のレジストリもなかなか見つけられないです。

256 名前:デフォルトの名無しさん :2005/12/11(日) 19:47:30
なんかどっちにしても>>172の質問は意味がわからなかったけどなぁ。
後問題はWin32固有の問題ではないわけよね?

257 名前:デフォルトの名無しさん :2005/12/11(日) 19:49:25

処理中にOSをシャットダウンされると困る部分があるのでOnQueryEndSession
にて終了処理を受け取っていますが、ここで再起動を選択されたのか、それとも
シャットダウンを選択されたのか判別する方法ってありますか?



ログオフかどうかなら lParam で分かりますが
求めているのはそれではないんですよね?

無理矢理ですが、DLL を他プロセスに注入して
ExitWindowsEx や InitiateSystemShutdownEx 等を
フックするというのはどうでしょうか?
実際に可能かどうかは分かりませんが。



調べれば調べるほど無理っぽい感じがしてきました・・・
>>114さんのレジストリをヒントに、OnQueryEndSession中でレジストリを
取得して保存しとけば差分で調査できるかもと思ったので
明日にでもOnQueryEndSession時にレジストリが変更されてないか
調査してみます。もし分かったら書き込みますね。
112さん、114さん、ありがとうございました。



258 名前:デフォルトの名無しさん :2005/12/11(日) 19:50:16
Windows 2000 ですが、実際にやって調べてみました。
HKCR\Software\Microsoft\Windows\CurrentVersion\Explorer
の Reason Setting と Shutdown Setting が変化するようです。
(どちらも DWORD 値)

シャットダウン
 Shutdown Setting=0x00000002
 Reason Setting=0x00000005
再起動
 Shutdown Setting=0x00000004
 Reason Setting=0x00000005
ログオフ
 Shutdown Setting=0x00000001
 Reason Setting=0x00000000

ちなみに、regmon という
レジストリ操作を監視するツールを使って調べました。

HKCR\Software\Microsoft\Windows\CurrentVersion\Explorer
Shutdown SettingとReason Settingのキーは無いようです。

HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer
には存在していましたので、こちらで試しています。

OSのシャットダウン時の処理なので、ちゃんと動くまで再起動しまくって
いるので時間かかるー(笑)

キーさえ分かればきっと情報があるはずだ、ということで検索してみた。
ttp://www.microsoft.com/windows2000/techinfo/reskit/en-us/regentry/36031.asp
これによると Shutdown Setting はあくまでダイアログでの選択値のようっす。
Reason Setting の方は見つからず。


259 名前:デフォルトの名無しさん :2005/12/11(日) 19:54:07
>>255

>>257-258 は過去ログのコピペです

260 名前:デフォルトの名無しさん :2005/12/11(日) 20:31:11
>>255
どうでもいいが、そのリンク先に気になるものがあるんだが

261 名前:デフォルトの名無しさん :2005/12/11(日) 21:01:43
>>260
何?

262 名前:デフォルトの名無しさん :2005/12/11(日) 21:06:06
さっきはエロゲーの宣伝が出てた

263 名前:デフォルトの名無しさん :2005/12/11(日) 21:57:53
もう見てないかもしれんが

>>170
つ ExecWB
ttp://www.k-nextage.co.jp/ame/soft/wfc/#WB_CLIP

264 名前:デフォルトの名無しさん :2005/12/11(日) 23:10:21
>>257
シャットダウンされたら困るのに再起動されても困らないの?

265 名前:デフォルトの名無しさん :2005/12/12(月) 00:42:09
>>241
> 否定する奴は、何て呼び方をしてるんだ?

総称で呼ぶ機会もないし、
今後も総称で呼ぶ機会が出てくる気配もない。
あえて言うならデータ型で事足りる。
君らが言う「Win32のデータ型」をわざわざ区別する必要性も感じない。


個別にdefineやtypedefされているので、
そのdefine名やtypedef名で呼ぶ機会は多々あったし、
これからもその機会は多々あるだろう。

266 名前:デフォルトの名無しさん :2005/12/12(月) 00:48:24
>>265
すでに定義されてるものと被らないようにしてね。
って会話の流れならWin32のデータ型って使うけどね。
特別win32に限定するものじゃないと呼ばないかもな。

でも、あんまこだわるところじゃないよ。
もうレスの概要は伝わったんだし、粘着にもほどがあるよ。
ホント、この掲示板なんでこんな奴増えたんだろ。

267 名前:デフォルトの名無しさん :2005/12/12(月) 01:00:57
>>266
なんかの病気なんじゃないの?>265

268 名前:デフォルトの名無しさん :2005/12/12(月) 09:31:24
ツールバーのボタンに描くビットマップが
透過されたりされなかったりしますが、
その条件、法則はなんなんでしょうか。

実験した範囲では、VC、BCCで、外部に置くと、
16色の場合、黒(パレット0かも)が透過され、
リソースに含むと透過されませんでした。

269 名前:デフォルトの名無しさん :2005/12/12(月) 10:57:24
対象となるウィンドウ領域に
マウスポインタが外から入ってきたときの
イベントに対する処理をしたいのですが
いくら調べてもそれらしきメッセージがありません

似たものとしては WM_SETFOCUS というのがあり,
これはウィンドウ領域がクリックされたときに来るメッセージですが
やりたいのはクリックしなくてもポインタが入っただけで
来るメッセージです

270 名前:デフォルトの名無しさん :2005/12/12(月) 10:59:44
>>269
つ WM_MOUSEHOVER

271 名前:デフォルトの名無しさん :2005/12/12(月) 13:04:14
GetMessageではなくPeekMessageを使ったメッセージループで、
常にメインウィンドウにInvalidateRectを送り続け、
画面を更新し続けるプログラムを作っているのですが、
ウィンドウのタイトルバーをマウスでドラッグ&ドロップしている最中に
クライアント領域が更新されません。

デバッグ出力等を見る限り、ドラッグ&ドロップ中も
InvalidateRectの発行も、WM_PAINT受信によるクライアント領域の更新も行われているはずなのですが、
ドラッグ中はドラッグ開始直前の絵のままで、
ドロップ後に突如絵が変わるという状態になってしまっています。

ウィンドウのドラッグ&ドロップ中にクライアント領域を実際に書き換える方法はないのでしょうか?

272 名前:デフォルトの名無しさん :2005/12/12(月) 13:18:18
PeekMessageで?

273 名前:デフォルトの名無しさん :2005/12/12(月) 13:47:35
そもそもInvalidateRectし続けるくらいなら、メッセージループから
直接描画した方がいいと思うけどな。
ただ、それだとドラッグ中に描画されないのは解消されないが。

一番いいのはマルチスレッド化して、画面の更新とメッセージループを
別のスレッドにする方法。

もう1つはあまり薦めないが、SetTimerを使って画面を更新する方法。
ただしこれはドラッグ中は更新されるが、タイトルバーをクリックしたまま
全くマウスを動かさないでいると更新されない。

274 名前:デフォルトの名無しさん :2005/12/12(月) 13:57:02
>>271
ドラッグ中はシステム側のメッセージループが回ってるはずで
>InvalidateRectの発行も
はありえないはずなんだが。

275 名前:デフォルトの名無しさん :2005/12/12(月) 14:57:54
>>271
Windowsの画面のプロパティで、

 「ドラッグ中にウィンドウの内容を表示する」

にチェック付ければいいんジャマイカ?

276 名前:デフォルトの名無しさん :2005/12/12(月) 18:50:25
ドライブの情報を取得するときにUSBの外付けHDDとかを認識する方法はありますか?

277 名前:デフォルトの名無しさん :2005/12/12(月) 18:58:07
GetDriveType()ではダメですか?

278 名前:デフォルトの名無しさん :2005/12/12(月) 19:38:49
デバイスコンテキストの質問です
2枚のbitmap画像をそれぞれ読み込んで2枚の画像同士を重ね合わせてする出力が上手くいきません
最初のBitBlt()関数の画像だけしか表示されない状態で困っています
すみませんが知恵を貸して下さい

BitBlt(hdc, 130, 28, w, h, hdc_mem, 0, 0, SRCCOPY);
BitBlt(hdc2, 0, 0, w, h, hdc_mem2, 0, 0, SRCCOPY);


279 名前:デフォルトの名無しさん :2005/12/12(月) 19:43:48
コピー先のメモリデバイスコンテキストへ、扱える画像は一枚だけなのかな・・・

280 名前:デフォルトの名無しさん :2005/12/12(月) 19:47:03
そりゃコピー先が違えば表示されないだろうな

281 名前:278 :2005/12/12(月) 20:02:10
>>280
コピー先を同じに変えて、上手く重ね合わせることができました

有難う御座いました

282 名前:デフォルトの名無しさん :2005/12/12(月) 20:05:52
釣りじゃなかったのか。平和だな。

283 名前:デフォルトの名無しさん :2005/12/12(月) 20:41:18
質問です
SHELLで同期とる方法教えて下さい

284 名前:デフォルトの名無しさん :2005/12/12(月) 22:07:48
>>283
しぇるでどうきとる

しぇるでどうきとる

だじゃれができそうです。
ちょっと待ってて。

285 名前:デフォルトの名無しさん :2005/12/12(月) 22:16:10
>>283
昭和シェル石油のガソリンスタンドで待ちあわせすればOK。
くれぐれも他の客の邪魔にならない場所に陣取ること。

286 名前:デフォルトの名無しさん :2005/12/12(月) 22:29:43
変な嵐がいるから他スレで聞いたほうがいい

287 名前:276 :2005/12/12(月) 22:31:05
>>277
GetDriveTypeをつかうと固定でもUSBでもHDDなら同じ値が帰ってくるのです・・

288 名前:デフォルトの名無しさん :2005/12/12(月) 23:11:37
猫でもわかるwindowsプログラミング買ったけど
著者のホームページ見に行ったら少し欝になった
本より詳しく書いてるじゃん

289 名前:デフォルトの名無しさん :2005/12/12(月) 23:19:13
>>288
で、質問は何?

290 名前:デフォルトの名無しさん :2005/12/13(火) 01:53:24
>>288
http://pc8.2ch.net/test/read.cgi/tech/1118944895/

291 名前:271 :2005/12/13(火) 10:17:41
家のIPが規制されてて2chに書けない...

>>272 そうです。PeekMessageで
>>273 やはりGetDCして描画すべきでしょうか
>>274
どうやら私の勘違いで仰るとおりだった模様です。
今、WM_NCLBUTTONDOWNでDefWindowProcに処理を渡さずに
SetCaptureでカーソルのキャプチャを開始し、WM_MOUSEMOVEで
ウィンドウを移動、WM_LBUTTONUPでReleaseCaptureするようにしたら、
望んでいた動作をさせることができました。
ありがとうございます。

>>275 付いている状態で、ですね。

というわけで、ウィンドウ移動時の問題は解決しました。
ありがとうございました。

292 名前:271 :2005/12/13(火) 10:28:15
>>291で以前の問題は解決したのですが、
また別の問題が発生しました。

タイトルバー等で右クリックした時にも動作が止まってしまいます。
どうやら何らかのメッセージをDefWindowProcに渡すと
TrackPopupMenuか何かを内部で呼び出すようです。
試しにWM_NCRBUTTONDOWNでDefWindowProcを呼び出さないようにすると、
システムメニューそのものが表示されなくなったのですが、
タスクバーで右クリックするとタスクバー上にシステムメニューが表示され、
やはり動作が止まってしまうので、WM_NCRBUTTONDOWNでDefWindowProcを呼び出すことが
直接の原因ではないかもしれません。

一応試しにWM_NCRBUTTONDOWNで
UINT uItem = TrackPopupMenu(GetSystemMenu(hWnd, FALSE), TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, pt.x, pt.y, 0, hWnd, NULL)
こんな風にしてみると、標準の動作に近くなったのですが、
TrackPopupMenu内部でメッセージループが回るようで、
自分が作ったメッセージループには処理が戻ってきません。

標準動作に近い形で、常に自分のメッセージループに処理を戻したいのですが、
いい方法はありますか?

TrackPopupMenu以外の方法でHMENUをポップアップ表示できれば、
後は自分で似た動作を作りこむことができそうなのですが、
その方法も解りません。

293 名前:デフォルトの名無しさん :2005/12/13(火) 14:46:08
>>292
メニュループなんかは、システムが内部で持ってるので、それ使わせず、
自前のループに戻す方法はないと思う。
ただ、システム内部のメッセージループはAPCの処理はしてくれた記憶があるので、
別スレッドで適当にSleepしながらループまわして、画面更新をAPC経由で呼び出せば
いいと思う。
APCじゃなくて、直接呼ぶのはアウト。

294 名前:デフォルトの名無しさん :2005/12/13(火) 16:04:40
友達に今時Win32API勉強しても何のメリットもないと言われた
実際どうなの?

295 名前:デフォルトの名無しさん :2005/12/13(火) 16:08:36
とても役に立つがビジネスで考えるなら意味はない。
ソフト開発しても大変だから。

296 名前:デフォルトの名無しさん :2005/12/13(火) 16:28:05
>>293
なるほどメニューはどうやっても自前のループ内では使えないのですね
ところでAPCって何ですか?

297 名前:デフォルトの名無しさん :2005/12/13(火) 16:57:20
検索できない奴は猿以下だと思う

298 名前:デフォルトの名無しさん :2005/12/13(火) 17:07:03
>>297
http://www.google.co.jp/search?hl=ja&inlang=ja&ie=Shift_JIS&oe=Shift_JIS&q=apc&lr=
http://www.google.co.jp/search?hl=ja&inlang=ja&ie=Shift_JIS&oe=Shift_JIS&q=apc+windows&lr=

299 名前:デフォルトの名無しさん :2005/12/13(火) 17:08:10
「APC Win32」とか思いつかん?

300 名前:デフォルトの名無しさん :2005/12/13(火) 17:14:07
>>299
ごめんなさいWin16でした

301 名前:デフォルトの名無しさん :2005/12/13(火) 17:17:37
スレタイ読めない奴はミジンコ以下だと思う

302 名前:アメーバ :2005/12/13(火) 17:25:08
じゃあスレタイを読める私は何者?

303 名前:デフォルトの名無しさん :2005/12/13(火) 17:42:13
>>302
http://b.hatena.ne.jp/youpy/

304 名前:デフォルトの名無しさん :2005/12/13(火) 18:48:03
流れを読めない奴はどうみても精子です
本当にありがとうございました

305 名前:デフォルトの名無しさん :2005/12/14(水) 00:07:51
>>288
猫サイトは参考にする分には良いが、あれで勉強しようと言うのは無謀。

306 名前:デフォルトの名無しさん :2005/12/14(水) 05:53:06
CreateFont系以外にフォントを作成(もしくは指定)できるAPIとかありませんかね?

307 名前:デフォルトの名無しさん :2005/12/14(水) 09:46:23
何がしたいからCreateFontじゃだめなの?

308 名前:デフォルトの名無しさん :2005/12/14(水) 09:58:14
>>306
何がしたい?

309 名前:271 :2005/12/14(水) 10:09:34
こんな感じで希望していた動作に近くなりました。

HMENU hMenu = GetSystemMenu(hWnd, FALSE);
MENUINFO mi;
memset(&mi, 0x00, sizeof(mi));
mi.cbSize = sizeof(mi);
mi.fMask = MIM_STYLE;
GetMenuInfo(hMenu, &mi);
mi.dwStyle |= MNS_MODELESS;
SetMenuInfo(hMenu, &mi);

ただこれだけだと
タスクバーで右クリックされた時などに変な動作になります
PeekMessageで受信しているのにこちらが把握している
ウィンドウのWndProcに来ていないメッセージがあるので
それらはメニューのWndProcで処理されているようですね
このあたりを詳しく調べるともう少しちゃんとした動作にできるかもしれません

310 名前:デフォルトの名無しさん :2005/12/14(水) 12:40:04
>>309
どんどん悪い方向に向かっている悪寒

311 名前:デフォルトの名無しさん :2005/12/14(水) 13:09:56
タイマやスレッドを使わない理由を知りたい

312 名前:デフォルトの名無しさん :2005/12/14(水) 13:30:52
ヒント:使えない

313 名前:デフォルトの名無しさん :2005/12/14(水) 15:20:11
>>306
ChooseFont, SystemParametersInfo + CreateFontIndirect
ってこと?

314 名前:デフォルトの名無しさん :2005/12/14(水) 16:38:06
HSPみたいに、プログラム上で実行ファイルを作成させるにはどうすればいい?

315 名前:デフォルトの名無しさん :2005/12/14(水) 16:44:52
exeを複製して、終端にデータを追記する。

316 名前:デフォルトの名無しさん :2005/12/14(水) 18:42:44
WinINETについて質問です。
IEがオフラインモードの時には、なぜかInternetReadFileすると
キャッシュを取得してしまうのですが、オフラインモードを
オンラインモードに変更するAPIはありませんか?

InternetGoOnlineのようにダイアログが出てユーザーに選択させる
形式でなく、こちらで強制的に変更する方法または、ダイアログ
自体をこちらで設定できるようなものを出来ればお願いします。


317 名前:デフォルトの名無しさん :2005/12/14(水) 20:01:56
>>316
そんなものがあったらセキュリティ上問題があるとは思わないかい?

318 名前:デフォルトの名無しさん :2005/12/14(水) 20:07:18
>>316はアンチMSを叫ぶ自称・玄人になる素質がある。
生暖かく見守ってやれ、お前ら。

319 名前:デフォルトの名無しさん :2005/12/14(水) 20:43:04
>>317 ( ゚д゚)ポカーン

IWebBrowser2::put_Offline()

320 名前:デフォルトの名無しさん :2005/12/14(水) 21:00:53
>>319
質問の意味が違うんじゃないか?

321 名前:デフォルトの名無しさん :2005/12/14(水) 21:05:04
InternetOpenの引数で設定できなかったっけ?

322 名前:デフォルトの名無しさん :2005/12/14(水) 21:16:01
>>319
オマエに返すよ(゚д゚)っ「( ゚д゚)ポカーン」

323 名前:デフォルトの名無しさん :2005/12/14(水) 21:50:07
322
逆切れはよくないね

324 名前:デフォルトの名無しさん :2005/12/15(木) 00:09:43
プロセスハンドルから、そのプログラムのファイル名を得るにはどうすればいいのでしょうか?
GetModuleFileName()かと思いましたが、常に失敗してしまいます。

325 名前:デフォルトの名無しさん :2005/12/15(木) 00:26:23
GetModuleFileNameであってるが、GetModuleFileNameの引数はプロセスハンドルではない

326 名前:デフォルトの名無しさん :2005/12/15(木) 00:32:44
http://techtips.belution.com/contribute.cgi?lang=ja&cat=vc&id=0022

327 名前:デフォルトの名無しさん :2005/12/15(木) 00:36:15
>>259

ありがとう。それを元にやっていみます。
ありがとう。ありがとう。ありがとう。

328 名前:デフォルトの名無しさん :2005/12/15(木) 01:44:52
>>324
HDDの肥やし発掘してみた
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processID);
pEnumProcessModules(hProcess, &hModule, sizeof(hModule), NULL);
pGetModuleFileNameEx(hProcess, hModule, _exePath, sizeof(_exePath));
exePath = _exePath;
CloseHandle(hProcess);


329 名前:デフォルトの名無しさん :2005/12/15(木) 09:11:44
>>328
ありがとうございます
psapi.hやlibやdllが見つからず苦労しましたがなんとかなりました
あと、自分が作ったプロセスIDのものしか見れないんでしょうか?

330 名前:デフォルトの名無しさん :2005/12/15(木) 10:05:30
IEコンポーネントでスクリプトエラーが出た時にエラーダイアログを表示しないようにするにはどうしたらいいでしょうか?

331 名前:デフォルトの名無しさん :2005/12/15(木) 10:39:19
質問です。
VisualStudio6.0でダイアログを作ってDialog()で表示しています。

このメインダイアログに、他に作ったサブダイアログを貼り付けたいのですが
Dialog()は呼んだ瞬間にそこで処理が一旦止められてしまうので思っているものと違いますし、x,y座標が指定できないあたり私の用途では使わないものかと思われます。

どんなことがやりたいかというと、例えばメインダイアログでボタンを押すたびに、
対応したサブダイアログボックス(様々なエディットコントロールや、ボタンが張り付いているもの)をメインダイアログに貼り付けたいのです。

サブダイアログは境界線を「しない」にしているため、ユーザーからは「メインダイアログ上のボタンなど、再配置された」ように見えると思います。


332 名前:デフォルトの名無しさん :2005/12/15(木) 10:45:53
すいません。自己解決しました。
CreateDialogを使うんですね。猫プロのダイアログ関係を読んでて見落としたようです。
もう一回確認したら発見できました。

333 名前:デフォルトの名無しさん :2005/12/15(木) 12:06:20
333

334 名前:デフォルトの名無しさん :2005/12/15(木) 12:08:02
>>331
んで、メインダイアログを移動したらどうなる?

335 名前:デフォルトの名無しさん :2005/12/15(木) 12:45:08
>>334
(つД`)サブだけ動かないぃぃ
メインのWM_MOVEを捕まえて、サブの位置も移動させるようにしました。

普通のウインドウをメインダイアログにはっつけたのは、きちんとメインと一緒に移動してくれるのになぁ…。

336 名前:デフォルトの名無しさん :2005/12/15(木) 13:00:40
>>335
直接貼り付けろよ

337 名前:デフォルトの名無しさん :2005/12/15(木) 13:06:20
>>336
すいません。直接貼り付けるというのは
・CreateDialog ではないAPIを使う
・VSのリソースエディタで、ダイアログにダイアログを貼り付ける方法がある
のどちらでしょうか。

338 名前:デフォルトの名無しさん :2005/12/15(木) 13:14:25
Parent/Clientにするってことじゃないの?

339 名前:デフォルトの名無しさん :2005/12/15(木) 13:15:15
素直にタブ使った方が良くね?

340 名前:デフォルトの名無しさん :2005/12/15(木) 13:27:34
フレームを変えるだけ

341 名前:デフォルトの名無しさん :2005/12/15(木) 13:45:45
ReBarを作ったのですが、ウィンドウをリサイズすると結構ちらつきます。
IEとかのReBarはあまりちらつきませんが、それはどうやるのですか?

342 名前:デフォルトの名無しさん :2005/12/15(木) 13:48:26
Regionを駆使して必要な部分だけ書き換える

343 名前:デフォルトの名無しさん :2005/12/15(木) 14:05:45
>>338
子供のダイアログのスタイルは「チャイルド」になってますし、
CreateDialogでも親ウインドウのHWND指定してるんですけどダメなんですよ。

座標系は、ちゃんと子供のそれになってるんですけど。

>>339
ゲームなのでタブはちょっと。

344 名前:デフォルトの名無しさん :2005/12/15(木) 14:09:51
>>338
スタイルの「コントロール」を指定したら、うまく行きました。

VSでダイアログ編集はきつい(;´Д`)

345 名前:デフォルトの名無しさん :2005/12/15(木) 14:11:37
ダイアログのことやってるんで便乗質問。
VCのダイアログ編集に普通のウインドウを貼り付けたいんだけど、どのコントロールですか?
C#だとウインドウってのがあったような気がするけど、VCだと見つからない。
ピクチャーボックスはなんだか違いそうだし…

346 名前:デフォルトの名無しさん :2005/12/15(木) 14:16:41
ゲームなら頑張って自前で描画するとか(ぉぃ

347 名前:デフォルトの名無しさん :2005/12/15(木) 14:18:06
>>345
MFCなら自前でやるしか。

348 名前:デフォルトの名無しさん :2005/12/15(木) 14:52:14
>>347
自前かぁ…。C#で作ろうかな(苦笑い

349 名前:デフォルトの名無しさん :2005/12/15(木) 14:56:55
>>348
あんま知らないけど
C#って.netないと動かないんだろ?

350 名前:デフォルトの名無しさん :2005/12/15(木) 16:23:14
CreateProcess,CreatePipeでコンソールアプリBを呼ぶWindowアプリAを作っています。

Bをコマンドプロンプトから呼ぶとき、
B options < data.dat
こういう記述になります。
そのときにパスワードが必要な場合はコンソールから入力できます。

これをAから呼び出してパイプでデータを流した場合は、
入力に対して空でEnterを押したような挙動になってしまいます。

Bが入力不要になるオプションの場合は問題なく動いていますが、
入力が必要な場合にもうまく呼ぶ方法は無いものでしょうか?



351 名前:デフォルトの名無しさん :2005/12/15(木) 16:29:06
>>350
素朴な疑問だが、 cat data.dat | B options とするとどうなるの?
#あ、catがないならtypeで。

352 名前:デフォルトの名無しさん :2005/12/15(木) 16:57:41
以前ソースが公開されたDVDProjectをVC6Proでコンパイルしようとしてますが、
LINK : fatal error LNK1104: ファイル "libmmt.lib" を開けません。
というエラーが出ます。

プロジェクトの設定を見ても、ソースを全部検索しても、libmmt.libなる
ものは見つけられません。

このような場合どうすればいいのでしょうか?
お願いします。

353 名前:デフォルトの名無しさん :2005/12/15(木) 17:03:43
>>352
スレ違い。
そのlibmmt.libはもしかしたらこれから生成しようとしているライブラリジャマイカ?
まさか、CDなどの書き込めないメディア上でコンパイルしようとはしてないだろうな。

354 名前:デフォルトの名無しさん :2005/12/15(木) 17:03:57
>>343
WS_OVERLAPPED

355 名前:デフォルトの名無しさん :2005/12/15(木) 17:07:27
コンソールウィンドウの表示
デバッグ時に引数の値などをチェックする時にMFCならTRACE、
Win32ならOutputDebugStringなどを使うでしょうが
printfのような入出力関数を使いたい場合は
コンソールウィンドウを表示すれば出来ます。


#include <io.h>
#include <fcntl.h>

void OpenConsole()
{
int hCrt, i;
FILE *hf;

AllocConsole();
hCrt = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
hf = _fdopen(hCrt, "w");
*stdout = *hf;
i = setvbuf(stdout, NULL, _IONBF, 0);
}

終了時に解放してください。


FreeConsole();

結構重宝すると思います。


356 名前:352 :2005/12/15(木) 17:11:38
すれ違いすいません。

>>353
プロジェクトは1つしかないので、これから生成するということはないと思います。

357 名前:デフォルトの名無しさん :2005/12/15(木) 17:14:37
#include<windows.h>
#include<stdio.h>
intmain(int ac, char **av)
{
HANDLEhSTDIN;
DWORDwfso;
setvbuf(stdin, NULL, _IONBF, 0);
hSTDIN = GetStdHandle(STD_INPUT_HANDLE);
FlushConsoleInputBuffer(hSTDIN);
wfso = WaitForSingleObject(hSTDIN, 3000);
if(wfso == WAIT_OBJECT_0){
intkey = 0;
DWORDbr;
while(ReadFile(hSTDIN, &key, 1, &br, NULL)){
if(br){
printf("signal [%c][%08X]\n", key, key);
}
}
}else{
printf("no signal\n");
}
return0;
}

358 名前:デフォルトの名無しさん :2005/12/15(木) 17:35:38
>>356
libmmt.libでぐぐればでてくるけど、ICCが必要なんじゃないの?

359 名前:デフォルトの名無しさん :2005/12/15(木) 17:42:11
>>351
それは同じ結果になります。
< でリダイレクトするのってわかりにくいですか?


360 名前:デフォルトの名無しさん :2005/12/15(木) 17:43:36
あるイベントがシグナル状態になるのを待つには
WaitForSingleObject() すればいいですが,
非シグナル状態になるのを待つ方法はありませんか?

361 名前:351 :2005/12/15(木) 17:51:34
いや、標準入力以外からパスワードを入力しているんだろうなぁと思って確認したかっただけ。

362 名前:デフォルトの名無しさん :2005/12/15(木) 17:55:06
#include<windows.h>
#include<stdio.h>

intmain(int ac, char **av)
{
HANDLEhSTDIN;
DWORDwfso;

setvbuf(stdin, NULL, _IONBF, 0);

hSTDIN = GetStdHandle(STD_INPUT_HANDLE);
FlushConsoleInputBuffer(hSTDIN);

wfso = WaitForSingleObject(hSTDIN, 3000);
if(wfso == WAIT_OBJECT_0){
while(!feof(stdin)){
intkey = fgetc(stdin);
printf("signal [%c][%08X]\n", key, key);
}
}else{
printf("no signal\n");
}

return0;
}


363 名前:デフォルトの名無しさん :2005/12/15(木) 17:55:48
#include<windows.h>
#include<stdio.h>

intmain(int ac, char **av)
{
HANDLEhSTDIN;
DWORDwfso;

setvbuf(stdin, NULL, _IONBF, 0);

hSTDIN = GetStdHandle(STD_INPUT_HANDLE);
FlushConsoleInputBuffer(hSTDIN);

wfso = WaitForSingleObject(hSTDIN, 3000);
if(wfso == WAIT_OBJECT_0){
INPUT_RECORDir;
DWORDer;
while(ReadConsoleInput(hSTDIN, &ir, 1, &er)){
if(er && (ir.EventType == KEY_EVENT)){
KEY_EVENT_RECORDker = ir.Event.KeyEvent;
printf("signal [%08X][%08X]\n",
ker.wVirtualKeyCode, ker.wVirtualScanCode);
}
}
}else{
printf("no signal\n");
}

return0;
}


364 名前:デフォルトの名無しさん :2005/12/15(木) 20:22:35
>360
while(signal){
Sleep(100);
}

365 名前:デフォルトの名無しさん :2005/12/15(木) 21:11:02
教えて頂きたいことがあります
GetAsyncKeyState('Y') や GetAsyncKeyState(VK_LSHIFT) などはうまくいくのですが
GetAsyncKeyState(VK_SEMICOLON) や GetAsyncKeyState(VK_COMMA) では
「定義されていない識別子」とエラーが出ます。 「;」 「,」を表現する方法は他にありますか。

366 名前:デフォルトの名無しさん :2005/12/15(木) 21:15:24
とりあえずWINUSER.hくらいはみてもバチ当たらんぞ。

VK_OEM_1 0xBA // ';:' for US
VK_OEM_PLUS 0xBB // '+' any country
VK_OEM_COMMA 0xBC // ',' any country
VK_OEM_MINUS 0xBD // '-' any country
VK_OEM_PERIOD 0xBE // '.' any country
VK_OEM_2 0xBF // '/?' for US
VK_OEM_3 0xC0 // '`~' for US
VK_OEM_4 0xDB // '[{' for US
VK_OEM_5 0xDC // '\|' for US
VK_OEM_6 0xDD // ']}' for US
VK_OEM_7 0xDE // ''"' for US

367 名前:デフォルトの名無しさん :2005/12/15(木) 21:29:41
!! >>366 神様ありがとぉ

368 名前:デフォルトの名無しさん :2005/12/15(木) 21:45:46
あれ・・・ 「,」のばあい 0xBC で行けるのですが 「;」のばあい 0xBAでだめです・・・
どうすればいいのでしょうか・・・ 教えてくんになってしまい申し訳ないです。

369 名前:デフォルトの名無しさん :2005/12/15(木) 21:57:32
かいけつしました。
 「;」の場合は 0xBB のようですね。 どうもありがとうございました。

370 名前:デフォルトの名無しさん :2005/12/15(木) 22:05:04
それらのキーは、他の言語のキーボードではシフトコードだったりするので注意

371 名前:350 :2005/12/15(木) 22:10:50
>>361
そこがよくわからないところで、
type data.dat | B options
だろうと、
B options < data.dat
だろうと、
パスワード入力で止まったらコンソールから入力できました。

せめて、Bが入力待ちになったらAからそこに入力できれば良いんですけどね。
あらかじめ流すデータじゃなくて。


372 名前:デフォルトの名無しさん :2005/12/15(木) 22:10:52
だからこそfor USなどと書かれているわけだが。

373 名前:デフォルトの名無しさん :2005/12/15(木) 22:26:31
初心者的質問で申し訳ないのですが、ご教授下さると助かります。
複数行対応エディットボックスに文字をセットした時の問題です。

HWND hEdit;
char str[64]="123\n456";
hEdit = CreateWindow("EDIT",NULL,〜中略〜, NULL);
SendMessage(hEdit,WM_SETTEXT,0, (LPARAM) str);
MessageBox(NULL,str,"test",MB_OK);

このようにするとメッセージボックスでは
123
456
と改行されて表示されますが、エディットボックスには改行\n(0D0A)が(0A)となってしまい改行されません。
何が悪いのでしょうか?

374 名前:デフォルトの名無しさん :2005/12/15(木) 22:28:07
>>373
\r\n

375 名前:デフォルトの名無しさん :2005/12/15(木) 22:30:40
>>373
'\n'はlfのみです。きちんと"\r\n"としましょう。
#メッセージボックスが改行する理由? 知るかい。

376 名前:デフォルトの名無しさん :2005/12/15(木) 22:37:41
IEコンポーネントでスクリプトエラーが出た時にエラーダイアログを表示しないようにするにはどうしたらいいでしょうか?

377 名前:デフォルトの名無しさん :2005/12/15(木) 23:03:04
Donutのソースを読む

378 名前:デフォルトの名無しさん :2005/12/15(木) 23:26:42
ReadMe や Help に

 このソフトウェアが表示するエラーダイアログは馬鹿な人にしか見えません。

と記しておく。

379 名前:デフォルトの名無しさん :2005/12/15(木) 23:27:21
Bread and Butter みたいなもん?

380 名前:373 :2005/12/16(金) 00:04:17
>>374-375
ありがとうございます。おかげさまで解決いたしました。
メッセージボックスでは改行されている理由は・・・・調べてみましたがよくわかりません。

ファイルをテキストモードで開く、バイナリモードで開くといった時、LFが自動的にCR+LFに変換されるのような仕様でしょうか?
きっと私がprintfでCarriage Returnなしでも大丈夫なコンパイラに毒されているんですね。

381 名前:デフォルトの名無しさん :2005/12/16(金) 00:14:20
>>380
いや、「printfは\nで改行する」は正しい。
> ファイルを…
これは正しい。

382 名前:デフォルトの名無しさん :2005/12/16(金) 01:47:03
>>371
パスワードはUIから入れないとアカン場合があるみたいですよね。
方法はあるのかもしれないけど。
runas で気づいたんだったかな。

関係あるかどうかわからないけど、
CredUICmdLinePromptForCredentials とかいう長い名前の
関数もあるみたいで。

383 名前:デフォルトの名無しさん :2005/12/16(金) 05:04:47
>>372
MapVirtualKeyを使えでFA?

384 名前:デフォルトの名無しさん :2005/12/16(金) 06:56:57
過去ログでこんなのあった
参考リンク
http://www.geocities.jp/monalipse/c/api/Console.html
のやり方で自分でコンソールとやり取りするのは大変・・・なのでよかったらこれドゾー
// MapVirtualKey用
#include <windows.h>
// getch or getche用
#include <conio.h>
int my_getch(void)
{
unsigned char c = _getch();
if(c != 0 && c != 0xe0) return -1;
c = _getch();
return (int)::MapVirtualKey((UINT)c, 1);
}
getchがスキャンコードを返してきたときだけ仮想キーコードにして返す関数でつ。
普通の'a'とか'1'なんかだと-1が返ってきまつ。
ちなみに矢印キーとかの仮想キーコードはこれ。
VK_PRIOR(PageUp) -> 0x21
VK_NEXT(PageDown) -> 0x22
VK_END -> 0x23
VK_HOME -> 0x24
VK_LEFT -> 0x25
VK_UP -> 0x26
VK_RIGHT -> 0x27
VK_DOWN -> 0x28
あと、MapVirtualKeyはuser32.dllに入ってるのでuser32.libのリンクをお忘れなく。
VC使ってるならこんな感じ。他はシラネ。
cl test.cpp -link user32.lib
これならWinAPIのMapVirtualKey一つ使うだけなんでAllocConsole系よりかはまだ使いやすいかと。


385 名前:376 :2005/12/16(金) 07:37:54
>>377-378
ウィンドウフックをすることで解決しました
本当にどうもありがとうございました

386 名前:デフォルトの名無しさん :2005/12/16(金) 08:07:10
誰かたすけてください。
プログラミングしていて気づいたのですが、
メディアプレイヤーをつけているときと、つけていないときでFPSが違います。
WindowsMediaPlayerを起動していると、動作が「速く」なり、起動していない場合重くなります。
いったい何が原因なのか分かりません。

387 名前:デフォルトの名無しさん :2005/12/16(金) 08:22:43
測定方法に問題あり

388 名前:デフォルトの名無しさん :2005/12/16(金) 09:50:51
すみません、分からないことがあるので教えてください。

自作でDLLを作っているのですが、DLLにはDLLMainというエントリポイントが
必要ですよね?複数のDLLを作ってリンクする場合、DLLMainという関数が複数
同時に使われることになると思うのですが大丈夫なのでしょうか?
よろしくお願いします。

389 名前:デフォルトの名無しさん :2005/12/16(金) 10:00:09
久しぶりのAdvancedWindows嫁。

390 名前:デフォルトの名無しさん :2005/12/16(金) 10:53:51
>>386
timeBeginPeriod

391 名前:デフォルトの名無しさん :2005/12/16(金) 11:03:01
>>384
すごい参考になりました。 m(_ _)mぺこ

392 名前:デフォルトの名無しさん :2005/12/16(金) 12:00:35
MSDNみてて、ふと思ったのだが・・・

BOOL値を返すAPIの戻り値の説明・・・

BOOLといいつつ、
「関数が成功すると、0 以外の値が返ります。」
ってよくかいてあるじゃん、
それって booleanじゃなくねぇか?

if (戻り値 == TRUE)

は、まずい可能性ってことだよね


393 名前:デフォルトの名無しさん :2005/12/16(金) 12:09:18
>>392
今さら何言ってんだ?
いちいちhoge()==TRUEやhoge()==FALSEで評価する人はおらんでしょ。
普通は、hoge() もしくは、!hoge()で評価する。

394 名前:デフォルトの名無しさん :2005/12/16(金) 12:09:27
あ、それ、同じ個と思った。

395 名前:394 :2005/12/16(金) 12:10:36
>>393
なるほど。

396 名前:デフォルトの名無しさん :2005/12/16(金) 12:48:42
エラーコードをレジスタ渡しにする旧人類にとっと
成功≠0 失敗=0 っつのはいかにも使いにくいね

397 名前:デフォルトの名無しさん :2005/12/16(金) 13:09:29
>>392
GetMessageの説明呼んでみな
びっくりするぞ。

俺はtypedef BOOL MSBoolってして
こいつはbool値として扱わないことにしてる。

398 名前:デフォルトの名無しさん :2005/12/16(金) 13:20:04
おまいらアフォかw
Cのboolは0と0以外だろ

399 名前:デフォルトの名無しさん :2005/12/16(金) 13:21:28
実は
#define TRUE 1
#define FALSE 0
じゃなくて
#define FALSE 0
#define TRUE (!FALSE)
と定義されている

400 名前:デフォルトの名無しさん :2005/12/16(金) 13:30:08
>>399
マジで?

漏れのwindef.hには、
#define TRUE 1
と定義されてるんだが・・・

401 名前:デフォルトの名無しさん :2005/12/16(金) 13:38:39
私も400さんと同じ

(゚Д゚)ハッ 釣りだったのか

402 名前:デフォルトの名無しさん :2005/12/16(金) 13:39:46
afx.hには、ビシッと

// Standard constants
#undef FALSE
#undef TRUE
#undef NULL

#define FALSE 0
#define TRUE 1
#define NULL 0

ってなってた。



403 名前:デフォルトの名無しさん :2005/12/16(金) 13:50:23
てか、intでええやんと思うのだが
どうせやるなら、

typedef enum {
TRUE = 0,
FALSE = 1
} BOOL;

BOOL hogehoge()
{
return FALSE;
}

じゃない?ま、どーでもいいけど

まぁ、昔からそーやってるからとか、なんとなくって理由で今の仕様なんだろうけど


404 名前:デフォルトの名無しさん :2005/12/16(金) 14:04:21
>>403
サイズが変わる可能性があるから、保守的になるんだよ。
sizeof(int) == 4と決め付けている奴とかな。

あと、そのCのenum、実際に何バイトなのかは、コンパイラの実装依存じゃないか。


405 名前:デフォルトの名無しさん :2005/12/16(金) 14:25:29
>>404
あー、確かに。

406 名前:デフォルトの名無しさん :2005/12/16(金) 15:06:16
>>404
昔のILP16かなんかのときの名残かな?
XP64bitってLLP64だったっけ?忘れた・・・

ところで、教えて君なんですが、

PostThreadMessageって、自分とは別のプロセスのおスレッドに
メッセージを遅れますか?
可能なら、その、送りたい別のプロセスのスレッド識別子って
どうやって取得するの?


407 名前:デフォルトの名無しさん :2005/12/16(金) 15:44:04
>>406
送れる。
例えばCreateProcess()したときのPROCESS_INFORMATIONに入っている
dwThreadIdを使ってもいいし、その「おスレッド」にメッセージか何かで教えてもらってもいい。

408 名前:デフォルトの名無しさん :2005/12/16(金) 16:00:23
2つのスレッドを走らせていて
片方であるイベントを WaitForSingleObject() でまたせておいて
他方でそのイベントを SetEvent() して
同期させるような処理を書いたのですが,
そのプログラムを起動して
常にではないですが半々くらいの割合で
SetEvent() しても Wait 関数が値を返さずに
処理がつまってしまうケースがあります

なぜこのようなことが起こるのでしょうか?
こうならないようにするにはどうしたらいいのでしょうか?


409 名前:デフォルトの名無しさん :2005/12/16(金) 16:01:22
ツールバーの小さいボタンのビットマップの
縦サイズのデフォルトは15だったのか。
ずっと16だと思っていた。

410 名前:デフォルトの名無しさん :2005/12/16(金) 16:02:25
Win32APIのシステムを学ぼうとしているのですが、どの参考書を選べば良いか悩んでいます。
一応今は、赤坂玲音著の「Windowsゲームプログラミング」という本は持っています。
なにか良い書籍がありましたら紹介よろしくお願いします。

411 名前:デフォルトの名無しさん :2005/12/16(金) 16:10:49
プログラミングWindows
Advanced Windows

412 名前:デフォルトの名無しさん :2005/12/16(金) 16:14:10
>>388
DLL1つにつきDllMain1つ。

413 名前:デフォルトの名無しさん :2005/12/16(金) 16:26:30
>>408
勘で書くと、
各々のスレッドの処理の進み具合によって、
WaitForSingleObjectの前にSetEventが呼ばれる状況になってる。



414 名前:386 :2005/12/16(金) 16:35:38
測定方法は関係ないと思います。
目に見えて差があるので。(メディアプレイヤーを消すと倍ぐらい重くなる)

415 名前:デフォルトの名無しさん :2005/12/16(金) 17:25:52
>>414
>>390は試した?

416 名前:デフォルトの名無しさん :2005/12/16(金) 18:21:19
>>408
イベントは手動イベントにすると良いよ

417 名前:デフォルトの名無しさん :2005/12/16(金) 18:26:16
>>412

ありがとうございます。そのとおり試してみました。DLLにそれぞれ1つずつ
DLLMainを置いて、2つ同時にリンクしましたがちゃんと動作しています。
DllMainは特別なんですかね。

>>389
 AdvancedWindowsも読んでみたいんですが、以前、プログラミングWindows
という本をよんで挫折してしまったので、同じ系列のこの本も挫折しそうなので
他の本を探してみます。どうもありがとうございました。

418 名前:デフォルトの名無しさん :2005/12/16(金) 18:28:30
猫でも分かる

419 名前:デフォルトの名無しさん :2005/12/16(金) 18:48:14
>>417
DllMainだけが特別ではない。
どんな関数でもなんでもそうだよ。
DLL自身の中で唯一の名前であれば問題ない。

420 名前:デフォルトの名無しさん :2005/12/16(金) 20:09:02
>>419

Book.dll と、Note.dll があってその両方に drawCircle()という同じ名前で
処理内容の違う関数があって、この2つのDLLを本体(EXE)にリンク
した場合、呼び出すときに区別できなくないでしょうか?

何かDLLについて(私が)根本的に分かってないみたい。
もっと本を読まないといけないですね。



421 名前:デフォルトの名無しさん :2005/12/16(金) 20:28:50
別に関数名が関数のアイデンティティの全てじゃないからな

422 名前:デフォルトの名無しさん :2005/12/16(金) 21:52:15
引数とかな

423 名前:デフォルトの名無しさん :2005/12/16(金) 22:11:59
>>420
たしかにその2つを普通に同一のプログラムから同時に使用しようとしたらエラーになるが、
DEFファイルなんかを使ってそれぞれ別の名前を与えられるし、
動的リンクならDLLのファイル名と関数名(あるいは序数)から
直に関数へのポインタが得る方法もある。

424 名前:デフォルトの名無しさん :2005/12/16(金) 22:16:07
>>420
おいおい('ー`;)

425 名前:デフォルトの名無しさん :2005/12/16(金) 23:21:05
410へのレスありがとうございましたm( _ _ )mペコリ

426 名前:デフォルトの名無しさん :2005/12/16(金) 23:31:09
プログラミングWindows第5版(上) を買おうと決めたのですが、最初に読む著書として選んでも大丈夫でしょうか?皆さんよろしくお願いします。

427 名前:デフォルトの名無しさん :2005/12/16(金) 23:53:25
>>423
おいおい

428 名前:デフォルトの名無しさん :2005/12/17(土) 00:04:04
>>428
おいおい

429 名前:デフォルトの名無しさん :2005/12/17(土) 01:00:08
あいおい

430 名前:デフォルトの名無しさん :2005/12/17(土) 01:06:27
そんぽ

431 名前:デフォルトの名無しさん :2005/12/17(土) 04:54:25
>>426
C,C++をある程度理解していればOKかと。
この手の本はとにかく何か1冊買って、次に買う本がどういうモノが良いのか分かってくる。
でも、買った本は無駄になることはない。

432 名前:デフォルトの名無しさん :2005/12/17(土) 11:08:21
>>355
今さらだが、そんな面倒なことしなくても、

AllocConsole();
freopen("CONOUT$", "r", stdout);

で使えたような

433 名前:デフォルトの名無しさん :2005/12/17(土) 12:10:28
ボタンの消し方を教えてください。
文字の変え方は、SetWindowText、
絵の変え方は、SendMessage(BM_SETIMAGE)
と分かったのですが、消し方が分かりません。

434 名前:デフォルトの名無しさん :2005/12/17(土) 12:28:38
ボタンもウインドウ

435 名前:デフォルトの名無しさん :2005/12/17(土) 12:37:16
PostMessage(WM_Quit)

436 名前:デフォルトの名無しさん :2005/12/17(土) 13:39:16
>>434>>435
ああ、そうですよね。
DeleteWindowとか探していました。
ありがとうございました。

437 名前:デフォルトの名無しさん :2005/12/17(土) 13:53:59
一時的に消すだけなら
ShowWindow(SW_HIDE);

がいいよ。

ShowWindow(SW_SHOW);

で復活できるし。
QUITしちゃったらまた作り直さないといけないお

438 名前:デフォルトの名無しさん :2005/12/17(土) 14:02:50
>>407
レスありがと。
でも、そのgetMessageで待ってる「おスレッド(w」様に
メッセージを送りたいわけで・・・

にわとりが先かたまごが先かの状態になっちゃう
スレッドIDって自分で明示的に指定できる?

べつにpostThreadMessageでなくてもいいんで
なんかいい方法ないかなぁ?


439 名前:デフォルトの名無しさん :2005/12/17(土) 14:07:38
>>438
1. プロセスを列挙して、目的のプロセスを見つける
2. そのプロセスのスレッドを列挙して、目的のスレッドを見つける。
3. 送る。

というか、そのメッセージを受け取る側のプロセスも自分で書くのなら、
もっと別の方法で通信したほうがいいと思うんだが。

440 名前:デフォルトの名無しさん :2005/12/17(土) 14:09:50
質問させてもらいます
最近Windowsプログラミングの勉強を始めたものです
今までコンソールアプリで動かしていたものをWin32アプリに移植したのですが
今までと比べてかなり処理時間が長くなってしまいました
移植に当たっては、ほとんどソースは弄らずにスレッドを一個作ってそこに放り込んでいます
手を加えた部分は、動的メモリ確保にしたことと
一定処理ごとにウィンドウプロシージャにメッセージを送りウィンドウに計算推移を描画させているのみです

同じ計算をさせてみると
コンソールアプリ 12分
Win32アプリ    2時間
とこれぐらい差が出てしまいますorz
普通こんなにも差が出てしまうものなのでしょうか?

441 名前:・∀・)っ-●○◎- ◆Pu/ODYSSEY :2005/12/17(土) 14:18:37
一定処理ごとってどのくらいよ?
タイマ使ってn秒単位でメッセージ送るようにして見たら?

フォアグラウンドスレッドが他の操作が何も出来なくなるくらいのタイミングで描画やってるんなら
問題だしね。


というかソースどっかにアップロードするのが確実かもね。
コンソールで12分もかかる演算ってなんなんだろうとも思ったり。

442 名前:デフォルトの名無しさん :2005/12/17(土) 14:31:13
>>440
> 動的メモリ確保
サイズに依るがこれがネックになりうるぞ

443 名前:352 :2005/12/17(土) 14:36:20
自分の固定IPアドレスを変更する方法がありましたら、
教えてください。

お願いします。

444 名前:・∀・)っ-●○◎- ◆Pu/ODYSSEY :2005/12/17(土) 14:39:57
libmmtはIntelコンパイラ謹製の数値計算用ライブラリだ。持ってないならあきらめろ。

445 名前:デフォルトの名無しさん :2005/12/17(土) 14:48:08
レスありがとうございます

一応操作は可能です
演算内容はECGAという進化計算アルゴリズムの一種です
一定処理ごと、というのはこのECGA演算過程でいくつかの段階に分かれているのですが
その区切りごとに送っています
また、演算の遅延はその段階のうちの一つで起きていてそこから先に進まないので
かなりの間(数分〜十数分)メッセージによる描画は発生しません
演算規模をできるだけ小さくして各段階での処理速度が数瞬終わる場合でも大丈夫なのでそこは問題ないと思います

やはり、ソースを上げたほうが確実ですか
かなり拙いので上げるのはすごいはずかしいですね・・・

446 名前:デフォルトの名無しさん :2005/12/17(土) 14:53:49
>>442
そうなのですか・・・
ネックになる部分は領域を確保するときの作業のときでしょうか?

447 名前:443 :2005/12/17(土) 14:58:21
>>444
ありがとうございます。libmmtの件は、リンカの指定で「無視するライブラリ」に指定したら、
リンクできました。
もっとも、libmmtはデフォルトライブラリのようで、それにもかかわらずそれが存在しない
というのはなんでなのかわかんないんですが。。。

あと>>443もお願いします。TCPIPのプロパティからIPアドレス変えられますが、
プログラムでできる方法について、です。

448 名前:デフォルトの名無しさん :2005/12/17(土) 15:03:19
>>437
なるほど。ありがとうございます。

449 名前:デフォルトの名無しさん :2005/12/17(土) 16:39:53
>>447
ICCでコンパイルされた.objでデフォルトライブラリに指定されてるから。

450 名前:443 :2005/12/17(土) 17:33:45
>>449
やっと意味がわかりました。
ありがとう。

451 名前:デフォルトの名無しさん :2005/12/18(日) 05:33:45
どういたしまして。

452 名前:デフォルトの名無しさん :2005/12/18(日) 06:29:38
プロセス隠匿方法に関してです。

例えばタスクマネージャでプロセス一覧を表示しますと、
とあるアプリケーションのスレッドが動いてるにも関わらず該当プロセスが表示されていません。
これはどの様な仕組みで隠匿してるのでしょうか?

仕組みだけでも教えていただけたら幸いです..

453 名前:デフォルトの名無しさん :2005/12/18(日) 06:59:27
通報しますた

454 名前:デフォルトの名無しさん :2005/12/18(日) 08:49:15
>>443
WSH/WMIで出来る

455 名前:デフォルトの名無しさん :2005/12/18(日) 11:00:46
>>452
プロセスじゃなくてスレッドだから。

456 名前:デフォルトの名無しさん :2005/12/18(日) 11:29:54
>>452
つ ダイログ

457 名前:デフォルトの名無しさん :2005/12/18(日) 12:40:59
ダイログ、dilogでぐぐると結構ヒットする。orz

458 名前:デフォルトの名無しさん :2005/12/18(日) 14:51:40
>>455-457
ううん、危なげな質問でしたが答えてくれて有難うございます。
いろいろキーワードから調べて見ます

459 名前:デフォルトの名無しさん :2005/12/18(日) 15:57:25
うぎゃ。あが抜けてたorz

460 名前:デフォルトの名無しさん :2005/12/18(日) 16:16:23
海外アプリケーションのローカライズをしているのですが
日本語入力ができなくて困っています。
入力言語を変更するAPI等ありましたら、教えていただけないでしょうか?

461 名前:デフォルトの名無しさん :2005/12/18(日) 18:17:36
>>460
ないです

462 名前:デフォルトの名無しさん :2005/12/18(日) 18:58:20
キーボードレイアウトの変更でできなくね?

463 名前:デフォルトの名無しさん :2005/12/18(日) 22:51:25
質問です。Windows XP上でプログラミングをしていて、ファイルオープンダイアログ、
すなわちGetOpenFileName()を呼ぼうとしているのですが、OPENFILENAME構造体に渡す
パラメータは全く同じなのに、次の点で普段と動作が異なることがあります。
 ・「ファイル名(N):」に表示されるキャレットが点滅しないことがある。
 ・マウスカーソルをファイルの上に移動させてもツールチップが表示されないことがある。
どうやらこれらの現象は同時に発生するようです。どのような原因が考えられるでしょうか?

464 名前:463 :2005/12/18(日) 23:33:03
すみません、自己解決しました。
メインのウィンドウプロシージャの中でWM_PAINTを正しく
処理していなかったのが原因でした。_| ̄|○

465 名前:デフォルトの名無しさん :2005/12/18(日) 23:35:57
あるあるwwww
こういう時こそ、MFCやWTLの雛形の存在意義を感じたりする。

466 名前:デフォルトの名無しさん :2005/12/19(月) 09:23:05
>>439
なるほど、自分で探すしかないのか・・
スレッドの探し方で、ちょっと悩んでみまつ


ぜひ、別の方法とやらのヒントでもご教示を
(getMessageで待ってるのは、ServiceMainで、
ウィンドウオブジェクトとかは持って無い奴です。)



467 名前:デフォルトの名無しさん :2005/12/19(月) 09:53:21
>>466
・待つプロセスが自分のThreadIDを固定ファイルか何かに書いておく。
・待つプロセスが特定の名前の空ウィンドウを作りFindWindow()で探してもらう。
・待つプロセスが特定の名前の共有メモリ化何かを確保し、そこにアクセスしてもらう。

468 名前:デフォルトの名無しさん :2005/12/19(月) 10:06:45
>>467

>・待つプロセスが自分のThreadIDを固定ファイルか何かに書いておく。

この案がいいかな
Unix系だと、 /var/run/httpd.pid
とか置いといて、pid指定してsignalでホイホイするイメージに近いかねぇ〜

置き場所は、レジストリがいい?
HKEY_LOCAL_MACHINE\SOFTWARE\ほげほげ\ThreadID

ちょい、やってみますです。


469 名前:デフォルトの名無しさん :2005/12/19(月) 10:25:38
NTFSのMFTのサイズを取得するためにNtFsControlFile APIで
NTFS_VOLUME_DATA_BUFFER構造体を取得しています。
ただこの処理は管理者権限のあるアカウントでしか成功しない
ということに最近気づいてしまい困っています。
ドライブへのアクセス権限のある一般ユーザ権限レベルでも
MFTのサイズを取得する方法はないでしょうか?


470 名前:469 :2005/12/19(月) 11:34:23
管理権限なしでMFTサイズを取得するにはセクターに直接アクセスして読むしか
なさそうな気がしてきました。
NTFSでセクターアクセスする方法ってどこかに解説ページとかないでしょうか?
DOS版は作ったことあるんですけど。



471 名前:デフォルトの名無しさん :2005/12/19(月) 11:43:11
>>470
CreateFile()で\\.\cだかをオープンするんじゃなかったかな。
MSDN参照で。
#MFTサイズがどこから読めるのか私は知らんが。

472 名前:469 :2005/12/19(月) 11:49:11
>>471
今はこの方法で実装していますが、この部分で管理者権限が必要になるんです。


473 名前:デフォルトの名無しさん :2005/12/19(月) 17:23:10
デフォルトのフォント(HFONTかフォント名)を取得する関数あります?

474 名前:473 :2005/12/19(月) 17:26:12
デフォルトっていうのは、
システムの標準フォントでおねがいします

475 名前:デフォルトの名無しさん :2005/12/19(月) 17:31:34
>>474
メニュー描画等で使われているフォント
HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);

いわえるシステムフォント
HFONT hFont = (HFONT)GetStockObject(SYSTEM_FONT);

名前とか大きさとかほしけりゃ その後に
LOGFONT lf;
GetObject(hFont, sizeof(lf), &lf);
とでもやってくれ

476 名前:デフォルトの名無しさん :2005/12/19(月) 17:36:11
ありがとう><

477 名前:デフォルトの名無しさん :2005/12/19(月) 17:47:21
>>475
> いわえる
> いわえる
> いわえる
> いわえる
> いわえる
> いわえる
> いわえる
> いわえる
> いわえる
> いわえる
> いわえる
> いわえる
> いわえる

478 名前:デフォルトの名無しさん :2005/12/19(月) 17:57:55
いわ・える(いはへる)【岩得る】
〔他ア下一(ハ下一)〕卆いは・ふ〔他ハ下二〕(しばくために)岩を入手する。
*書言字考節用集‐九「紲絆イハヘル束縛之義。〔毛詩〕」

479 名前:468 :2005/12/19(月) 19:02:17
とあるプロセスで、

DWORD tid = GetCurrentThreadId();
(tidを表示すると2156)

MSG msg;
BOOL bRet;
while ((bRet = GetMessage(&msg, NULL, 0, 0))) {
  :


ってコーディングして待ってるんだけど、
これを、別のプロセスで、↓なぐあいで起動したんだけど、

DWORD tid = 2156;
UINT msg = 10;
WPARAM prm1 = 9;
LPARAM prm2 = 8;
rtn = ::PostThreadMessage(tid, msg, prm1, prm2);

rtnがFALSEでGetLastErrorの内容は「スレッド識別子が無効です」でした。なんで?



480 名前:デフォルトの名無しさん :2005/12/19(月) 19:28:13
IDとHANDLEを間違ってない?

481 名前:デフォルトの名無しさん :2005/12/19(月) 19:30:32
PostThreadMessage

idThread
スレッドの識別子を指定します。
この関数は、このスレッドのメッセージキューへメッセージをポストします。
指定されたスレッドがメッセージキューを備えていない場合、この関数は失敗します。
スレッドが Win32 のユーザー関数または GDI 関数のいずれかを最初に呼び出した時点で、
システムはそのスレッドのメッセージキューを作成します。
詳細については、この関数の「解説」を参照してください。

Windows 2000:このスレッドは、呼び出し側と同じデスクトップ、
または共通の LUID(Locally Unique Identifiier;ローカル一意識別子)
を持つプロセスに所属していなければなりません。それ以外の場合、
この関数は失敗し、ERROR_INVALID_THREAD_ID を返します。



482 名前:デフォルトの名無しさん :2005/12/19(月) 19:42:24
>>481
GetMessageしてるほうは、ServiceMainだから、デスクトップ持って無いし、
共通のLUIDたぶん持ってないです。

ダメダメだった。どうすりゃええんだ〜



483 名前:デフォルトの名無しさん :2005/12/19(月) 19:47:44
パイプとかソケット使った方がよくね?

484 名前:デフォルトの名無しさん :2005/12/19(月) 19:53:38
メールスロットとかな。
なんでPostThreadMessageにこだわるかね。

485 名前:デフォルトの名無しさん :2005/12/19(月) 20:16:47
自己解決しました。
ControlService が128以降、ユーザに開放されてたのに気がついた。
これで起動して、イベントハンドラで、自分自身のプロセス?にPostThreadMessageしたら、
ちゃんと、キューにイベントが溜まって、1個ずつ取り出してできたよ。


>>483-484
コメントありがとう〜

メールスロットやパイプ、ソケットの件は、いろいろあって
それ以外の方法でさがしてたもので・・


486 名前:デフォルトの名無しさん :2005/12/19(月) 21:00:37
え?Inner-Process-Comminucationだったの?

487 名前:デフォルトの名無しさん :2005/12/19(月) 21:07:04
ウィンドウの縁の枠の太さ、ツールバーの幅とか、
windows.hとかにマクロされていましたら、教えてください。

GetClientRectでも出来そうな気もしますが、
始めにウィンドウを作る時にサイズが分かりたいので、
定数で予めあってくれるとやりやすいと思いました。

488 名前:デフォルトの名無しさん :2005/12/19(月) 21:10:13
その価は動的なので、「マクロされ」てはいない。

489 名前:デフォルトの名無しさん :2005/12/19(月) 21:11:01
定数じゃなくてユーザが設定するもんだろ
GetSystemMetrics

490 名前:デフォルトの名無しさん :2005/12/19(月) 21:17:07
>>486
ControlServiceをcallするのは、別のプロセスです。
プロセス間通信です。


491 名前:デフォルトの名無しさん :2005/12/19(月) 21:33:24
>>487
逆方向?のAPIあるよ。
AdjustWindowRect(Ex) クライアントサイズを指定してWindowサイズを求める
(とはいえ メニューが複数行にまたぐときの結果はおかしい?)

492 名前:487 :2005/12/19(月) 21:52:58
みなさま、ありがとうございます。
教えていただいたキーワードを試してみたいと思います。

493 名前:デフォルトの名無しさん :2005/12/19(月) 22:39:49
恐ろしく初心者な質問だと思うんだけど、
調べてても分からなくなったので質問させて下さい。

あるプロセスから、イベントを1つ名前付きでCreateEventしておいた。
そのプロセスから CreateProcess で別の子プロセスを起動。
子プロセスは親プロセスから終了させるんだけど、
子プロセスの終了前にクリーンアップ処理を入れたいんで、
親プロセスで、最初に作っておいたイベントをセットする。
子プロセスでそれを拾ってクリーンアップしてからイベントをセットし返す。
親プロセスは子プロセスのクリーンアップが終わってから、
子プロセスを終わらせる。

みたいに書いてたんだけど、親プロセスで SetEvent しても
子プロセスで WaitForSingleObject が拾ってくれない orz
なんかうまくないところありますか?
(やり方そのものがうまくないんだけどいろいろ制約があって・・・)
セキュリティと継承?かなと思ってるんだけど、
リファレンスを見ても意味が良く分かんなくて。

長文スマソ

494 名前:デフォルトの名無しさん :2005/12/19(月) 22:51:33
>>493
親は子にWM_CLOSEを投げて、子の終了を待つ。
子はWM_CLOSEを受信したら終了すればいいだけじゃないの?

495 名前:493 :2005/12/19(月) 23:12:34
>>494
レスありがとさんです。

子はウィンドウハンドルを持ってない単純なプロセスなので
そっち経由だとやり取りできないんです(ノ∀`)

496 名前:デフォルトの名無しさん :2005/12/19(月) 23:27:41
>>493
基本的には問題なさそうだから、
> 子プロセスで WaitForSingleObject が拾ってくれない
の動作の詳細(どうなってほしいが、実際にはどう動く)が知りたいところ。

ちなみに子プロセスの終了検出は、子プロセスを普通に終了させて、
親プロセスでは子プロセスHANDLEをWaitForSingleObject()するほうが素直。

497 名前:デフォルトの名無しさん :2005/12/19(月) 23:29:30
あるディレクトリが共有ディスクかどうか判別したいのですが、
専用のAPIとかってありますでしょうか?
それともパスが\\か//で始まっていかどうかで判別するのが普通でしょうか。

どなたかよきアドバイスを。


498 名前:デフォルトの名無しさん :2005/12/19(月) 23:39:56
>>497
GetDriveType()

499 名前:493 :2005/12/19(月) 23:45:27
>>496
ありがとうございます。
今、主要なところを抜き出してプロジェクト作ってます。
詳細が分かりにくいのでもうちょっと書きます。

>> 子プロセスで WaitForSingleObject が拾ってくれない
>の動作の詳細(どうなってほしいが、実際にはどう動く)が知りたいところ。

親から子を CreateProcess してます。
親でイベントを2つ CreateEvent して、1つは子を終了させるときに SetEvent します。
そのあと親ではもう1つのイベントを WaitFor してます。
子の方では、起動時に、親で CreateEvent したのと同じ名前で OpenEvent してます。
その後、メインスレッドのループで WaitFor(タイムアウト0) していて、
親からプロセス終了のイベントがセットされるのを調べてます。(★ここでイベントがシグナルだと分かってくれない)
もしイベントが検知できたら、ゴミ掃除をしてからもう1つのイベントを SetEvent します。
親ではもう1つのイベントの方の WaitFor が検知できるはずなので、
その後、子をTerminateProcess してます。

>ちなみに子プロセスの終了検出は、子プロセスを普通に終了させて、
>親プロセスでは子プロセスHANDLEをWaitForSingleObject()するほうが素直。

はい、そうなんですよね。。。
ただスレッドとかその他グローバルに確保してるリソースを解放しないといけないので
『プロセスが終わる直前』を通知したいんです。

500 名前:デフォルトの名無しさん :2005/12/20(火) 00:03:30
>>499
んー・・・。
・実は親子で同じイベントをWaitし合ってる
・イベントが自動Eventで、複数の子プロセスをCreateしている
くらいしか思いつかないな。

自動Eventの場合、Setした時に起きるスレッドは1つだけなので、
他にもWaitしてるスレッドがあっても、それらは寝たまま。
手動Eventなら待ってる全スレッドが一気に起きるんだけど。


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.