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


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

Win32API質問箱 Build19
251 名前:デフォルトの名無しさん :04/05/26 16:28
GetFocus・・・。

252 名前:デフォルトの名無しさん :04/05/26 16:29
まちがい・・・。

253 名前:デフォルトの名無しさん :04/05/26 16:39
>>250
GetForegroundWindow()って違うかな?
今MSDNで調べて知ったばっかりだから自信ない。

254 名前:デフォルトの名無しさん :04/05/26 16:44
>>251-252
いろいろ試したのですが、GetFocus だと「トップウィンドウ」レベルの
HWND しか取得することができませんでした。
なにか妙案がありますでしょうか?

もう少し書くと ListView/TreeView コントロールが複数あり、その中のどの
ListView/TreeView コントロールがフォーカスされているか、もしくは
いずれもフォーカスされていないかを調べたいと試行錯誤しています。

255 名前:デフォルトの名無しさん :04/05/26 16:53
>>254
EnumChildWindowsで列挙してGetFocusと比較する。
ただし君の言っている仕様が曖昧なので、これだけでは満たしていない可能性もあるが...。



256 名前:デフォルトの名無しさん :04/05/26 16:54
>>254
GetWindowThreadProccessIDでスレッドID取得して、
AttachThreadInput すれば、子WNDまで調べられる。


257 名前:デフォルトの名無しさん :04/05/26 17:01
>>251-253 >>255
GetFocus と解をいただいたので、再度試行錯誤したところ、
GetFocus で目的の HWND を取得することができました。

今まで失敗していたのは、フォーカスのある HWND を調べようと
している手続きの中で、自分でフォーカスのある HWND を変更して
しまっていたためでした。。

こんな単純なことにお手を煩わせてしまい申し訳ございませんでした。

258 名前:251=252 :04/05/26 17:06
なんだ、あってたのか

259 名前:デフォルトの名無しさん :04/05/26 19:35
SetWindowsHookExで他プロセスにフックかけたいんですけど、
特定のアプリひとつ(電卓一個限定とか)に対するフックでもdll要りますか?

260 名前:デフォルトの名無しさん :04/05/26 19:36
要る

261 名前:デフォルトの名無しさん :04/05/26 20:17
WM_GETTEXTを SendMessage してやるとテキストが取れるのに、
GetWindowText だと取れないことがあるのは仕様ですか?

262 名前:デフォルトの名無しさん :04/05/26 20:26
どんな時に取れないんだ?具体例を出してくれ。

263 名前:デフォルトの名無しさん :04/05/26 20:28
msdnを参照しないのも仕様ですか?

264 名前:デフォルトの名無しさん :04/05/26 20:34
仕様です、あきらめてください。

265 名前:デフォルトの名無しさん :04/05/26 23:02
>>261
同じプロセスで?

266 名前:デフォルトの名無しさん :04/05/26 23:07
>>261
もし違うプロセスなら、>>256調べてみ。

267 名前:261 :04/05/26 23:28
違うプロセスが開いたダイアログのEditControlの文字列を取ろうとしたんですが、
EnumChildWindows、WindowFromPoint、spy++のプロパティのどれで取得したhWndでも
WM_GETTEXTだと取得できて、GetWindowTextだと取れませんでした。
ダイアログのEditコントロールで再現性が高いです。

268 名前:デフォルトの名無しさん :04/05/26 23:56
Platform SDK - GetWindowText Fucntion

>The GetWindowText function copies the text of the specified window's title bar (if it has one) into a buffer.
>If the specified window is a control, the text of the control is copied.

>However, GetWindowText cannot retrieve the text of a control in another application.



269 名前:デフォルトの名無しさん :04/05/26 23:57
ついでに、
Remarks

>To retrieve the text of a control in another process,
>send a WM_GETTEXT message directly instead of calling GetWindowText.



270 名前:デフォルトの名無しさん :04/05/26 23:58
というか、なぜリファレンスを当たらないのか理解に苦しむ。

271 名前:216 :04/05/27 00:08
あ、あれ…?

Remarks
This function causes a WM_GETTEXT message to be sent to the specified window or control.

漏れのはここまでしか書いてない…
素直にmsdn最新版入れてきます…スマソ

272 名前:デフォルトの名無しさん :04/05/27 00:12
>>270
> というか、なぜリファレンスを当たらないのか理解に苦しむ。
∵仕様だから

273 名前:デフォルトの名無しさん :04/05/27 02:09
C++相談室から移動してきました。

VC++をコンパイラに使って、簡単な実験プログラムをMFC使用せずに
ネットのソースや猫でもわかるを見て試行錯誤してるのですが。
現在作ろうとしてるのが初めてDialogをメインでCreateWindowなどを使わない方法なのですが、
どうもDialogリソースにクラス名を入れると起動後すぐに終了したり、
WM_KEYUPなどのウィンドウメッセージが反応しないなどの壁にぶつかってます。
特に後者はどのようにしたら解決出来るでしょうか?WM_COMMANDなどは正常に反応します。

Window生成したソースだとちゃんとWM_KEYUPなど動いてくれます。
いまいち生成されたWindowとリソースエディタで作ったDialogの違いが分かってないようです。
Dialogを、この生成されたWindowのようには扱えないのでしょうか。
どうかご教授よろしくお願いします。

274 名前:デフォルトの名無しさん :04/05/27 07:56
WM_INITDIALOG

275 名前:デフォルトの名無しさん :04/05/27 09:44
ダイアログ自体がWM_KEYxxを処理してどうしようと。
フォーカス持たないのに。

276 名前:デフォルトの名無しさん :04/05/27 10:09
「Windowsゲームプログラミング」
http://www.amazon.co.jp/exec/obidos/ASIN/4797325453/

“ゲームプログラミング”と銘打っているが、実はれっきとした
Win32 API入門書。著者は↓の作者。
http://black.sakura.ne.jp/~third/system/winapi/win.html


277 名前:デフォルトの名無しさん :04/05/27 11:26
ウィンドウの最大化ボタンや×ボタンを動的に付けたり消したりする事はできますか?

278 名前:デフォルトの名無しさん :04/05/27 13:05
>>277
できる。

279 名前:277 :04/05/27 13:32
よかったらそのAPIを教えてくれませんか?

280 名前:デフォルトの名無しさん :04/05/27 13:47
>>279
SetWindowLong

281 名前:273 :04/05/27 15:34
試行錯誤してて遅れました。。
確かに一旦Dialogから他のコントロールにフォーカスの移動(?)したらWM_KEYxxは働きませんでした。
>>276 にある「ダイアログウィンドウ」という項目の通りにウィンドウのようなクラス登録をしたら、
WM_KEYxxは初期状態では働きましたが、どれかのコントロールをクリックしてフォーカス移動(?)したら働きませんでした。

具体的には、ショートカットキーやEscで終了、、などをしたいんですが・・・。


282 名前:デフォルトの名無しさん :04/05/27 16:00
1.普通にコントロールをサブクラス化する。
2.メッセージループでコントロールのメッセージを横取り

283 名前:273 :04/05/27 18:29
サブクラス化を調べて、実際にやってみたところ、
WM_CREATEのところで、OLEの登録の後にサブクラス化をやったのですが、
どうも GetDlgItem 関数でのハンドルの取得が上手く行かないようです。(NULLが返って来る)

