Win32API質問箱 Build ..
446:デフォルトの名無しさん
07/03/04 12:31:58
>>445
ほんとC言語って移植性ねーな
447:デフォルトの名無しさん
07/03/04 12:32:48
どうして適当なこと言う奴が後を絶たないのか
448:デフォルトの名無しさん
07/03/04 12:39:03
.NETとかjavaみたいに分厚いフレームワークじゃないからなぁ
うっとうしいっちゃ鬱陶しいな
449:デフォルトの名無しさん
07/03/04 21:46:02
>>446
MISRA-C,SECとか見てるけど、
移植性ねーっていうけど、C言語自体はそれほど閉鎖的じゃない。
視野が狭いPGが多いだけであって・・・
450:デフォルトの名無しさん
07/03/04 21:47:19
446のようなバカが多くて困る。
451:446
07/03/04 21:50:43
そろそろカチンときそうです。
452:デフォルトの名無しさん
07/03/04 22:07:37
まったくだ。
色んな環境を熟知していて
頭のいいやつが細かいことにも様々な工夫を凝らせば
C言語は移植性が高いんだよ。
453:デフォルトの名無しさん
07/03/04 22:12:30
ifdefとtypedefの嵐で万事解決です
454:デフォルトの名無しさん
07/03/04 22:16:25
ifndefってなんて読むの?
イフンデフ?
455:デフォルトの名無しさん
07/03/04 22:31:59
タスクマネージャに表示されるような個々のプロセスのCPU使用率や
メモリ使用量を取得したいが、そんな関数あります?
456:デフォルトの名無しさん
07/03/04 22:34:07
はい
457:デフォルトの名無しさん
07/03/04 22:56:05
>449
C言語はそれほど閉鎖的じゃないけど
プログラマーはかなり閉鎖的だね
458:デフォルトの名無しさん
07/03/04 23:25:38
ありがと。Pdh系API使ってやります。
459:デフォルトの名無しさん
07/03/04 23:33:54
というかあらゆる処理系依存に精通していて
常に気を使うなんてやってられないだろ。
ガンガンに処理系やWin32APIに依存しちゃえよ。
460:デフォルトの名無しさん
07/03/05 00:23:19
HANDLEにクラスとかのポインタを結び付けれるAPIはありますか?
HWNDに対してのSetPropみたいなAPIを探してます
461:デフォルトの名無しさん
07/03/05 00:37:59
>>460
ハッシュテーブルにもっとけばいいだろ。
そんなのAPIに頼ることか?
462:デフォルトの名無しさん
07/03/05 00:42:59
>>461
HWNDに対してのSetPropの存在意義を256文字以内で説明せよ
463:デフォルトの名無しさん
07/03/05 00:45:24
>>461
SetProp の存在意義を否定してないか?w
464:デフォルトの名無しさん
07/03/05 00:51:22
いずれにしても残念ながらHANDLEに対するSetPropのようなものは存在しない。
自前で連想配列でも持っておくしかない。
第一HANDLEと言ってもカーネルハンドルからそうでないものまでいろいろあるし。
465:デフォルトの名無しさん
07/03/05 00:52:06
多分無い
どうせハンドルの類の整数値は一意なんだから適当に
mapみたいなデータ構造作っちゃえばいい
466:デフォルトの名無しさん
07/03/05 01:26:41
>>460
ちょっと調べただけなのだがSetTokenInformationがそれっぽい引数の取り方をしてなくもないとおもわれ
467:デフォルトの名無しさん
07/03/05 01:39:41
SetThreadTokenも要チェックや!!
468:デフォルトの名無しさん
07/03/05 02:59:43
ウィンドウのサイズが変更されたとき、決まった縦横比で固定されるようにするには
どうすればよいでしょうか?
469:デフォルトの名無しさん
07/03/05 03:23:18
計算する
470:468
07/03/05 03:28:21
>>469
もちろんそうなんですが、WM_SIZEで変更後のサイズを受け取り、それを基に
SetWindowPosで設定すると、その設定によって再びWM_SIZEが呼び出され続けて
どんどん小さくなる、といった現象が起こります・・・。
471:デフォルトの名無しさん
07/03/05 03:28:31
WM_POSCHANGING
472:デフォルトの名無しさん
07/03/05 03:30:55
>>470
想像して笑ってしまった。面白いことをやってるな
473:デフォルトの名無しさん
07/03/05 03:41:42
そもそも同じ比率になったのにルーチン呼び続けてる仕様が間違ってるんじゃ枚か
474:デフォルトの名無しさん
07/03/05 05:39:32
>>470
朝からちょっとワロタ
475:デフォルトの名無しさん
07/03/05 07:01:18
萌えるウィンドウだな
476:デフォルトの名無しさん
07/03/05 07:02:31
恥ずかしくて段々小さくなるウィンドウ
477:デフォルトの名無しさん
07/03/05 07:08:05
>>470
そっからは自分で頑張れ。
これを自力で解決できんようなら、プログラミングなんて他人にやらせとけ。
478:デフォルトの名無しさん
07/03/05 07:19:26
>>470
クライアント領域のサイズとウィンドウサイズ混同してないか?
あと計算はWM_GETMINMAXINFOとかWM_SIZINGでやれ
479:468
07/03/05 11:23:46
できました!
ありがとうございました!
480:デフォルトの名無しさん
07/03/05 11:44:48
そういう微笑ましいバグってなんだか面白い。
481:デフォルトの名無しさん
07/03/05 17:05:40
タスクバー上で動く時計を作っていたのですが、
case WM_TIMER :
GetLocalTime(&st);
wsprintf(str,TEXT("%d時%d分%d秒"),st.wHour,st.wMinute,st.wSecond);
SetWindowText(hWnd,str);
これだとちゃんと動くのですが、
case WM_TIMER :
GetLocalTime(&st);
wsprintf(str,TEXT("%d時%d分%d秒"),st.wHour,st.wMinute,st.wSecond);
InvalidateRect(hWnd,NULL,TRUE);
return 0;
WM_PAINT :
・・・
SetWindowText(hWnd,str);
こうWM_PAINTの方で他の文字表示処理と一緒に出力しようと思ったら、
最小化した時、あるいはCreateWindowでウィンドウを画面外に作成した時
などにちゃんとタスクバー上で動作しないのですがなぜでしょうか?
482:デフォルトの名無しさん
07/03/05 17:07:30
最小化したり画面の外へ追いやったりしたら、
ウィンドウの中を描画する必要が無いからWM_PAINTは呼ばれない。
483:デフォルトの名無しさん
07/03/05 17:11:36
>>482
即レスありがとうございます!><
てっきり描画の必要が無くても自分でInvalidateRectで送れば呼ばれるのかと思ってましたorz
484:デフォルトの名無しさん
07/03/05 17:15:10
拡張スタイルの WS_EX_LEFTSCROLLBAR についての質問です
同スタイルが動作する環境かを知りたいのです。MSDNで同スタイルは
「ヘブライ語やアラビア語などの読みの方向をサポートしている言語をシェル言語としているシステムで有効です。他の言語では、このスタイルは無視されます。」
と書かれていました
私の環境では同スタイルを定義すると動作するので
GetSystemMetrics関数でSM_MIDEASTENABLEDの引数を指定し戻り値がTRUEになると思っていたのですがFALSEでした
このことからヘブライ語やアラビア語をサポートしているシステムかどうかが取得出来ないので動作する環境かが判断出来ません
又、「他の言語では、このスタイルは無視されます」と書かれているので
動作不可環境では拡張スタイルに定義されていても動作しないようになっているのでしょうか
それとも拡張スタイルから同スタイルが削除されるのでしょうか
後者ならば拡張スタイルの同スタイルの有無を確認したらいいだけなのでサポート云々の話ではなくて簡単なのですが
私の環境では同スタイルが動作しているので確認も取れません
誰か詳しい方宜しくお願いします
485:デフォルトの名無しさん
07/03/05 17:32:58
メモ帳で、
ユダヤに対する冒涜かアラーに対する冒涜を記述して、
OSが再起動したら対応している。
486:デフォルトの名無しさん
07/03/05 19:01:25
ExtractIconExとDestroyIconについて教えてください。
以下のコードを実行し、大体4800回程アイコンハンドルの取得と解放を
繰り返すと、ExtractIconExが失敗するようになってしまいます。
解放の仕方を間違えているのでしょうか。
Dim lngCount As Long
Dim lngIconHandle(0) As Long
Dim lngRet As Long
Do While True
lngRet = ExtractIconEx(App.Path & "\test.ico", 0, 0, lngIconHandle(0), 1)
If lngRet <> 1 Then
Stop
End If
lngRet = DestroyIcon(lngIconHandle(0))
If lngRet = 0 Then
Stop
End If
lngCount = lngCount + 1
Loop
487:デフォルトの名無しさん
07/03/05 19:35:01
>>486
ngRet = ExtractIconEx(App.Path & "\test.ico", 0, 0, lngIconHandle(0), 1)
を
ngRet = ExtractIconEx(App.Path & "\test.ico", 0, 0, lngIconHandle(0), 0)
にしたら
488:486
07/03/05 19:53:36
>>487
4800くらいで失敗してしまいます。
ちなみに、アイコンを一個取り出すから
最後の引数に1と書いていたのですが、
0にしてみても普通にアイコンハンドルが取得できました。
ここを0とするとどうなるのでしょうか?
489:デフォルトの名無しさん
07/03/05 20:07:19
0でなく1で正しい。第三引数を0にしてるのが悪いんでないか
Dim lngCount As Long
Dim lngIconHandle(1) As Long
Dim lngRet As Long
Do While True
lngRet = ExtractIconEx(App.Path & "\test.ico", 0, lngIconHandle(1), lngIconHandle(0), 1)
If lngRet <> 1 Then
Stop
End If
lngRet = DestroyIcon(lngIconHandle(0))
If lngRet = 0 Then
Stop
End If
lngRet = DestroyIcon(lngIconHandle(1))
If lngRet = 0 Then
Stop
End If
lngCount = lngCount + 1
Loop
490:デフォルトの名無しさん
07/03/05 20:09:39
ExtractIconEx の宣言と DestroyIcon の宣言はどーなってるん?
# DestroyIconの引数が byRef になってて、iconハンドルへのポインタ渡してるんじゃねーの?
491:デフォルトの名無しさん
07/03/05 20:14:23
それなら最初のDestoyIconでエラーになるんじゃね?
492:デフォルトの名無しさん
07/03/05 20:16:48
シングルスレッドのGUIアプリでGetOpenFileName()を呼び出したところ、
ダイアログの処理用と思われるスレッドが幾つか生成されました。
OpenFileのダイアログを閉じてメインウィンドウに戻ったあと、
メインウィンドウの×を押してWM_DESTROYを発生させ、
WindowProcのWM_DESTROYでPostQuitMessage(0)を呼びました。
メッセージループは正常に終了し、
自動的にExitThreadが呼ばれてスレッドが終了したところまではデバッガで確認できました。
しかし、ダイアログの処理用と思われるスレッドが残っています。
残ってしまう原因にお心当たりある方はいらっしゃいませんか。
493:486
07/03/05 20:17:03
>>489
失敗します。
ExtractIconExの戻り値が0になってしまいます。
GetLastErrorの結果も0でした。
>>490
↓の様になっております。
アイコンハンドルの部分は、ExtractIconExの方はByRef、
DestroyIconの方はByValです。
' アイコンハンドルを取得
Private Declare Function ExtractIconEx Lib "shell32.dll" Alias "ExtractIconExA" _
(ByVal lpszFile As String, _
ByVal nIconIndex As Long, _
ByRef phiconLarge As Long, _
ByRef phiconSmall As Long, _
ByVal nIcons As Long) As Long
' アイコンハンドルを破棄
Private Declare Function DestroyIcon Lib "user32" (ByVal hIcon As Long) As Long
ちなみにCで書いてみたら問題なく動いているのでマシンのせいではなさそうです。
494:デフォルトの名無しさん
07/03/05 21:24:59
>>492
複数回GetOpenFileNameを呼ぶと、
同じスレッドで処理されているのかな?
流用利用って事で
(前回開いたパス情報等の保持として・・)
・・・内部でCOMを呼んでたりして。
495:デフォルトの名無しさん
07/03/05 21:45:56
>>492
たぶん正常な動作 ms謹製のnotepadでもスレッドが残る
496:デフォルトの名無しさん
07/03/05 21:51:31
>>495
初めて知った。すごい仕様だな…
497:デフォルトの名無しさん
07/03/05 21:58:40
>>494-496
ありがとうございました。
素敵すぎる仕様のようで、諦めて従います・・・・・・
498:494
07/03/05 22:10:03
今、メモ帳アタッチしてみたけど、
スレッドは流用してないみたいだなぁ。
499:デフォルトの名無しさん
07/03/05 22:29:32
>>493
>ByRef phiconLarge As Long, _
なのに
>lngRet = ExtractIconEx(App.Path & "\test.ico", 0, 0, lngIconHandle(0), 1)
と呼び出してるが、
(BASIC? の仕様次第だけど)リテラルに対する参照渡しはどうなんだろ?
→参照されてる
→一時オブジェクトを作り値代入し、その一時オブジェクトへのポインタを渡す
という動作なら、ラージicon のハンドルが漏れてる
500:デフォルトの名無しさん
07/03/05 22:46:27
>>486
失敗したとき、GetLastError()の値は?
501:500
07/03/05 22:49:14
>>499
ByRef phiconLarge As Long
↓
phiconLarge As Any
んで、ExtractIconEx(App.Path & "\test.ico", 0, byval 0, lngIconHandle(0), 1)
だっけ?VBは?
502:499
07/03/05 22:54:42
>>501
VBにはヌルポ用に vbNull っつーのが存在してる記憶があるが、
そいつの呼び出し側が ByRef 用なのかどうか記憶あいまい。
As Any で 呼び出し時に byval 0 のような明示記法は初見
# っつーても俺は VB 素人に近いのでわからにゃいw
503:デフォルトの名無しさん
07/03/05 23:00:39
>>495
APIの質問ではなくスレ違いで申し訳ないんですが、お教えください。
残っているスレッドをどのようにして知ることができるのでしょうか?
現在、以下のようなトラブルで悩んでおります。
発生条件がまだ絞り込めてないのですが、Vistaでexplorerからディレクトリを削除するときに
「他のプロセスで使用中のため削除できません」(みたいな意味の)エラーで削除できない場合が
あります。そのディレクトリは自分のプログラムでOpenFileDialogでファイルを開いたディレクトリ
なのですが、タスクマネージャのプロセスタブで見る限りプログラムは終了しています。
スレッドだけが(問題のディレクトリをカレントにして)いつまでも残っているなんてことがあるのか
疑問なんですが、残っているスレッドが確認できればこれが確認できるかと。
よろしくお願いいたします。
504:デフォルトの名無しさん
07/03/05 23:04:26
>>499 の心配は>>489 で払拭されてると思われ
>>501
As AnyだとRefかValかを関数引渡し時にByValを指定すればポインタか値かを決められる。ByVal 0& でヌルポインタとなるはず
505:デフォルトの名無しさん
07/03/05 23:10:31
>>503
API的な回答じゃなくていいのならProcessExplorerでさっくり見れる
>スレッド
vistaは判らないけど、それ以前のOSのことを考えれば
スレッドは所詮プロセスの枠の中の存在だから独立することはない
506:500
07/03/05 23:14:34
>>502
vbNullはVT_NULLで、tagVARIANT型メンバのVARTYPE値ですな。
(vbNullをキャストすると1になる)
SQL等で対応するキャラみたい。
んで、VB側でByRef書いてると、VARTYPE値のVT_BYTEREFが
ORでたっちゃうんかと。
>>As Any で 呼び出し時に byval 0 のような明示記法は初見
CopyMemoryでそれしてるサンプル見たことがあったので・・・
CでDLL作って、Declare評価しねーかなー
507:503
07/03/05 23:14:36
>>505
ありがとうございます。
>スレッドは所詮プロセスの枠の中の存在だから独立することはない
のはずですよね・・・・・・・
508:デフォルトの名無しさん
07/03/05 23:20:13
>>507
UnLockerで、捕まえてるプロセス名を調べてみ?
URLリンク(ccollomb.free.fr)
509:デフォルトの名無しさん
07/03/05 23:23:07
>>503
OpenFileDialogでファイル名を取ってきたあと、
何もしない場合でもその症状?
それとも、特定の処理(ファイル読み込みなど)後で、
その症状?
切り離して考えてみ?
510:486
07/03/05 23:30:37
>>499-501
解決しました。
どうもありがとうございました。
ラージアイコンの方は、MSDNに「必要ない場合、NULL を指定します。 」と
あったので単純に0としていましたが、仰るとおりだったようです。
VarPtr(0)は0ではないため、どこかに漏れてたようです。
>>501の方法でうまく動きました。また、
ByRef phiconLarge As Long
↓
ByVal phiconLarge As Long
として
ExtractIconEx(App.Path & "\test.ico", 0, 0, lngIconHandle(0), 1)
でもうまく動きました。
どうもありがとうございました。
511:デフォルトの名無しさん
07/03/05 23:33:55
>>510
おめ
512:503
07/03/05 23:37:33
>>508 >>509
コメントありがとうございます。
現在自宅のため、確認は明日以降になります。
513:デフォルトの名無しさん
07/03/06 00:54:29
CNNのアンケートでチョンの反撃が始まって、日本謝罪すべしの票が増えてきてます。
投票まだの方はよろしくお願いします。
それと、このレスをそこらへんのスレにコピペして下さると助かります。
あわせてお願い申し上げます。
URLリンク(edition.cnn.com)
QUICK VOTE
Should Japan apologize again for its World War II military brothels?
(日本は、第二次世界大戦時に軍が運営した売春宿の件で再び謝罪するべきですか。)
もちろん No
514:デフォルトの名無しさん
07/03/06 01:36:24
すみません、HANDLEと64bit OSの関係で質問させてください。
HANDLEでCreateEvent()の返戻値を格納しているソースを見ていたのですが、関数の受け渡しの途中でHANDLE32に型が変わっていることに気付きました。
これ、Vista 64bit環境でも無事に動くんでしょうか?
・Vista 64bitでHANDLE32とHANDLEのサイズは同じかどうか
・64bit環境ではHANDLE→HANDLE32への受け渡しは32bitぶん消えてしまう?
という点、どなたかご存じないでしょうか?実際には動いているっぽいのですが、いまいち確証がないのです。
(XPとVistaの64bit環境で同じかどうかも不明です・・・)
515:デフォルトの名無しさん
07/03/06 01:42:17
32bitアプリとして動かすならたぶん問題ない
WoWとかいうのが全部面倒みてくれる
516:デフォルトの名無しさん
07/03/06 01:58:53
>>515
ありがとうございます。WoWでうまくエミュレートしてくれるんですね。
逆に言うと、64bitアプリ(見ていたのはdllでした)として動いているのであれば、問題が発生しそうだといえますね。
517:デフォルトの名無しさん
07/03/06 03:58:06
上のほうにMFCを利用したフルスクリーン描画方法がありますが、MFCは使わず、
Win32apiだけでフルスクリーン(クライアント領域をディスプレイ全体にする?)には
どうすればよいでしょうか?
518:デフォルトの名無しさん
07/03/06 04:58:49
>>517
>>176、>>189を参考に見たまんまだけど
void ChangeFullscreen(HWND hWnd) {
RECT rect;
GetWindowRect(GetDesktopWindow(), &rect);
SetWindowLong(hWnd, GWL_STYLE, WS_POPUP|WS_VISIBLE);
SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, rect.right-rect.left, rect.bottom-rect.top, SWP_SHOWWINDOW);
}
519:517
07/03/06 05:20:38
>>518
うおー!
ありがとうございます!
GetDesktopWindow() が肝ですね!
520:デフォルトの名無しさん
07/03/06 07:42:09
個人的には、MonitorFromWindow->GetMonitorInfoを推奨したい。
521:デフォルトの名無しさん
07/03/06 10:24:54
>>520
だね。メインディスプレイでしかフルスクリーンにできないアプリって嫌い。
522:デフォルトの名無しさん
07/03/06 10:52:26
2台もモニター買う金も置くスペースもねーんだよバーカバーカ
523:デフォルトの名無しさん
07/03/06 11:05:28
モニタ4台でマルモニしてますが何か?
524:デフォルトの名無しさん
07/03/06 11:09:44
>>522
高望みしなけりゃどうにかなるもんだぞ。
525:デフォルトの名無しさん
07/03/06 11:14:48
マルチモニターとか利点がわからない
526:デフォルトの名無しさん
07/03/06 11:33:32
>>525
フルスクリーンアプリケーションのデバグには良いと思うけど、私には使い道がない。
527:デフォルトの名無しさん
07/03/06 11:39:49
片側にアップスキャンコンバーターとビデオ繋いでテレビ見ながらいろいろ出来る
528:デフォルトの名無しさん
07/03/06 12:05:34
>>525-526
作業机の面積が広いに越したことはないだろ?
マルチディスプレイもそんな感じ。
マルチディスプレイは便利になるっていうよりは快適になるって感じ。
529:デフォルトの名無しさん
07/03/06 12:16:17
>>492
初期化時にCoInitialize()、終了時にCoUninitialize() 呼んでみたらどうかな?
どうもGetOpenFileName()がCOMを使っているらしいぞ。
530:デフォルトの名無しさん
07/03/06 13:08:26
529
場所誤ると、ハングらないか?
531:517
07/03/06 13:57:10
フルスクリーンにする前のウィンドウの位置と大きさを控えておき、フルスクリーンからその
サイズにSetWindowPosで直すと、クライアント領域だけのウィンドウになってしまい
にっちもさっちもいかなくなってしまいます・・・。
どうすれば通常のウィンドウに復帰できるでしょうか?
>>520
参考にします。
532:デフォルトの名無しさん
07/03/06 14:00:33
>>531
>>518のコードが何やってるか考えればわかるだろ
533:517
07/03/06 14:13:46
>>532
失礼しましたm(_ _)m
534:デフォルトの名無しさん
07/03/06 15:24:50
Windows Media Player 10
を使っているのですが、
10用のSDKってもう無くなってるみたいなんですが、
9用のSDKでも大丈夫でしょうか?
11用は落とせるようにはなっていないみたいですが・・・
535:デフォルトの名無しさん
07/03/06 15:31:00
COMはSTAのときCoInitializeで初期化したスレッドでメッセージをディスパッチしてやらないとハングするんだっけ
536:デフォルトの名無しさん
07/03/06 15:51:11
とあるスレッドでGetMessageしたメッセージを、他のスレッドで Dispatch するのはCOMに限らずダメ。
537:デフォルトの名無しさん
07/03/06 17:06:17
>>415
亀レスすみません。ありがとうございます。
贅沢言ってすみません。
538:503
07/03/06 17:24:28
>>505 >>508 >>509
おかげさまで原因が特定できました。>>509の書かれたとおりOpenFileDialog
が原因ではなく、その後の処理に起因するものでした。
結論だけ書くと・・・
消せないディレクトリをカレントにしてconime.exeが動きっぱなしになっているようです。
詳細に書くと・・・・
今回問題となっているプログラム(Prog1.exeとする)は、OpenFileDialogでユ
ーザーが指定したファイルを処理するために、指定したファイルのあるディレ
クトリをカレントにしてProg2.exeをCreateProcessします。Prog2.exeはコン
ソールプログラム(SW_HIDEでDOS窓は表示されず、STARTF_USESTDHANDLESで出
力をパイプ経由でProg1が受け取るのでユーザーに目には触れない)のため、こ
れが起動されたとき、conime.exeが(まだ起動してなければ)起動されます。そ
して、Prog2.exe/Prog1.exe終了後もconime.exeは終了せずに残り、以降に起
動されたコンソールプログラムで使いまわされるようです。
つまり、
(1) ログイン後初めて実行されるコンソールプログラムを親としてconime.exeが起動する。
(2) (1)の親プログラム終了後もconime.exeは終了しない。
(3) 2つめ以降のコンソールプログラムはこのcomime.exeを使用する。
という動作をし、これはXPでもVistaでも同じようです。
Vistaだけで問題が起きたのは、
XP:conime.exeは親に関係なくC:\Windows\System32をカレントにして起動される
Vista:comime.exeは(1)の親のカレントをカレントとして起動され、その後移動しない
の違いがあるためです。
Vista環境でProg1->Prog2が最初のコンソールプログラムの場合、ユーザーの
指定したファイルのディレクトリにconimeが居座るためこのディレクトリが削
除できなくなっているわけです。
「Vistaの問題だ!」と言いたいところだが、さてどう対策したものか・・・・・・
Prog1起動時に、C:\でもカレントにしてダミーのコンソールプログラムを動かしとくかなあ(涙)
539:デフォルトの名無しさん
07/03/06 17:42:11
>>538
私見だけど;
GUIアプリではカレントディレクトリを常に当たり障りのないトコに設定しとくべき。
OpenFileDialog 等、カレントディレクトリが移動されそうな処理の後には再設定も行う。
これを怠ると「なぜこのフォルダが消せない!」ということが頻発するから。
540:503
07/03/06 18:01:19
>>539
コメントありがとうございます。
Prog2がコンソール(CUI)アプリといところが味噌でして・・・・
(これを書くと関係者が見てたら身元がバレそうだが)
実は上記のProg2は(組み込みマイコン用のクロス)コンパイラであり、処理するファイルは
ソースファイルなんです。
#include 等を適切に処理するために、カレントをそれなりの場所にして起動する必要があります。
541:デフォルトの名無しさん
07/03/06 18:24:15
なるほど。
ダミーで cmd /c exitとか動かしておくしか手が無さそうですね。
KBの↓なんかもひどい解決方法・・・
URLリンク(support.microsoft.com)
542:503
07/03/06 18:33:45
>>541
>URLリンク(support.microsoft.com)
思わず爆笑。
543:デフォルトの名無しさん
07/03/06 18:59:41
なんだかよくわからないけど
Prog2のカレントディレクトリをC:\とかにして起動して
起動後にカレントディレクトリ変えるんじゃだめなのか?
全然見当違いなこと言ってたらすまん
544:デフォルトの名無しさん
07/03/06 19:03:00
なるほど。
バッチファイルを挟むという手はあるな。
・・・俺は馬鹿か
545:デフォルトの名無しさん
07/03/06 19:20:27
試してないけど、conime.exeを先に起動しとくとかは?
546:デフォルトの名無しさん
07/03/06 19:46:01
それが541の解決法
547:デフォルトの名無しさん
07/03/06 19:51:42
>>540
CreateProcessって子プロセスのカレントディレクトリをパラメータで指定できたから
親のカレントディレクトリを移動する必要はないんじゃない?
>>545
それが>>541
548:デフォルトの名無しさん
07/03/06 20:01:24 BE:124224588-2BP(222)
>>545
それが
>URLリンク(support.microsoft.com)
だろ。
日本語版見たらもっとひでーw
URLリンク(support.microsoft.com)
549:デフォルトの名無しさん
07/03/06 20:10:34
>>503
CreateProcessでProg2を起動しているんだったら
CREATE_NO_WINDOWフラグを入れるのは?
あとは、終了時にWM_CLOSEをconime.exeに投げたり
conime.exeをkillする手もある。
550:503
07/03/06 20:45:07
>>543-549
コメントありがとうございます。
(直接APIの事でないのに、こんなに盛り上がっていいのか・・・・)
Prog2は他社製のため手を入れられませんが、>>544の書かれているように
間にバッチなりコンソールアプリなりを挟んでそこでC:\→目的のディレクトリ
を行うのはいい方法ですね。
>>538の最後に書いたのも、>>541も>>544もconime.exeを予め問題の無いディレクトリで
起動しとくという点では同じ考えで、あとはどれが一番美しいかですね。検討してみます。
>>547
CreateProcessでの子プロセスのカレント指定は既に使用しています。
(conime.exeが影響されるのは子プロセスのカレント)
親のカレントもファイルを選択した時点で同じディレクトリに移動させていますが、
逆に親が動いている間はそのディレクトリを消されたくないので、(消極的な方法ではあり
ますが)そのようにしています。
>>548
>URLリンク(support.microsoft.com)
もっと大爆笑!
>>549
>CREATE_NO_WINDOWフラグを入れるのは?
で、conime.exeが起動されなければ一番よさそうですね。試してみます。
>あとは、終了時にWM_CLOSEをconime.exeに投げたり
>conime.exeをkillする手もある。
実際にProcessExplorerからconime.exeをKillしてみると(当然のことながら)ディレクトリ
を削除できるようになりました。ただ前にも書いたように一つのconime.exeが全ての
コンソールアプリで使いまわされているようなので、この時に他のコンソールアプリが
動いている可能性を考えると、この手は使えません。
551:503
07/03/06 21:44:28
>>549
>>CREATE_NO_WINDOWフラグを入れるのは?
>で、conime.exeが起動されなければ一番よさそうですね。試してみます。
とりあえずXP環境で確認したところ、CREATE_NO_WINDOWでconime.exeは起動されなくなるようです。
Vistaは明日確認。これでOKなら万事解決!感謝!
このスレに最もふさわしい解決方法ですね。
(言い訳しとくと、このプログラムの初版は1998年。当時CREATE_NO_WINDOWなんて無かった・・・)
552:503
07/03/06 22:27:06
余談だが、VisualStudio6のIDEでビルドを行った時もconime.exeが起動され、IDE終了後も残る。
VistaにVS6入れる人なんてほとんどいないと思うが、プロジェクトのディレクトリが
削除できなくなるんだろうなあ。
553:デフォルトの名無しさん
07/03/06 22:32:35
DETACHED_PROCESSでもコンソールウィンドウは表示されなくなるが、
CREATE_NO_WINDOWとは何が違うのだろう。(conimeについては未確認。)
554:デフォルトの名無しさん
07/03/06 23:15:11
Vista に 6.0 入れてるよ俺…
明日試してみるか orz
555:デフォルトの名無しさん
07/03/07 04:58:35
デュアルブートしてるXPにインストールしたVC6のコンパイラだけ借りてる
556:デフォルトの名無しさん
07/03/07 09:10:10
コンパイラを使っている方のOSは何
557:503
07/03/07 13:36:06
Vista環境で、CREATE_NO_WINDOWによりconime.exeが起動されなくなり、ディレクトリが消せなく
なる問題が解決することを確認できました。
また、>>538の状況やCREATE_NO_WINDOWでの対策が有効なことは、Vista-x64のWOW64
環境下でも同じであることを確認しました。
万事解決。皆様に感謝。
>>552がデマだったらまずいんで自分でも確認してみたら、やはりVista環境でログイン後の最初に
VS6-IDEからビルドを行ったプロジェクトのディレクトリは削除できなくなりました。
558:デフォルトの名無しさん
07/03/07 15:50:15
ポップアップメニューで、特定の項目についてのみ、クリックしてもポップアップが閉じない
(メッセージは送信する)ようにするにはどうすればよいでしょうか?
559:デフォルトの名無しさん
07/03/07 17:22:36
>>558
よくある感じだと [OK] [APPLY] [CANCEL] の [APPLY] ってこと?
560:558
07/03/07 17:27:10
>>559
そうです!
あの感じです!
561:デフォルトの名無しさん
07/03/07 17:38:14
>>560
メインウインドウに PostMessage するのはダメ?
562:558
07/03/07 17:58:15
>>561
それは具体的にはどういうことでしょうか??
563:デフォルトの名無しさん
07/03/07 18:04:11
「MFS_CHECKED になりえるメニューアイテムがあって、開きっぱなしのままトグル動作したい」
POPUP しなおす / POPUPメニューを止めて、ダイアログで実装
すきなのえらべ
564:558
07/03/07 18:17:16
>>563
やはりその二つですか〜。
ありがとうございました!
565:デフォルトの名無しさん
07/03/08 00:13:13
CreateProcessのCREATE_NO_WINDOWフラグって
VC7でないと使えない?
MSDNの2000年版にすらそのフラグは存在してないんだが。
566:デフォルトの名無しさん
07/03/08 00:14:42
自分で定義すりゃ何ででも使える
567:デフォルトの名無しさん
07/03/08 00:15:18
以前は非公開だったってだけだな
568:デフォルトの名無しさん
07/03/08 00:15:31
そっか
逆にOSは2000以上限定ですかね?
569:デフォルトの名無しさん
07/03/08 00:29:18
9xだって動くんだい
570:デフォルトの名無しさん
07/03/08 00:34:34
>>565
なるべく新しいPlatform SDKを入れてみろ
571:デフォルトの名無しさん
07/03/08 00:41:56
VC6なら、ほどほどに新しいもの(2003febだったか)を
入手する必要があるぞ(w
572:デフォルトの名無しさん
07/03/08 07:21:54
>>565
VC6 SP6でもちゃんとwinbase.hで定義されてるし、VC6用最終のMSDN Oct.2001には載ってる。
Win9xも対象にしたいならDETACHED_PROCESSでも使え。
(CREATE_NO_WINDOWと何が違うのかは知らんが。)
573:デフォルトの名無しさん
07/03/08 08:11:37
リダイレクタ作った時、CREATE_NO_WINDOWを指定したら、
コンソール窓が開かなくなったが・・
憶測だけど。
574:デフォルトの名無しさん
07/03/08 11:01:47
質問があります。
とあるファイルパスが、
ショートファイルネーム形式か、
ロングファイルネーム形式かを判定する関数ってありますか?
あれば、関数名を教えていただきたいです。
もしなければ、皆様はどのようにして判定しているのでしょうか?
(~を検索?)
575:デフォルトの名無しさん
07/03/08 11:08:01
>>574
GetFullPathName
GetShortPathName
576:574
07/03/08 11:58:35
>>575
この2種の組み合わせで検討してみます。
ありがとうございます。
577:デフォルトの名無しさん
07/03/08 17:31:27
タイマーの調子が悪いんですが
SetTimerとKillTimerを繰り返していたら処理落ちするとかありますか?
578:デフォルトの名無しさん
07/03/08 17:33:38
>>577
ソースあげ
579:デフォルトの名無しさん
07/03/08 17:47:43
>>578
pはsageです。
URLリンク(www.uploda.org)
580:デフォルトの名無しさん
07/03/08 18:15:54
Windowsは知らんのだけど、これってタイムアウト前に再度SetTimer()したらどうなるんだ?
なんとなく、一度目のタイムアウトで二度目のタイマーまでKillしてしまうような気がするのだが。
#つーか、毎回毎回KillTimer()しないといけないもんなのか?
581:579
07/03/08 18:25:10
>>580
じゃあKillするに相応しいメッセージはなんなんだろう。
582:デフォルトの名無しさん
07/03/08 18:29:49
そもそも何を持って処理落ちしてると判断したんだ
583:デフォルトの名無しさん
07/03/08 18:32:25
あと、SetTimer時の戻り値を保存しておいてそれを使ってKillして
その変数をタイマーの有無に使えば2重に作ったり消したりは防げないか
584:デフォルトの名無しさん
07/03/08 18:37:18
SetTimerとKillTimerでタイミングを制御していること自体が「処理落ち」の原因だと思うけど。
585:579
07/03/08 18:40:03
根本から間違ってたわけですか。
タイマーってかなりメモリ使いそうだからいちいちKillしてた。
そこに原因があったのかもしれません。
ありがとうございます。
586:デフォルトの名無しさん
07/03/08 18:40:40
Userメッセージ使ってもいいしな。
しかし、InvalidateRect使っててUpdateWindowしてないからな気もするな
587:デフォルトの名無しさん
07/03/08 18:40:55
>>580
タイムアウトまでに再度SetTimerしたら
そのタイマが既存のタイマに取って代わる。
その場合既存のタイマのタイムアウトが経過してもメッセージは流れない。
588:デフォルトの名無しさん
07/03/08 18:46:57
>>585
SetTimerは確かにユーザーオブジェクトとしてはかなりリソースを使う方だし
そもそもコールバック使わない場合、WM_TIMER自体のメッセージ優先度が低いから
精度もかなり酷い(スレッドのメッセージ処理が空いた時にしか投げられない)。
ソース見てないから適当な事言うけどウェイタブルタイマに置き換える事は出来ないの?
589:579
07/03/08 19:07:05
MouseMoveに詰め込みすぎたかもしれません。
60行近くあったんだけど、
消したら割りとスムース。
>>586
それも忘れてました
>>588
ウェルタ・・・難しそうだ。
590:デフォルトの名無しさん
07/03/08 19:12:42
>>588
SetTimerはコールバック使っても一緒だよ。
>>577
「調子が悪い」なんて抽象的に言われても分からん。
質問するときは、もっと詳しく書かないと駄目。
591:579
07/03/08 19:18:17
>>590
サーセン。ありがとうございました。
592:デフォルトの名無しさん
07/03/08 19:19:52
ちょっとソース見てみたけど、WM_MOUSEMOVEでInvalidateRectしてるのが
いけないんじゃない?
593:デフォルトの名無しさん
07/03/08 19:55:01
Windows Mobile 5.0向けのアプリケーションを作っています。
HTTPサーバ上にあるXMLを読み込みたいのですが、
XMLHTTPあたりを使えばできますか?
594:デフォルトの名無しさん
07/03/08 20:00:05
ソケット生成、データ受信、構文解析で出来る。
595:デフォルトの名無しさん
07/03/08 20:00:34
>>577のソース見てみようと思ったら消してやがる・・・
>>593
これ使えばいいかなって思うのがあるならまずやってみれ
596:579
07/03/08 20:09:11
>>592
それだ!THX!595悪いね。恥ずかしいから
597:デフォルトの名無しさん
07/03/08 20:17:20
じゃ、代わりに上げておくか。
598:579
07/03/08 20:42:02
その流れ秋田
599:デフォルトの名無しさん
07/03/08 22:58:08
cmdから叩けばprintfでコンソールに値を出せて、
ダブルクリックで起動したらウインドウ無しで常駐できるアプリは作れますか?
WinMainで作るとコンソール出せなくてダメで、
コンソールアプリとして作るとどうしてもウインドウがでちゃうの
600:デフォルトの名無しさん
07/03/08 23:40:09
AttachConsole?
601:デフォルトの名無しさん
07/03/08 23:45:30
たしかwinアプリでコンソールに出力するなら、AllocConsoleのあと、
freopenでstdoutを"$COUT"で開き直すんだったはず
でも起動方法で分岐するとなると分からん
602:デフォルトの名無しさん
07/03/08 23:49:52
STARTUPINFOとか臭いな と調べもせずにいってみる
あと親プロセスがコンソールか否かを調べるとか
603:デフォルトの名無しさん
07/03/08 23:58:34
試しにぐぐってみたらこんな記事が
URLリンク(is3000nx.seesaa.net)
604:デフォルトの名無しさん
07/03/09 00:31:49
URLリンク(karinto.mine.nu)
試しに作ってみた。
605:デフォルトの名無しさん
07/03/09 06:11:21
ウィンドウクラスについて質問なのですが、
ローカルウィンドウクラスを登録する場合、
他のプロセスですでに登録されているウィンドウクラスの名前を使っても問題ないのですよね?
606:デフォルトの名無しさん
07/03/09 06:26:44
問題ない
607:デフォルトの名無しさん
07/03/09 08:14:55
>>599
パイプ作って、STARTUPINFOについないで、
CreateProcess
608:デフォルトの名無しさん
07/03/09 13:29:28
色々と調べた(実行、検索)のですがわからないので、どなたかお教え願います。
プラットフォーム:VB6
質問に関係するAPI名:SetMenuItemBitmaps
作業内容:メニューにアイコンを表示する
アイコン表示そのものはうまくいっています。
しかし、アイコンのサイズが16x16のBitmapなのに対して
メニューの各項目の表示幅が12程度しかないため、
Bitmapが全て表示されない(左上を基点として、半分程しか表示されていない)と
いう状態に陥っています。
設定後、DrawMenuBarで更新してみましたがそのままでした。
質問は以下の通りです。
・メニューの各項目の縦幅を任意に変更できるか?(ChangeMenu、ModifyMenuでは無理のようですね…)
・Bitmapのサイズに合わせて、メニューをうまく表示させる方法は?
以上、どなたかお教え願います。引き続きあれこれやっていくつもりなので、もし自己解決しましたら
その時点ですぐにこちらに解決したことを報告いたします。
609:デフォルトの名無しさん
07/03/09 13:31:59
>>599
winアプリで作って、コンソールからは、
winアプリ|more
で使うしか方法はないんちゃうか
GetStdHandleで判定
610:デフォルトの名無しさん
07/03/09 13:40:29
そもそもダブルクリック起動かどうかなんて判定取れない
611:デフォルトの名無しさん
07/03/09 14:31:49
>>608
標準のWindowsの設定ではメニューの縦幅は16pxのアイコンがきっちり入るから
12pxってのは設定いじった結果なのか、よくわからないけど、
オーナードローでメニューをイチから描画するのが、
一番自由度は高くて、メニューの高さも幅もアイコンも全部自由に管理できる
612:デフォルトの名無しさん
07/03/09 14:33:47
なんか読点多くて 日本語でおk みたいな文になったな
とりあえずいいたいことは オーナードローメニュー でググレば目的は達せられると思う、と
613:デフォルトの名無しさん
07/03/09 15:41:12
>>611-612
プログラマとしての適性なさそうです。
学生ならプログラマになるの止めましょう、もし、いまプログラマなら転職をすすめます。
614:608
07/03/09 15:46:11
原因は別のような気がします。
SetMenuItemBitmaps のサンプルを幾つかダウンロードし(ソース付きのやつね)
実行してみたものの、3種類試しましたがいずれもアイコンが全て表示されません。
(13x13のアイコンなのに8x8サイズぐらいしか表示されない)
WinXP SP2、VB6 SP5、それ以外に思いつくのは・・・IE7をインストールしたことでも
関係するのかなあ?
VPC上での動作と比較してみます。
615:デフォルトの名無しさん
07/03/09 15:51:40
プログラマになりたいんですけどどうすればいいですか?
616:デフォルトの名無しさん
07/03/09 15:55:42
先ずは層化学会に入信しなさい、そうすれば道は開かれます。
617:デフォルトの名無しさん
07/03/09 16:18:12
>>616
そうか?
618:デフォルトの名無しさん
07/03/09 16:32:26
>>613
マジか? 俺も創価行ってくるわ
>>608には失礼した
SetMenuItemBitmapsはスモールアイコンじゃなくて
チェックマークイメージの代わりを指定するものだったみたいだな
619:608
07/03/09 16:46:50
VPC上(Win2k)でも同じだった…何がまずいんだろう(´・ω・`)
URLリンク(homepage1.nifty.com)
のサンプルをダウンロードしてそのまま実行、下のような表示になります。
(自分で作ったのも同じ結果)
URLリンク(ud.gs)
「それって○○じゃね?」ってわかる人いらっしゃいますか〜?
620:608
07/03/09 16:48:02
しまった ttp にするのを忘れてた・・・後の祭りですが、すみません。
621:デフォルトの名無しさん
07/03/09 18:13:14
>>608
cx = GetSystemMetrics(SM_CXMENUCHECK)
cy = GetSystemMetrics(SM_CYMENUCHECK)
Debug.Print "cx = " & cx & vbTab & "cy = " & cy
上記コードを実行したらわかるけど、規定のサイズは11px。
622:608
07/03/09 18:35:02
ガ━━━(゚д゚;)━━━ ン!!
>>621さんありがとうございます。
16x16で配布しているサイト多いし、アプリから吸い出しても16x16が多いので
これが基本だと思い込んでた・・・
ふむう、仕方がない。アイコン全部自作すっか・・
基礎知識提供感謝です。
623:デフォルトの名無しさん
07/03/09 18:40:52
>>617
kwsk
624:デフォルトの名無しさん
07/03/09 22:03:19
SetMenuItemBitmaps って
Vistaだと16x16の32bitアイコン表示してくれるんだよね
微妙にうれしい
625:デフォルトの名無しさん
07/03/10 08:31:59
Windowsの右下に小さなアイコンが居ますよね?
幾つも居るんだけど使わない時は隠れていたり.
アレってなんて言うんでしょうか?
アレもアプリの一種だというのは判るのですがどうやって作るのでしょうか?
626:デフォルトの名無しさん
07/03/10 08:46:59
>>625
タスクトレイ
URLリンク(www.google.co.jp)
627:デフォルトの名無しさん
07/03/10 09:37:58
すまんAPIというか微妙なんだがブラシとかフォントとかリソースあるよね?
頻繁に使われるものをパフォーマンスのために一時的にキャッシュ(数秒使われなかったら削除など)してみようかと思うんだがこれは許されない行為なんでしょうか?
628:デフォルトの名無しさん
07/03/10 09:46:09
いつ削除するかはプログラマの自由だべ。
とはいえ、削除しようとするハンドルが利用されていたらダメだけども。
629:デフォルトの名無しさん
07/03/10 09:46:10
別にいいと思うよ。
俺もウィンドウを作ると同時にオブジェクトを作って、
ウィンドウを削除するまで保持しておくとかやるし。
630:デフォルトの名無しさん
07/03/10 09:56:03
>>628-629
あり。
プログラミングウィンドウズ本とかですぐに開放しろといってるのは、たまるとほかのアプリのリソースを圧迫するからって話で、適切に管理するならやって大丈夫ということでいいのかな。
631:デフォルトの名無しさん
07/03/10 11:56:45
>>630
> プログラミングウィンドウズ
Windows 3.1時代から改訂を繰り返してるから当時のリソース制限を前提に書いてる
632:デフォルトの名無しさん
07/03/10 12:09:47
ロジックを複雑にしてリソースを可能なかぎり早く解放するより、多少無駄なリソースを持ってもロジックを単純にするほうが、
今日ではメリットが大きいと思われ。
633:デフォルトの名無しさん
07/03/10 12:13:46
検討違いのレスがあるな
634:デフォルトの名無しさん
07/03/10 12:34:39
漢字間違いのレスがあるな
635:デフォルトの名無しさん
07/03/10 13:57:11
ぬるぽのレスが無いな
636:デフォルトの名無しさん
07/03/10 14:12:21
ウインドウのDCをゲットして、スクリーンショットを撮るプログラムを書いてますが、
隠れてたり最小化してるウインドウは不可能ですよね?
637:デフォルトの名無しさん
07/03/10 14:16:02
> ですよね?
やってみれ
638:デフォルトの名無しさん
07/03/10 14:22:00
>>636
VistaでAero有効ならできる
639:デフォルトの名無しさん
07/03/10 14:49:02
>>627
CreateFontでフォントを毎回作成するのと、最初に一度だけ作って使いまわすのを
比較したことがあるけど、毎回作ったときのオーバーヘッドはPentium3でも
0.1ms程度だったから、パフォーマンスのためにキャッシュってのは、
あまり効果がないよ。
640:デフォルトの名無しさん
07/03/10 14:55:23
5とか10usみたいなミジンコみたいな小さい時間ならわかるけど、
100usって結構大きくね?
641:デフォルトの名無しさん
07/03/10 15:09:49
わずかな時間でもそれを何回も呼ぶとかによって
トータルで速いとか遅いとか感じることが出来るかどうかだ。
微妙なら面倒なことやりたくないが
やってみないとわからないんだよな。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4994日前に更新/228 KB
担当:undef