どのコントロールを指摘してもダメだったのですが、ダイアログウィンドウにすると、
別の関数でやるか、あるいは最初から一つずつCreateWindowでコントロールの生成しなければならないんでしょうか?
ダイアログウィンドウではなく、そのままにして WM_INITDIALOGのところでサブクラス化したら上手く行きました。
これで、コントロール一つずつサブクラス化すれば WM_KEYxx は拾えそうですが、結構長くなってしまいそうです。

284 名前:273 :04/05/27 19:20
追記。
resource.h を見て、for文で一つずつサブクラス化してみたりしたのですが、
どうもリストボックス以外をサブクラス化したり、その順序によっては、
それぞれのコントロールが消えたり無効状態になってしまいます。。。
例えばリストボックス→その他のコントロールにすると、リストボックスが灰色になります。
ただし、クリックしてWM_KEYxxメッセージはちゃんと受け取るようです。

285 名前:デフォルトの名無しさん :04/05/27 19:30
お客様の中に、無駄に親切な超能力者の方はいらっしゃいませんか?

286 名前:デフォルトの名無しさん :04/05/27 19:51
>>285
はいっ! 曲げたスプーンを元に戻すことが出来ます。

287 名前:デフォルトの名無しさん :04/05/27 19:56
>>273
何か根本的なコーディングミスを犯している気がする。

288 名前:デフォルトの名無しさん :04/05/27 23:12
2重投稿がここだけ無い…
すげー さすがWin32APIスレ…

289 名前:デフォルトの名無しさん :04/05/28 09:49
VC++アプリからVBアプリが起動しているかどうかをFindWindowで探す方法はありますか?
VBアプリだとみんな同じクラス名になってしまうようですが。
ちなみにVBはV6です。

290 名前:デフォルトの名無しさん :04/05/28 10:29
VBアプリが起動している事を検出するだけなんだから、
みんなおなじクラスでも問題ないと思いますが?

291 名前:デフォルトの名無しさん :04/05/28 10:46
与えられたパスがフォルダかファイルかを知るには
どうしたらいいんですか?
おすぃえてー


292 名前:デフォルトの名無しさん :04/05/28 10:51
>>291
オープンできたらファイル

293 名前:デフォルトの名無しさん :04/05/28 10:56
>>291
APIでやるなら、GetFileInformationByHandleだろうな
Cランタイムも入れると_statあたりが楽かと

294 名前:デフォルトの名無しさん :04/05/28 11:01
>>292
それダウト。
使う関数にもよるけど、CreateFileはディレクトリでもオープン可能。

295 名前:デフォルトの名無しさん :04/05/28 11:04
GetFileAttributesでいいじょん

296 名前:デフォルトの名無しさん :04/05/28 11:05
GetFileAttributesは?

297 名前:293 :04/05/28 11:15
>>295-296
む、すっかり忘れてた。
なんで、面倒な>>293のしか出て来なかったんだろう…(´д`;)
同等のCランタイム関数まで出てるのに orz

298 名前:デフォルトの名無しさん :04/05/28 11:23
>>292-297
みんなみんなサンキュー

299 名前:デフォルトの名無しさん :04/05/28 11:43
デスクトップやスタートメニューのパスを取得するにはどうすればいいですか?

300 名前:デフォルトの名無しさん :04/05/28 11:45
SHGetSpecialFolderLocation
CSIDL_DESKTOPDIRECTORY
CSIDL_STARTMENU


301 名前:デフォルトの名無しさん :04/05/28 12:30
>>293
賢い俺ならPathIsDirectory()けどな

302 名前:デフォルトの名無しさん :04/05/28 12:32
>>299
SHGetSpecialFolderPath()

303 名前:デフォルトの名無しさん :04/05/28 14:18
Path系のファンクションって
あまり知られていないのな


304 名前:デフォルトの名無しさん :04/05/28 14:23
shlwapi。。。普及面からいえば、ほぼ間違いなく使えるはずだけど、
使えないかもしれないとかいろいろ考える。

305 名前:デフォルトの名無しさん :04/05/28 14:25
>>303
IE4とかが必要だから、敬遠しててそれっきりだな。

306 名前:デフォルトの名無しさん :04/05/28 14:37
95とかNT4以下を切り捨てればいい

307 名前:デフォルトの名無しさん :04/05/28 14:43
もうとっくに切り捨ててはいるけど、なんか使いたいと思わないんだよな。


308 名前:デフォルトの名無しさん :04/05/28 14:47
IE依存というのが、気分的にイヤ

309 名前:デフォルトの名無しさん :04/05/28 14:47
気分でオナニー出来る奴はいいなぁ

310 名前:デフォルトの名無しさん :04/05/28 14:49
Path系ファンクションっつーと、どしてもBegiPathとかそっちの方面を思い出す漏れ。

311 名前:デフォルトの名無しさん :04/05/28 14:55
MAX_PATH 縛りがあるから却下<path系

312 名前:デフォルトの名無しさん :04/05/28 14:57
Path系APIってlocale考慮してくれるの?

313 名前:デフォルトの名無しさん :04/05/28 15:02
>>312
システムロケール固定だけど。

314 名前:デフォルトの名無しさん :04/05/28 19:11
fopenしてNULLが帰ってきたらディレクトリ。

315 名前:314 :04/05/28 19:12
スマソ。リロードしてなかったよ・・・

316 名前:デフォルトの名無しさん :04/05/28 20:47
ちゅうか一応 API スレだし…

317 名前:デフォルトの名無しさん :04/05/28 23:16
こんばんは、質問よろしいでしょうか。
画像を何十個と表示したい場合、初期化関数などを別に作って、WndProcの中
のWM_CREATEなどでは、初期化関数を呼び出すだけにしたいのですが、
初期化関数で作ったビットマップハンドルを、自作描画関数で使おうと思うと
するとうまくいきません。
みなさんはどうしてるのでしょうか?
やはりグローバル変数を使用するしかないのでしょうか。
いろいろなハンドルがごちゃごちゃになって、手に負えません。。。
C言語で質問に上がろうと思いましたが、一応ウインドウの話題だと思い
こちらに質問させていただきました。

318 名前:デフォルトの名無しさん :04/05/28 23:41
>うまくいきません。
うまくいかないとは、いったいどのような結果になり、
それがどのように問題なのかという、、
一番重要な部分を書かずに質問するのは何故ですか?

319 名前:デフォルトの名無しさん :04/05/29 01:18
>>318
初心者だから。

知らない人間は何が悪いかさえわからないので
質問するときは、自分で判断せずにあらゆる情報を書き込むべきだと思う。

320 名前:デフォルトの名無しさん :04/05/29 01:19
まずは住所氏名年齢電話番号好きな歌手好きな言語嫌いな言語好きな板嫌いな板ぐらいは書くべきだよな。

321 名前:デフォルトの名無しさん :04/05/29 05:22
いま好きな人がいるかどうか、が抜けてるぞ、おい。

322 名前:デフォルトの名無しさん :04/05/29 07:31
>>317
WndProcの中で同じ種類のハンドルだけを集めて配列または構造体として定義して、
各関数へはその配列または構造体へのポインタを渡すようにすればいいのでは?
この場合、ビットマップハンドルってことだから…
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
 static HBITMAP hBitmap[N_BITMAPS];
 …
 switch (uMsg) {
 case WM_CREATE:
  InitMyBitmaps(hBitmap);
  …
 }
 …
}
ってな具合。
質問の意図とは的外れの答えだったらスマソ。

323 名前:デフォルトの名無しさん :04/05/29 12:41
オーナードローとかで描画する際、
ウィンドウ内の全部のコントロールの描画が終わったことって
どうやったらわかりますか?
wm_createの時点だとまだ形が無くて、
wm_drawitemだと一つ一つかいてる状態で・・・
終わったときにおくられるメッセージとかあったら
教えてください

324 名前:デフォルトの名無しさん :04/05/29 12:48
>>321
いや名前も要る

325 名前:デフォルトの名無しさん :04/05/29 13:09
バカジャネーノ( ´,_ゝ`)

326 名前:デフォルトの名無しさん :04/05/29 14:12
>>323
描画の終わりって何よ?

327 名前:デフォルトの名無しさん :04/05/29 14:18
今あるコントロールを全部一度描画したよ、みたいなことを
言ってるつもりなんですが
そういうのはメッセージで来ませんか?


328 名前:デフォルトの名無しさん :04/05/29 14:20
来ません

329 名前:デフォルトの名無しさん :04/05/29 14:24
んじゃ、ウィンドウ全体の画像を自動で保存したいときには
どのタイミングで取り込めばいいんですか?


330 名前:デフォルトの名無しさん :04/05/29 14:35
cpu君の手が空いたとき

331 名前:デフォルトの名無しさん :04/05/29 14:36
起動して1時間経過後のタイミングでお願いします。
たぶん描画が終わってます。

332 名前:デフォルトの名無しさん :04/05/29 15:20
一時間だと暇だったので、別のウインドウを開いていたら、それが取り込まれました。
残念な結果です。

333 名前:デフォルトの名無しさん :04/05/29 15:21
1時間経過後、スクリーンセーバーが立ちあがっていた罠


334 名前:デフォルトの名無しさん :04/05/29 15:30
掃除のおばさんがコンセントを抜いてた。

335 名前:デフォルトの名無しさん :04/05/29 15:37
>>329
自前でビットマップに描画してやればいいんじゃね?

自動でないのなら、キーボードの入力などをトリガーにすればいいと思うけど。

336 名前:デフォルトの名無しさん :04/05/29 15:51
自前でビットマップにボタンとか描画ってのは
オーナードローで描画するってことですか?
それとも、createwindowでつくったやつらを
自前でビットマップに描画することとかできるんですか?

337 名前:デフォルトの名無しさん :04/05/29 20:28
ツリービューでトップレベルのアイテムが表示される際に、
テキスト(またはアイコン)の左側にちょこっとスペースを空けることって
簡単にできないでしょうか?
何にもしないと、ツリービューの左端にくっついた感じになるんですが。

338 名前:デフォルトの名無しさん :04/05/29 20:32
WM_NCCALCSIZEだっけな。
こいつで左端をずらしてやればいい。

339 名前:デフォルトの名無しさん :04/05/29 20:34
OnIdle

340 名前:デフォルトの名無しさん :04/05/30 02:07
ListViewでLVS_EX_CHECKBOXESのスタイルを設定すればチェックボックス
付きの行ができますが、このチェックボックスをオン・オフしたときに
なんらかの反応をさせたい(コールバックなど)場合はどうすれば
よろしいでしょうか?

ご教授お願いします



341 名前:デフォルトの名無しさん :04/05/30 03:19
LVN_ITEMCHANGED

342 名前:デフォルトの名無しさん :04/05/30 13:04
適当にどんな順番でコントロールに対して
WM_DRAWITEMが発行されてるのか見てみたら
createwindowしたのとは逆順だったんですが、
(最初にcreatewindowしたやつが最後にwm_drawitemメッセージ出されてた)
これって絶対そうなんですか?
それともたまたま?


343 名前:デフォルトの名無しさん :04/05/30 13:24
>>342
たまたま

344 名前:デフォルトの名無しさん :04/05/30 13:26
>>342
きんたま

345 名前:デフォルトの名無しさん :04/05/30 14:13
ω

346 名前:デフォルトの名無しさん :04/05/30 14:17
(´・ω・`)

347 名前:デフォルトの名無しさん :04/05/30 17:07
WININETでWebページの読み込みを行っています。
ユーザが「読み込み中止」ボタンを押したら、読み込み処理を中断する方法はあるでしょうか?

348 名前:347 :04/05/30 17:10
あ、InternetOpenUrlやInternetReadFileがいつまでたっても戻ってこないような状況を
想定しています。

349 名前:340 :04/05/30 17:13
>>341
ヒントありがとうございます
そのまわりを調べてテスト実装してみたのですが、
そもそもチェックボックスのオン、オフ操作でNotifyメッセージにも飛んでいないようです。
何か最初に設定しておくべきフラグとかあるのでしょうか?



350 名前:デフォルトの名無しさん :04/05/30 17:46
GetDeviceCapsをつかって、Bitbltが使えるかどうかを調べたんですが
XPでは返値が0で98seだと260になりました。
これってどういうことですか?

351 名前:デフォルトの名無しさん :04/05/30 18:00
すみません、使い方間違ってました。。。
orz

352 名前:デフォルトの名無しさん :04/05/30 19:45
矢印やファンクションキー等、2バイト文字のWM_...を教えてください。
1バイトはWM_CHARで、wParamに文字が入っているのでできるのですが。

353 名前:デフォルトの名無しさん :04/05/30 20:04
wParamはいつから1バイトになったんだ?

354 名前:352 :04/05/30 20:16
>>353
そう意味ではないです。wParamはたぶん4バイトだと思います。
1バイト文字を押した時、WM_CHARメッセージが発行され、
wParamに文字が入りますが、
2バイト文字を押してもWM_CHARは発行されず、
当然wParamを調べる意味はありません。
WM_WIDECHARみたいなメッセージを探しても無いですし。

355 名前:デフォルトの名無しさん :04/05/30 20:21
imechar

356 名前:353 :04/05/30 20:27
WM_KEYDOWN

357 名前:352 :04/05/30 20:42
>>355
WM_IME_CHARは文字列?のですかね。
調べたのですが、難しくて分かりませんでした。
ただ、調べているとき、WM_KEYDOWN + VK_... で出来ることが分かりました。

お二方どうもありがとうございました。

358 名前:352 :04/05/30 20:56
>>356
すいません。リロードされていなくて。
まさしくそれでできました。ありがとうございました。

359 名前:347 :04/05/30 21:02
>>347ですが、非同期アクセス時のINTERNET_STATUS_CALLBACKの解説で、

INTERNET_STATUS_HANDLE_CREATED
Used by InternetConnect to indicate it has created the new handle.
This lets the application call InternetCloseHandle from another thread,
if the connect is taking too long. The lpvStatusInformation parameter
contains the address of an INTERNET_ASYNC_RESULT structure.

という記述があり、ハンドルを別スレッドからクローズしてしまえばいけるんじゃないかと予想。
ので、そこらへんを試してみます。でわ。

360 名前:デフォルトの名無しさん :04/05/30 21:20
ふと思ったのですが、
メッセージキューってスレッドセーフなのでしょうか?
複数のスレッドから特定のウィンドウにPostMessageするプログラムを書いてて思いました。

361 名前:デフォルトの名無しさん :04/05/30 22:48
スレッドセーフだよ。
だからキューが一杯だと PostMessage は失敗する。
送る方はね。

受ける方はスレッド単位にキュー持ってるので、
そもそも他のスレッドのキューは見れない。

362 名前:デフォルトの名無しさん :04/05/30 23:44
>>361
レスありがとうございます。
PostMessageの戻り値だけ意識すればよいので、楽でよかったです。

363 名前:デフォルトの名無しさん :04/05/31 08:02
windows.hで定義されているTCHARは
UNICODEが定義されていればWCHARで、
そうでなければcharでtypedefされていますが

ソースファイル上、windows.hより上には大抵何も記述していないし
何もインクルードしていないはずですが
コンパイル時にプリプロセス処理される時
このUNICODEというマクロはどこで定義されているんでしょうか?

364 名前:デフォルトの名無しさん :04/05/31 08:12
コンパイラオプションじゃねーかー

365 名前:362 :04/05/31 08:17
レスさんくす。

ぐぐったら自己解決しました
コンパイラの事前定義マクロだったんすね

366 名前:デフォルトの名無しさん :04/05/31 08:20
事前定義マクロっていうと、__FILE__とか__LINE__とかみたいで紛らわしいからヤメレ。

367 名前:デフォルトの名無しさん :04/05/31 13:26
>>341
ヒントありがとうございます
そのまわりを調べてテスト実装してみたのですが、
そもそもチェックボックスのオン、オフ操作でNotifyメッセージにも飛んでいないようです。
何か最初に設定しておくべきフラグとかあるのでしょうか?

368 名前:デフォルトの名無しさん :04/05/31 15:01

あるスレッド( たとえば、GetCurrentThread で取得したスレッドハンドル が指しているスレッド)が、プライマリスレッドかどうかを知るにはどの API を利用すればいいでしょう?


369 名前:デフォルトの名無しさん :04/05/31 15:15
Windows2000で、ユーザー補助のシリアルキーデバイスの設定情報を取得したり、
設定したりするにはどうすればいいのでしょうか?

SystemParametersInfo関数の、SPI_GETSERIALKEYSや、SPI_SETSERIALKEYSは、
WindowsNT/2000では未サポートとMSDNに書いてあったのですが、コントロールパネル
からシリアルキーデバイスの設定を行う事は可能なので、、何か別の手段があると思うん
ですが…

370 名前:デフォルトの名無しさん :04/05/31 15:30
>>368
そのスレッドに結び付けられたWindowハンドルを取得してみれば判断できると思うが。


371 名前:370 :04/05/31 15:35
GUIアプリに限るか。
プロセスのスレッド一覧を調べて、1番最初のだったら、でも判断できるかな。

372 名前:368 :04/05/31 17:57
>>370 に言われたとおり、
CreateToolhelp32Snapshot で、スレッドの一覧を取得し、
現在のプロセスで検索してみました。
確かに、先頭にプライマリスレッドがきます。
ありがとうございます。

ところで、実験していて気がついたのですが、
::GetCurrentThread() でスレッドのハンドルを取得すると、常に -2 が
帰ってきているようなのですが、これはなぜなのでしょう?

373 名前:デフォルトの名無しさん :04/05/31 18:08
>>372
MSDN嫁ばわかるが、定数が返るそうだ。

374 名前:デフォルトの名無しさん :04/05/31 18:30
>>369
あの文面を見ると、おそらくAPIとしては無くなってるんじゃない?
直接レジストリ操作しか無い気がする。

375 名前:デフォルトの名無しさん :04/05/31 19:08
LoadImageとかCreateDIBSectionとかした後に
GetLastErrorをすると、8が返ってきて
で、8の意味が記憶領域が足りないってことみたいなのに
ちゃんと画像はうつるのは何で?
このエラーはどういうことなの?

376 名前:デフォルトの名無しさん :04/05/31 19:16
>>374
なにー

コントロールパネルの[ユーザー補助]-[全般]-[シリアルキーデバイス]の
設定をちまちま弄って[適用]ボタンを押しても再起動を要求されないから
レジストリじゃないと思ったんだけどな(´・ω・`)

レジストリを比較してみるよ…(´・ω・`)

377 名前:368 :04/05/31 19:25
>>373
確かに書いてありますね。見落としていました。
擬似ハンドルを API に渡すと、ハンドルとして理解されるという部分は面白いですね。

ということは、プライマリスレッドで取得した擬似ハンドルをグローバル変数に保存しておいて、
ワーカースレッドからそれを参照すれば、その擬似ハンドルはワーカースレッドとして解釈されるわけか。
知らないとエライ目にあいそうだ。


378 名前:デフォルトの名無しさん :04/05/31 19:28
>>375
MSDN引けば分かるが、"全てのAPIが成功時にSetLastError(0)を呼ぶわけではない"から。
基本的にAPIが失敗したときに情報を伝えるためなのがSetLastError/GetLastError。

379 名前:デフォルトの名無しさん :04/05/31 19:36
>>378
じゃあ、あまり神経質に気にすることでもないってことですね


380 名前:デフォルトの名無しさん :04/05/31 19:41
エラーが出てないのにGetLastErrorをするなということだ

381 名前:デフォルトの名無しさん :04/05/31 19:50
なんだったか、返り値でエラーになってるんでGetLastErrorしたら分けわからんコードが出て、
不審に思ってAPI呼び出し直前にSetLastError(0)を入れたら案の定エラーコードが0になって
結局そのAPIがエラーコードセットしてないだけじゃねぇか、ってのはあった気がするな。

あとまぁ、Win9xで16bit側に実体があるAPIはそもそもエラーコードをセットしないとか。

382 名前:デフォルトの名無しさん :04/05/31 20:36
こんにちは、C++初心者です。
私はC言語を少しかじった程度で、Win32APIでダイヤログベースのアプリを勉強中です。

ダイヤログのテキストBOX(?)に、例えば、LANカードのデバイスマネージャーのリソースの
一つであるI/Oポートアドレスを表示させたいと思っています。
しかし、レジストリエディタで探してもI/Oポートアドレスが何処にあるのか分かりません。

RegOpenKeyEx等で取得出来るものでしょうか?
何かの本に、Win95・98系はiniファイルに格納され、NT・2000・XPはレジストリに
格納されるとか書いてあったような気がしますが自信がありません。

どなたか初心者の私でも分かるように、アドバイスをお願いします。

383 名前:デフォルトの名無しさん :04/05/31 22:45
VBで、APIを使ってFTPからダウンロードするソフトを作ってるんだけど、
FTPに何個ファイルがあって、フォルダ構造もどうなっているか分からない
状態で、1ファイルずつすべてのファイルをダウンロードしていくことって
できますか?


384 名前:デフォルトの名無しさん :04/05/31 22:45
>>383
そのようにプログラミングすればできます。

385 名前:  :04/05/31 22:46
>>384
383じゃないが糞レスするくらいなら書き込むな。

386 名前:デフォルトの名無しさん :04/05/31 22:52
>>385
384じゃないが可能か不可能かを聞いてるんだろ?

387 名前:デフォルトの名無しさん :04/05/31 22:56
384じゃないが、脳味噌の代わりに糞が詰まってる385は氏ね

388 名前:デフォルトの名無しさん :04/05/31 23:01
ローカルのディスク上のファイルをFindFirstFile()から列挙する方法を知っていれば、
FtpFindFirstFile()とかまんまな名前のAPIがあるんでそれでいける。

389 名前:デフォルトの名無しさん :04/05/31 23:39
>>383
とりあえずFTPについて勉強し直せ。


390 名前:デフォルトの名無しさん :04/05/31 23:42
これって WIN32API の話か?

391 名前:デフォルトの名無しさん :04/05/31 23:55
APIを使って出来るか、という質問だからオケだろ。
ちなみに388の方法でも必ず出来るとは限らないわけだが、
出来ない場合にはどうやっても出来ないのでしょうがない。

392 名前:デフォルトの名無しさん :04/06/01 04:09
http://www.kumei.ne.jp/c_lang/index.html
ここいろんなところで紹介されてるけど、なんかすごく読みにくいな。
プログラムソースを全部示して、そこにコメント文を挿入すればいいのに
余計な親切で、プログラムをぶちぎっていろいろ書き込んでるからプログラムの
全体構成とかつながりがわかりづらい。

393 名前:デフォルトの名無しさん :04/06/01 04:37
そんな感想文を書くスレじゃないんだよここは。

394 名前:デフォルトの名無しさん :04/06/01 07:05
ここは私の日記帳。


395 名前:デフォルトの名無しさん :04/06/01 07:46
>>392
こっちにすれば?
http://black.sakura.ne.jp/~third/system/winapi/win.html

396 名前:デフォルトの名無しさん :04/06/01 09:15
タスクトレイに常駐するアプリで、何か知らせたいことがあるときに
黄色いポップアップヘルプ?(htmlでいうimg alt="hogehoge"のような)
を出すものがあるんですが、こういうの出すにはどうすればいいんでしょうか?
WinHelp()を使うよーなそうでもないようなことをちらほら見るのですがいまいちわからず…。

397 名前:デフォルトの名無しさん :04/06/01 09:18
NIN_BALLOONSHOW

398 名前:デフォルトの名無しさん :04/06/01 09:49
GetMessage()は、メッセージキューにメッセージが無い場合
・メッセージを取得するまで内部でループ(待機)しつづけるのか
・メッセージが無ければ、終了してリターンするのか
どちらで実装されているんでしょうか?

399 名前:デフォルトの名無しさん :04/06/01 09:54
スレッドサスペンドしてメッセージがくるまで寝てる

400 名前:デフォルトの名無しさん :04/06/01 10:16
レスさんくす。
要するに上のレスなら前者が近いということですね

401 名前:デフォルトの名無しさん :04/06/01 11:21
>要するに上のレスなら前者が近いということですね

寝てるのとループでアイドルしてるのとは大違い

402 名前:デフォルトの名無しさん :04/06/01 13:10
誰か367の問いにも答えてやれyo
困り果てているじゃないか


403 名前:デフォルトの名無しさん :04/06/01 13:20
367=402

404 名前:デフォルトの名無しさん :04/06/01 13:51
システムフックでキー入力の特定の"文字列"だけを奪い取る事ってできますか?

たとえば"ABCDE"という文字列の場合は奪ってしまい、それ以外の文字列は
本来のソフトに素直に渡すという動作です。
#1文字だけでの判断は問題ありませんが、前後数文字の組み合わせで
#比較しなければならない状況のことです

USBに付けた装置が、不定期に数種類のパターンをキー入力扱いで送ってくるので、
これを調べて上記動作をさせたかったのです。キーフックだと1文字ずつの処理に
なるため、'E'を受け取るまで"ABCD"の処理を遅延したいと考えましたが、
次に'E'が来ない場合は速やかに"ABCD"を本来のアプリに送らなければなりません。

WH_KEYBOARD意外に適切な方法がありますか?
かなりはまってます。どなたか指針だけでも示してもらえると大変助かります。



405 名前:デフォルトの名無しさん :04/06/01 13:52
>>367
もれだったらさー,いろいろ文献漁るの面倒臭いんで
メッセージループの部分で
 while (GetMessage(&msg) > 0) {
  catch_message(&msg); // これな
  DispatchMessage(&msg);
 }
みてーな関数挟むんだよ。
この catch_message() の中では WM_MOUSEMOVE とか WM_NCHITTEST とか
眠てーメッセージは全部無視して,あんま見かけないメッセージだけを
リストアップするわけよ。
結構いいヒントが出てきたり,そうでなくてもマジ勉強になったりするからよー。

つーかもれもListViewの事あんまよく分かってねーです。スマソ。

406 名前:デフォルトの名無しさん :04/06/01 14:27
何故Spy++使わないのだ…。

407 名前:デフォルトの名無しさん :04/06/01 14:40
>>404
その「USBに付けた装置が送ってくるキー」の間隔の最大時間を計って、
キーが入力されなかった時間が、その最大時間を超えた場合、タイムアウトとして
今まで横取りした文字を本来のアプリに送れば良いんじゃないの?


408 名前:404 :04/06/01 14:48
>>407
その方法だとアプリ起動中は、他のアプリへのキー入力も
微妙なタイムラグが生じるようになりますよね?

でも、装置からの受信はせいぜい1秒程度だと思う(未計測)ので
一応その方針で実装してみます。

# キー入力時にどのキーボードから入力されたかを知る方法って
# ないんですかね。。。もしあれば一発なんですが。

レスありがとうございました。

409 名前:デフォルトの名無しさん :04/06/01 16:05
spyでWM_NOTIFYの情報展開してくれるとうれしいんだけどなー。
ただでさえコモンコントロールって多機能なんだし。

410 名前:デフォルトの名無しさん :04/06/01 16:21
>>407の手順だと、途中の文字のHook時点では、基本的に
CallNextHookExしないでreturn TRUEすることになるよな

ということは、他にKeyboardHookしているソフトが存在した場合
そのソフトへのHookを殺すことにならないか?

411 名前:デフォルトの名無しさん :04/06/01 21:42
>>409
もまいSPY++の作者知ってて言ってるのか?

412 名前:デフォルトの名無しさん :04/06/01 21:43
Spy++ copyleft Microsoft Corp. 1995

413 名前:デフォルトの名無しさん :04/06/01 21:55
Control Spyというのが昔あった気がするが。

414 名前:デフォルトの名無しさん :04/06/01 22:00
DirectDrawを使用せず
オフスクリーンサーフェイスのアドレスを取得し直接描画をしたいのですが
どのようにすればいいのでしょうか

415 名前:デフォルトの名無しさん :04/06/01 22:02
>>408
特定の USB デバイスからのキー入力の処理だったら、
「Raw Input」の関数群を使えば出来そうな気がするが…

使ったこと無いけど、なんとなくそれっぽい関数があるよ。

GetRawInputDeviceInfo
GetRawInputDeviceList
GetRegisteredRawInputDevices
RegisterRawInputDevices

ただ…面倒くさそうだw


416 名前:デフォルトの名無しさん :04/06/01 22:06
>>413
MSJにあったやつだな。あれはかなり参考になった。

417 名前:デフォルトの名無しさん :04/06/01 22:12
ダイアログボックス(hWnd)のコンボボックス(COMBO)に"+","−","×","÷"と入れたくて
SendDlgItemMessage(hWnd,IDC_COMBO,CB_ADDSTRING,0,(LPARAM)"+");
SendDlgItemMessage(hWnd,IDC_COMBO,CB_ADDSTRING,0,(LPARAM)"−");
SendDlgItemMessage(hWnd,IDC_COMBO,CB_ADDSTRING,0,(LPARAM)"×");
SendDlgItemMessage(hWnd,IDC_COMBO,CB_ADDSTRING,0,(LPARAM)"÷");
SendDlgItemMessage(hWnd,IDC_COMBO,CB_SETCURSEL,0,0);
という風に書いたんですが、うまく入りませんでした。

どうすればいいんでしょうか?

418 名前:デフォルトの名無しさん :04/06/01 22:26
文字列とは何かを考える

419 名前:デフォルトの名無しさん :04/06/01 22:54
自称エスパーの父が「WM_INITDIALOGに書け」と申しております。

420 名前:デフォルトの名無しさん :04/06/01 23:11
>>414
CreateDIBSection() のことかい?


421 名前:デフォルトの名無しさん :04/06/01 23:48
>>417
>>418, >>419とは別の視点でいくと…
コンボボックスの高さのサイズを、小さく設定しすぎてる。
昔、これではまったことがある。

422 名前:デフォルトの名無しさん :04/06/01 23:52
つーか、よくそんな長ったらしい行を4回も書く気になるなぁ。

423 名前:デフォルトの名無しさん :04/06/01 23:52
>>420
ありがとうございます
調べて使ってみます

424 名前:デフォルトの名無しさん :04/06/02 00:29
>>414
WinG を使ってみるとか。


425 名前:デフォルトの名無しさん :04/06/02 00:56
>>424
ググってもよく分かりませんでした
DIBSectionと同じものと考えてよいのでしょうか

426 名前:デフォルトの名無しさん :04/06/02 00:58
GetUserName()で取得できるユーザー名ですが、
WindowsXPでコントロールパネルから「ユーザー名の変更」を行っても、
変更前の名前が出てきます。
ログオン時に入力する名前や、スタートメニューに表示される名前は
変更後のものになっています。
しかし、環境変数 USERNAME も変更前の名前でした。

「ユーザー名の変更」に対応した名前を取得するにはどうすればいいんでしょうか?

427 名前:デフォルトの名無しさん :04/06/02 01:03
>>426
アカウント名、フルネームって知ってるか?
GetUserName()で取得できるのは、アカウント名だろ。
ログオン時に入力する名前や、スタートメニューはフルネームを表示しているだけ。

428 名前:デフォルトの名無しさん :04/06/02 01:04
>>426
GetUserNameExの方を使え

429 名前:405 :04/06/02 01:06
>>406 spy++でもいいけどさーって書き込もうとしたら
なんか書き込めないままバイトの時間になちゃてよー。

つーわけで >>367 へ。spy++でもいいけどさー。。。

430 名前:405 :04/06/02 01:15
いやちょと待てよ。SendMessage()されたメッセージは
メッセージキューには溜まんねーんだよな?
じゃあ,405の方法はまったく中途半端じゃねーか。
spy++の方が*断然*いいなー。。。

431 名前:デフォルトの名無しさん :04/06/02 01:21
Spy++知ってたら>>405見たいなレスしないだろ…

432 名前:405 :04/06/02 01:28
orz...

433 名前:デフォルトの名無しさん :04/06/02 01:30
そう、気を落とすな。



434 名前:405 :04/06/02 01:34
>>431
言い訳させて言い訳。
もれの spy++ がなぜか起動しなくなちゃたわけよ。
再インスコしても,アタシ全然だめーみたいな。
だからもれいつも405みたいにやってたり
WndProcの中であんなことやこんなことしたりしてる。うへへ。
spy++の事はぜんぜん頭に無くなったね。

435 名前:デフォルトの名無しさん :04/06/02 01:46
>>434
いっぺんレジストリ覗いてspi++関係の設定削除してみろ

436 名前:426 :04/06/02 01:59
>>427,428
ありがとうございます。早速試してみました。
とりあえず、自分のマシン(Windows2000)で、
EXTENDED_NAME_FORMAT に列挙されている値全てに対して
GetUserNameEx()を呼び出し、結果を画面に出してみました。
すると、
 SamCompatible - 'マシン名\ユーザー名'
 DnsDomain - Error 87
 あと全部 - Error 1332
となりました。
Error 1332 は ERROR_NONE_MAPPED らしいです。

問題のマシンでもテストするつもりですが、
ほとんどエラーになってしまったのが心配です。
テストしたソースを貼らせてもらいますんで、突っ込みあればお願いします。

437 名前:426 :04/06/02 02:01
#include <stdio.h>
#define _WIN32_WINNT 0x0500
#include <windows.h>
#include <Security.h>
struct named_format { EXTENDED_NAME_FORMAT id; char const* name; };
#define NAMED_FORMAT( Symbol ) { Name##Symbol , #Symbol }
struct named_format const formats[] = {
  NAMED_FORMAT( Unknown ),NAMED_FORMAT( FullyQualifiedDN ),
  NAMED_FORMAT( SamCompatible ),NAMED_FORMAT( Display ),
  NAMED_FORMAT( UniqueId ),NAMED_FORMAT( Canonical ),
  NAMED_FORMAT( UserPrincipal ),NAMED_FORMAT( CanonicalEx ),
  NAMED_FORMAT( ServicePrincipal ),NAMED_FORMAT( DnsDomain ),
};
#define NUM_FORMATS ( sizeof( formats ) / sizeof( formats[0] ) )
#define NAME_BUFFER_SIZE 1024
int main()
{
  int i;
  for( i = 0 ; i < NUM_FORMATS ; ++i )
  {
    struct named_format const* const format = &formats[ i ];
    TCHAR username[ NAME_BUFFER_SIZE ];
    ULONG buffer_size = NAME_BUFFER_SIZE;
    if( GetUserNameEx( format->id , username , &buffer_size ) )
      printf( "%s - '%s'\n" , format->name , username );
    else
      printf( "%s - Error %d\n" , format->name , GetLastError() );
  }
  return 0;
}

438 名前:デフォルトの名無しさん :04/06/02 04:16
インターネットの接続時間(継続時間)を取得したいんですが
どうやれば出来ますでしょうか?
レジストリとかから取得するんですかね?

439 名前:デフォルトの名無しさん :04/06/02 04:37
まず、「インターネットの接続時間」とやらを定義してみろ。

440 名前:438 :04/06/02 05:21
>>439
え〜と、ネットに繋いでいる時にタスクトレイのアイコンから
状態確認した時に「継続時間」と表示されているものが自分で取得したいんです。
取得できるAPI関数とかありますか?

441 名前:デフォルトの名無しさん :04/06/02 09:10
>>438
てか、>>439の質問の答えがわかれば、どうすりゃいいか分かるんじゃねーか?

442 名前:438 :04/06/02 10:42
>>441
さっぱりです。。。
一体どういう事なんでしょう?

443 名前:デフォルトの名無しさん :04/06/02 11:14
>>438
Win32_NetworkAdapterで検索してみな

444 名前:デフォルトの名無しさん :04/06/02 15:17
2つのレジストリハンドルが同じキーを参照しているかどうかを
チェック判断する方法を探しています。

とりあえず、ハンドルからキーのフルパスを取得して文字列を比較すれば
いいかなと思い RegXXX 系の API を調べてみたのですが、完全キー名を
取得できる API は見つかりませんでした。

何か良い方法は無いでしょうか?

445 名前:デフォルトの名無しさん :04/06/02 15:36
RegQueryInfoKeyで得られるすべての情報を比較するとか、
ハンドルを比較するという設計を見直すとか。

446 名前:デフォルトの名無しさん :04/06/02 16:31
int WINAPI WinMain(ry
{
  //LoadLibrary("user32.dll");
  ATOM atom = GlobalAddAtom("null po");
  if (atom != 0) GlobalDeleteAtom(atom);
  return nAtom;
}

user32.dllをロードしないとGlobalAddAtomが成功しないのは仕様なのでしょうか?

447 名前:446 :04/06/02 16:56
×return nAtom;
○return atom;

448 名前:デフォルトの名無しさん :04/06/02 21:02
え?


449 名前:デフォルトの名無しさん :04/06/02 21:22
>>446の環境では、user32.dllをロードすると、
そのコードでも行けるん??


450 名前:デフォルトの名無しさん :04/06/03 00:52
>>436
亀レス、スマソ。
NetUserGetInfo()を使えばおけ。USER_INFO_10のusri10_full_nameあたり。
GetUserNameEx()だとドメイン認証していないとだめだったね。

451 名前:デフォルトの名無しさん :04/06/03 03:33
今、半透明ウィンドウのコードを書いているんですが
一旦、半透明スタイルを設定していまうと
スタイルをもとに戻しても、重いままになってしまいます。
実際タスクマネージャーで見ると、設定前のCPU使用率より上がってしまったままになってます…
何か解決策はないでしょうか?

以下がコードです。

//半透明設定
SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
SetLayeredWindowAttributes(hWnd, 0, 128, 2);

//半透明解除
SetLayeredWindowAttributes(hWnd, 0, 255, 2);
SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) & ~WS_EX_LAYERED);

452 名前:デフォルトの名無しさん :04/06/03 10:00
>>451
MSDNの例示では、解除の時にRedrawWindowを呼んでるけど、
それでもダメ?

453 名前:デフォルトの名無しさん :04/06/03 10:21
スタイルを変更した後はSetWindowLong等を遣うべき

454 名前:デフォルトの名無しさん :04/06/03 10:40
っていうかAPIでそれ以外に何か方法あるの?
CWnd::ModifyStyleとかでなくて?

455 名前:デフォルトの名無しさん :04/06/03 11:55
XPて標準でZIP圧縮できますが、これを自分のソフトでDLL無しでやる方法を教えてください

456 名前:デフォルトの名無しさん :04/06/03 11:57
>>455
zip圧縮のロジックを実装するだけ。
どこかからパチってきてもいいけど。

457 名前:デフォルトの名無しさん :04/06/03 12:05
>>455
http://www.icsharpcode.net/OpenSource/SharpZipLib/

458 名前:デフォルトの名無しさん :04/06/03 12:29
>>455
zlibにzip圧縮・伸張のサンプルが付いてる

459 名前:デフォルトの名無しさん :04/06/03 12:31
というか、そのままzlibを使えばいいんじゃ・・・

460 名前:デフォルトの名無しさん :04/06/03 12:39
あの辺のライブラリって日本語ファイル名とか大丈夫だったか?

461 名前:デフォルトの名無しさん :04/06/03 12:46
>>460
ライブラリ側でパスの分割とかするわけじゃないから問題ないんでないの?
とりあえず、トラブッたことないなあ。

心配なら「表」とかの\を含むファイル名でテストしてみればいい。


462 名前:458 :04/06/03 13:24
>>459
だからzlibの使い方のサンプルがあると言ってるんだが

463 名前:デフォルトの名無しさん :04/06/03 13:30
>>455がzip圧縮をしたいのか、単に圧縮をしたいのかは微妙。

464 名前:451 :04/06/03 14:08
>>452
原因が分かりました。
裏DCバックバッファを使ってウィンドウにビットマップを描画してたのが原因らしいです。
どうやら、一旦裏DCに描画した後、表DCに転送する処理をして尚且つ、
半透明ウィンドウ設定をすると、いっきにCPU使用率が上がってしまうみたいです…
半透明設定をした場合でも、いきなり表DCに描画した場合は殆どCPU使用率は上がりませんでした。

裏画面使用時 :13〜16%
裏画面不使用時:0〜2%

みたいな感じになってました。
でも、処理の関係上どうしても裏DCを使って描画しないと
ちらついてしまうので、いきなり表には描画出来ないんですよね…

465 名前:デフォルトの名無しさん :04/06/03 14:37
ものにもよるが子ウィンドウとか張ってないならUpdateLayerdWindowで
裏DC(DibSection)から転送かければいいと思うが。
まぁ、メインメモリの転送速度とかでいろいろ負荷はあるが。

466 名前:デフォルトの名無しさん :04/06/03 15:30
スレッドの切り替えについて聞きたいんですが
現在のスレッドから、別のプロセスのスレッドに切り替わるのは
内部的にはプロセスの切り替えが行われているんですよね?

467 名前:デフォルトの名無しさん :04/06/03 15:37
>>466
なんでそんなこと聞くんだろうと思ったけど、
もしかして「プロセスは切り替わるけどスレッドは切り替わらない」可
能性を考えてる?


468 名前:デフォルトの名無しさん :04/06/03 15:43
>>467
いや、単純に
同一プロセス内のスレッドの切り替え⇒スレッドの切り替え(オーバーヘッド低い)
別プロセス間のスレッドの切り替え⇒プロセスの切り替え(オーバヘッド高い)

これで当ってますでしょうか?

469 名前:デフォルトの名無しさん :04/06/03 15:48
>>468
同一プロセスかどうかにかかわりなく、オーバーヘッドは同じ。

470 名前:デフォルトの名無しさん :04/06/03 15:52
>>469
マジっすか?
論理メモリ空間が変われば
いろいろとコンテキストに関わるデータを
レジスタに退避させたりして、忙しそうですが?

471 名前:デフォルトの名無しさん :04/06/03 16:03
>>470
スレッドが切り替わる場合、スケジューラ(スレッド管理する人)というプロセスに
切り替わるわけだから、

スレッドA→スレッドB ではなく、
スレッドA→スケジューラ→スレッドB だから、
スレッドが切り替わる時にはプロセスの切り替えが常に2回発生している。
スレッドAとBのプロセスが同じかどうかなんて関係なしに、手間は一緒。

472 名前:デフォルトの名無しさん :04/06/03 16:07
>>471
参考になりました。ありがとう

473 名前:デフォルトの名無しさん :04/06/03 16:11
うむ、Windows みたいな 1:1 スレッドだとスレッド切り替えもプロセ
ス切り替えも差はないかもね。

NetBSD や Solaris の N:M スレッドだと、同一プロセス間のスレッド
切り替えのほうが異プロセス間の切り替えより一般的に速くなります。



474 名前:デフォルトの名無しさん :04/06/03 17:04
ダイアログボックスのエディトボックスとコンボボックスから値を取得したいんですけどうまくいかないんです。
ソースは以下のような感じです。

long no1,no2;
int com;
省略
GetDlgItemText(hWnd,IDC_EDIT1,(char*)no1,sizeof((char*)no1));
GetDlgItemText(hWnd,IDC_EDIT2,(char*)no2,sizeof((char*)no2));
com = SendDlgItemMessage(hWnd,IDC_COMBO,CB_GETCURSEL,0,0);

一応グーグルトかで調べてみたんですけど、大体のところはこれと同じような書き方でした。
どこがおかしいんでしょうか?

475 名前:デフォルトの名無しさん :04/06/03 17:11
>>474
ようソースとMSDN見ろ。

476 名前:デフォルトの名無しさん :04/06/03 17:12
long を char* にキャストした時点で変だと思わんか?

477 名前:デフォルトの名無しさん :04/06/03 17:15
>>474
値を取得したいなら、GetDlgItemIntを使え

まぁ、それ以前の問題という説もありそうだが・・・

478 名前:デフォルトの名無しさん :04/06/03 17:33
CreateProcessやShellExecuteで作成したプロセスを終了させるにはどうすればいいのでしょうか?

479 名前:デフォルトの名無しさん :04/06/03 17:33
プライマリスレッドを殺そう

480 名前:デフォルトの名無しさん :04/06/03 17:37
CPUは逐次スレッドを読み込むだけだから
異なるアプリの論理空間のコードを読み込むには
OSがいろいろ動いて、実行環境をスイッチするわけなんですよね?

このOSが実行環境を整えるのに掛かるオーバーヘッドは、
同プロセスのスレッド切り替えと比較しても無視できるほどそんなに小さいものなんでしょうか?
>>469>>471のレスを読んでると、そう読み取れたんですが

481 名前:デフォルトの名無しさん :04/06/03 17:38
グーグルト

482 名前:デフォルトの名無しさん :04/06/03 17:41
>>478
まずプロセスにどうにかして終了してもらうようにお願いする。
(例えばGUIアプリならWM_ENDSESSIONとか)
それでもだめならTerminateProcess(素人にはオススメできない)

483 名前:デフォルトの名無しさん :04/06/03 17:42
>>478
TerminateProcess()で思いっきり終了させて下さい

484 名前:デフォルトの名無しさん :04/06/03 17:51
>>478
起動したプロセスのウィンドウハンドルを
つかまえてWM_CLOSE投げるとか。


485 名前:446 :04/06/03 17:59
>>449 遅くなってすみません。
動的、静的を問わず user32.dllがロードされていれば成功します。
2K SP4 と XP SP1 で試してみました。

それはさて置き

dll内で、グローバルオブジェクトのコンストラクタ中に
自身のリソースにアクセスしたいんですけど
そのdll名が変化する場合、GetModuleHandleでは無理ですよね。
VirtualQueryで取得したアドレスとかは保証されてないだろうし…
他に何か方法は無いでしょうか。

486 名前:デフォルトの名無しさん :04/06/03 18:01
>>480
何を知りたいのか、何を心配してるのかようわからんが、
そもそもスレッドの切り替えに要する時間そのものが無視できるほど微々たるもの。
スレッドの切り替えを大げさに考えすぎじゃないか?
基本的には数十個のCPUレジスタのロード,ストアだけで実行環境は切り替わる。

487 名前:デフォルトの名無しさん :04/06/03 18:04
それでも単純にスレッド切り替えをしているとGDIパフォーマンスが足りなかったので
NTではカーネルモードの高速スレッドスイッチングを実装してたような

488 名前:デフォルトの名無しさん :04/06/03 18:06
GDIがユーザモードからカーネルモードに移動した時には、
いろいろ問題あったなぁ。

489 名前:デフォルトの名無しさん :04/06/03 18:08
>>485
MFC環境か?なら↓だと思ふ。

http://www.microsoft.com/japan/msdn/library/ja/vccore/html/_core_exported_dll_function_entry_points.asp?frame=true

490 名前:478 :04/06/03 18:08
TerminateProcessはうまくいきました。
# ShellExecuteのハンドルでは駄目でしたが…

もうひとつの方はこんな流れでいいのでしょうか。
1. CreateProcessでプロセスを生成(hProcessを取得)
2. hProcessの持つウィンドウを検索(hWndを取得)
3. hWndに対してSendMessage(WM_ENDSESSION or WM_CLOSE)する
4. WaitForSingleObject(hProcess)で終了待ち。

それで2.はどうすればいいのでしょうか。
ウィンドウのキャプションで検索するのは不確実ですよね。

491 名前:デフォルトの名無しさん :04/06/03 18:12
タイムスライスの10msに比べれば、微々たるものだが、
頻繁にスレッド切り替えが発生するような設計なら無視できなくなるかも。
というか、その設計自体に問題がありそうだが。

492 名前:デフォルトの名無しさん :04/06/03 18:12
>>490
ShellExecuteではなくShellExecuteExを使う

493 名前:デフォルトの名無しさん :04/06/03 18:15
>>490
EnumWindows()とGetWindowThreadProcessId()の組み合わせでどうじゃろ

494 名前:デフォルトの名無しさん :04/06/03 18:19
スレッドやプロセスの切り替えオーバヘッドが気になるようなら、
Fiber を使いませう。



495 名前:446 :04/06/03 18:25
>>489
すいません、レス頂いて恐縮ですけど

MFC嫌いなんで使ってません。

496 名前:480 :04/06/03 18:31
みなさんレスありがとうございます。オーバーヘッド云々は
どうも、マルチプロセス環境のプロセス切り替えと
マルチスレッド環境のプロセス切り替えとを混同してたっぽい

497 名前:デフォルトの名無しさん :04/06/03 18:38
>>446
お前がどうやって成功しないと判断したのかかけ

498 名前:デフォルトの名無しさん :04/06/03 18:52
>>485
とりあえずGetLastErrorしてみたら?

499 名前:デフォルトの名無しさん :04/06/03 18:59
>>495
DLLのリソース取得するのに自分自身のHMODULEが必要だってんなら
DllMainの引数にあるやつどっかにとっとけば?

500 名前:446 & 485 :04/06/03 19:22
>>497
GlobalAddAtomとGetLastErrorの戻り値を MessageBoxで表示したときと
OutputDebugStringで表示したときと違ったから。
確かに user32.dllと決めつるのはマズイですね。

>>499
グローバルなオブジェクトのコンストラクタは
DllMainより前に呼ばれるんですよ。


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