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


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

Win32API質問箱 Build48
751 名前:デフォルトの名無しさん :2007/01/07(日) 18:25:07
ダブルバッファリングして遅かったら描画処理の部分を疑う程度しかやらねぇ

752 名前:659 :2007/01/07(日) 19:08:43
>>740
動画エンコ用のソフトを複数使っているので
その一連の作業を自アプリだけで行おうとしたのが目的です
別々に開いたり閉じたりするのも面倒なので
複数のアプリをボタンひとつで画面に整列させてやりたかったわけです

解決方法は怪しいフォームのプロセスを監視状態にして
タスクトレイのアイコンの上にマウスポインタを移動させて
MOVEイベントが送られているフォームを見つけて
アイコンをマウスクリックで元に戻し
そのときに出てきたWM_USERのパラメータで
SENDMESSAGEを送ってやった次第です

反省点はフォームに直接ShowWindowメッセージを送れば
アイコンが元に戻ると思い込んでたのが間違いでした
すべてのフォームにrestoreメッセージを送っても反応がなかったので
頭から省いてしまっていたわけです

実際にはクリックされたというメッセージを送らなければ
アイコン削除処理をしてくれなかったわけです

どうもありがとうございました

753 名前:デフォルトの名無しさん :2007/01/07(日) 19:15:47
気持ちよかった?

754 名前:デフォルトの名無しさん :2007/01/07(日) 19:24:27
>>748です。わかりました。とりあえず、実装してみます。
今の実装では、WM_PAINT時にExtTextOutを何度も呼び出すつもりですが、ちょっとExtTextOutだけの
テストアプリを作り、試しに1000回呼び出す時間を計測したところ、それだけで50ms近くかかってたので、
うほぉ。っと思ってました。表示するテキストの内容にもよりますが、超最悪1万回とかいったらどうしよう
とか考えてた次第です。もちろん、ExtTextOutでの描画をまとめるのが筋ですが、
それをやると、ある問題が発生するので、どうぴよー。と思ってました。
とりあえず、先に実装してみます。

755 名前:デフォルトの名無しさん :2007/01/07(日) 19:35:54
うほぉ。
どうぴよー。

756 名前:デフォルトの名無しさん :2007/01/07(日) 19:40:13
仕事中ってそういう意味不明なワードが口を付くから困る

757 名前:デフォルトの名無しさん :2007/01/07(日) 19:44:49
あん

 どゥ

トろワ?

758 名前:デフォルトの名無しさん :2007/01/07(日) 19:59:42
カトル!

759 名前:デフォルトの名無しさん :2007/01/07(日) 20:06:49
やかん?

760 名前:デフォルトの名無しさん :2007/01/07(日) 20:22:17
>>757-759
warata

761 名前:デフォルトの名無しさん :2007/01/07(日) 21:28:16
>>746
サブシステムが違うので無理です。POSIX APIとネイティブAPIしか呼べない。
ネイティブAPIもWin32サブシステムでの動作を前提にしてると
思わぬ落とし穴にはまるかもしれない

762 名前:746 :2007/01/07(日) 21:31:47
>>761
thx

763 名前:デフォルトの名無しさん :2007/01/07(日) 21:34:58
>>754
速いテキストエディタを作った事のある俺が答えてやろう。
Unicodeを使え。文字列を描画する場合は、1文字ずつではなく極力まとめて描画しろ。
メモリの確保破棄は発生しないように設計する。
文字幅の計算系のAPIはとても遅いので、自前で位置を計算する場合は取得結果をキャッシュする。
オフスクリーン(ビットマップ)に描画イメージを作成してから、ディスプレイに転送するとフリッカーが発生せずにさらに速い。
文字入力したときなどは変化した部分だけ描画。とにかく更新の必要のない部分は描画を行わない。

まあ、基本だね。

764 名前:デフォルトの名無しさん :2007/01/07(日) 22:38:50
HRESULTの値ってどう意味を持つのですか?
それとHRESULTが含まれるコードによくS_OKとかくっついてることが多いのだけど
BOOL値のTRUEような感じなんですかね?
ざっくりとでいいですから解説オナガイシマス

765 名前:デフォルトの名無しさん :2007/01/07(日) 23:32:09
ファイラーなどで、ファイルの一覧をListViewで表示しているものがありますが、
さらにファイルを右クリックすると、エクスプローラのコンテキストメニューが出てくる
ようになってるソフトがありますが、あれはどのようにして実現しているのでしょうか?

766 名前:デフォルトの名無しさん :2007/01/07(日) 23:33:06
ちなみに、「ファイラー」というのはWindows非標準のファイル管理ソフトやアーカイバのことを指したつもりです。

767 名前:デフォルトの名無しさん :2007/01/07(日) 23:49:03
>>764
関数の成功判定をBOOLで返した場合、失敗してもFALSEしか戻せないので
何に失敗したかの情報を戻り値に含められない。

HRESULTはS_OK以上なら成功、S_OK未満なら失敗を表すための型で
何に失敗したかなどを意味する数値が色々defineされている。
HRESULTがS_OK以外にどんな値を返すかは関数次第。

単純に成否判定をしたい場合は
SUCCEEDEDマクロ(成功ならTRUE)かFAILEDマクロ(失敗ならTRUE)を使う。

768 名前:デフォルトの名無しさん :2007/01/07(日) 23:51:13
>>764
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncomg/html/msdn_design.asp

上から1/4くらいのところ参照

769 名前:デフォルトの名無しさん :2007/01/07(日) 23:53:48
あ、ちなみに失敗してもその後の実行に支障がなさそうな場合とかに
「S_OK以上の失敗コード(例えばS_FALSE)」を返してくる場合もあるんで
FAILEDマクロだけで成否判定してると部分的な失敗とかを取りこぼすことがあるんで
どんな値が返ってくるのかちゃんとドキュメント嫁。

770 名前:デフォルトの名無しさん :2007/01/07(日) 23:58:44
>>763
>文字幅の計算系のAPIはとても遅いので、
横槍ですまぬが、具体的にはどの関数でしょうか?
すごく・・・興味あります。

771 名前:デフォルトの名無しさん :2007/01/08(月) 00:04:35
>>765
Shell API

772 名前:デフォルトの名無しさん :2007/01/08(月) 00:05:37
>>764
http://msdn2.microsoft.com/en-us/ms690088.aspx
HRESULTの値はようするに最上位ビットが立っていれば失敗、そうでなければ成功を表す。
あとは予約部分、Microsoft定義かどうか、種類 (FACILITY)、コードの部分に分けられる。
(機会は滅多に無いだろうけど)自分でHRESULT型の定数を作るときにはFACILITYを独自の値にする必要がある。

HRESULT型の定数の名前は、失敗の場合基本的にナントカ_E_カントカという形式だが、一般的なものはE_カントカという形式。
と言っても実際はE_カントカばかり目にする気がする。
(ナントカには種類名が入る: OLE_E_WRONGCOMPOBJとか)
もっともFAILED/SUCEEDEDマクロを主に使うので定数を直に使うこと自体少ないと思う。
成功の場合はS_ナントカ。標準ではS_OK以外にもS_FALSE(メソッドの呼出は成功したけど……)というのがある。

あとHRESULTなどをいじるマクロ。
http://msdn2.microsoft.com/en-us/ms528334.aspx

773 名前:デフォルトの名無しさん :2007/01/08(月) 00:09:12
>>770
GDIだとGetCharABCWidths, GDI+ならGdipMeasureString

774 名前:デフォルトの名無しさん :2007/01/08(月) 00:28:20
>>772
>自分でHRESULT型の定数を作るときにはFACILITYを独自の値にする必要がある。
勝手に作っちゃダメよ。
>Status codes in facilities other than FACILITY_ITF can be defined only by Microsoft.

775 名前:デフォルトの名無しさん :2007/01/08(月) 00:39:37
>>765
>>766
IContextMenu2, IShellFolder.GetUIObjectOfあたりを調べなはれ


776 名前:デフォルトの名無しさん :2007/01/08(月) 00:42:54
>>771
>>775
ありがとうございます、その辺を調べてみます。

777 名前:デフォルトの名無しさん :2007/01/08(月) 00:51:41
>>763
>>754です。Unicodeでダブルバッファリングはしてます。で、今巨大な横幅のデータを食わせてみたのですが、
やはり、横スクロールしていくと、だんだん、遅くなってきています。
横に5000文字あたりのところでついにはもっさり感が・・
今の実装は毎回横幅を取得してるので、右端の方にいけばいくほど、描画のための呼び出し回数が増えてるっぽいです。
おっしゃる通り、まとめてキャッシュする方向でいきます。今はテキストを強調表示のためパーサーにかけてるのですが、
パース後にキャッシュします。今の段階では描画より、幅の取得に手間取ってるっぽいので、
とりあえず、まとめずにキャッシュしてみます。それでも駄目ならまとめます。
ありがとうございました。







778 名前:デフォルトの名無しさん :2007/01/08(月) 00:54:09
画面を3ペインくらいに区切りたいのですが、
何で検索すれば幸せになれますか?


779 名前:デフォルトの名無しさん :2007/01/08(月) 00:54:28
nande ムダに 改行が 多いの

780 名前:デフォルトの名無しさん :2007/01/08(月) 01:01:30
>>767>>768>>769>>772>>774
>>764です
詳しい解説ありがとう
HRESULTの値の意味は関数が失敗した時の値を詳細に明示するものと理解しましたが
果たして、この関数の使い所はどういう場面でなのだろうかとふと、疑問に思いました
確かにデバッグ時、関数内のどこの処理が上手くいっていないのか等、分かるのは
便利だとは思うのですが、他にはどういう目的や場面で使われるものなのでしょうか?

781 名前:デフォルトの名無しさん :2007/01/08(月) 01:02:00
文章を推敲していると、何故か文末に改行が増えるな。

782 名前:デフォルトの名無しさん :2007/01/08(月) 01:13:12
>>780
失敗する理由が複数考えられるときは、区別できる値を返さんと、ユーザに通知もできんじゃろうが

783 名前:デフォルトの名無しさん :2007/01/08(月) 01:29:39
>>782
>>780です
やっぱりマネージドC++/CLIのtry、catch、throw見たいに例外処理とかエラーを表示するのが目的?


784 名前:770 :2007/01/08(月) 01:42:31
>>773
さんくすこ

785 名前:デフォルトの名無しさん :2007/01/08(月) 04:20:34
>>783
確かにアンマネージドなC/C++より高水準の言語ではたいてい例外にマップされる

786 名前:デフォルトの名無しさん :2007/01/08(月) 06:00:30
【ネガティブ派遣根性チェック】

3つ以上、思い当たる点があればアナタの性格はひん曲がっており、ネガティブ負け組人生を歩んでいます。

□偽装派遣先の社員の意見にはたとえ間違っていても反対しない
□偽装派遣先から「いつまでもここで仕事してくださいね」と言われるようになりたい
□自社に仕事を持ち帰れるように言われるとムカつく
□自社で仕事なんてできるわけがない
□派遣/受託の差異を指摘する人間はムカつく
□偽装派遣先には仕事だけでなく自分のプライベートについても指示して欲しい
□自分の月額金額を知らない
□偽装派遣先社員より自分の生涯収入が低いのは当然だ
□偽装派遣先に尻尾を振り、いつまでも一緒に仕事をすることが大切だ
□今のプロジェクトが終わっても同じ偽装派遣先に常駐したい


787 名前:デフォルトの名無しさん :2007/01/08(月) 10:02:52
全問正解したのでなにかください

788 名前:デフォルトの名無しさん :2007/01/08(月) 10:20:59
つ VisualStudio .NET 2002

789 名前:デフォルトの名無しさん :2007/01/08(月) 11:54:33
>>787
早く自分の会社へ帰れ!!
でないと人間腐るぞ!

790 名前:デフォルトの名無しさん :2007/01/08(月) 13:09:05
え?えっ…?
何これ?デジャビュ?

791 名前:デフォルトの名無しさん :2007/01/08(月) 13:58:21
ただのマルチ
http://pc10.2ch.net/test/read.cgi/tech/1167476845/56-

792 名前:デフォルトの名無しさん :2007/01/08(月) 16:33:56
標準のエディットボックスを右クリックして出てくるメニューに
オリジナルのメニュー項目を追加するのってどうやればいいですか?

793 名前:デフォルトの名無しさん :2007/01/08(月) 16:53:17
>>777
スクロールはBitBltかScrollWindowExを使用して更新領域を最小限に抑える。この方法で実装しないと遅いよ。
あと画面に表示されている行だけでも、位置情報をキャッシュするようにすれば再計算しなくていいので速くなる。

794 名前:デフォルトの名無しさん :2007/01/08(月) 18:27:22
>>777です。
あれから、パーサーで切り出されるトークンをフォントのスタイルと色が同じならある程度にまとめて、
それから幅を取得しにいったら、ついに前回の5000文字の壁を越えて、横方向に1万文字あたりでスクロールさせてももっさり感がなくなりました。
でも、やっぱ、幅を毎回取得してるので2万文字あたりでまたもっさり感が・・・やっぱ、キャッシュするしかなさそうですね。
はぁ。

>スクロールはBitBltかScrollWindowExを使用して更新領域を最小限に抑える。この方法で実装しないと遅いよ。
>あと画面に表示されている行だけでも、位置情報をキャッシュするようにすれば再計算しなくていいので速くなる
ScrollWindowExですか、使った事ありませんでした。スクロール時は毎回画面を再描画してるので。
調べてみます。ありがとうございます。


795 名前:デフォルトの名無しさん :2007/01/08(月) 22:52:05
すみません、もしわかる方がいらっしゃったら教えてください。
CreateProcessで起動するプロセスに対して何らかの識別コードを付加したいのですがいい方法はないでしょうか?
例えば自分のプログラムからNotepad.exeを起動したときに、他のプロセスからも自分のプログラムから起動したことを知ることができるようにする「マーク」のようなものをつけたいのです。
起動するプログラムは既にバイナリイメージなのでソースレベルで手は加えられない制約がある状態で起動元のプログラムから何とか「紐付け」をしたいのです。
何か良い方法がありますでしょうか?

796 名前:デフォルトの名無しさん :2007/01/08(月) 22:56:54
>>795
イメージなら、バイナリデータの一番最後に文字列加えても問題ない
それで認識すれば?

797 名前:デフォルトの名無しさん :2007/01/08(月) 23:01:29
>>796
レス有難うございます。
起動するプログラムは任意に変わるのと、バイナリには手を加えられないのです。
今、考えてる方法は、STARTUP_INFOのReservedメンバに識別する値を入れ、後でPIDからそのプロセスのSTARTUP_INFOを取得して識別できないかとか、
プロセス起動前に環境ブロックに独自の環境変数を設定し、それを起動するプロセスに継承させたあとに、なんらかの方法で目的のプロセスの環境ブロックを読み出す(そうゆうAPIはないのでハッキングする)とかを考えています。
もっとスマートでよい方法がありそうなのですが…

798 名前:デフォルトの名無しさん :2007/01/08(月) 23:14:23
>>797
データをテキストに書き込んで、別のプロセスで読み込めばいいだけじゃん

799 名前:デフォルトの名無しさん :2007/01/08(月) 23:16:33
DLL injectしてPIDなどでユニークな共有メモリ作成してタグを作ったらどうだろうか

800 名前:デフォルトの名無しさん :2007/01/08(月) 23:24:11
>>798
レス有難うございます。
起動元プログラムからデータをファイルやメモリを経由して他のプロセスから読み取る方法ですと、
例えば、もし起動したプログラムが終了してそのPIDが無効になった後に、新たに起動されたプログラムのPIDがユニークになる保証がないため、誤認識してしまう恐れがあります。
>>799
レス有難うございます。
CreateRemoteThreadなどで起動先のプロセス空間にDLLを注入にしてしまえばいいのですが、
識別用の32ビットのコードを知るためだけにDLLを注入するのはやや大変かと思ってすこし腰が引いています
でも、やっぱり起動先プロセスにDLLを打ち込まないと無理そうならやるしかないか…



801 名前:デフォルトの名無しさん :2007/01/08(月) 23:36:34
>>797
起動したプログラムの保持と、その終了を監視する第3のプログラムを裏で動かしとけば?


802 名前:デフォルトの名無しさん :2007/01/08(月) 23:50:33
>>801
レス有難うございます。ちょっと説明が長くなってもうしわけありません。

実はこの起動元プログラムとは、プロセス群を監視し、プロセスに異常終了した場合に再起動を行うプログラムなのです。
そしてこのプロセス監視プログラムはJobオブジェクトを作成し一連のプロセス群を一括管理していています。

今、問題となっているのは「もしこのプロセス監視プログラムが異常終了してしまった場合」に
プロセス監視プログラムを再立ち上げなおした後に、既に存在しているJobオブジェクト内で動作しているプロセスの一覧をチェックして、
プロセス監視プログラム内の情報と整合性をあわせる必要があるために各プロセスにユニークコードを埋め込んでおきたいのです。

レスを頂いた「その終了を監視する第3のプログラムを動かす」というのは対処方法としてはいいのですが、
もしその第3のプログラムにも異常が発生した場合には全く同じ問題がおきます。
本来、プロセス監視プログラムから起動されたプロセスを一意に識別さえできれば、
解決できる問題なのでその方向で解決したいと考えています。

803 名前:デフォルトの名無しさん :2007/01/09(火) 00:28:05
監視プロセスを監視するプロセスを準備したり、2プロセスで監視など、多重化するほうがいいんでない?

804 名前:デフォルトの名無しさん :2007/01/09(火) 00:35:44
>>802
>>799の案だけど、DuplicateHandle使えばDLL injectしなくても共有メモリ放り込めるかも。
MSDN読んだだけで試してないけど。

805 名前:デフォルトの名無しさん :2007/01/09(火) 00:36:32
オレも監視プロセスを複数にした方がいいと思う
2プロセスなら片方落ちても再起動した後でメッセージとかのプロセス間通信で同期とれるしな

806 名前:デフォルトの名無しさん :2007/01/09(火) 00:38:46
複数プレイか!

807 名前:デフォルトの名無しさん :2007/01/09(火) 00:44:16
>>803,805
レス有難うございます。
確かに多重化したほうが堅牢でいいのですが、本質的な問題が解決されてないことが気になります。
>>804
参考情報、有難うございます。
DLLを注入する方法は何通りかあるようなので、今後、解決策が見つからないようであれば試したいと思います。

808 名前:デフォルトの名無しさん :2007/01/09(火) 03:05:13
>>807
PIDだけじゃ一意であることを保証できないのが問題なら、
プロセスの生成日時とかと併用じゃダメっすかね?

win32的にどう取得するのかわからんけど、
WMIのWin32_ProcessにCreationDateというのがあるみたいだ。
WMIのこともよくわからんけど。。。

まあ、これで理論上完全に保証できるかっていうと無理だけど。

809 名前:801 :2007/01/09(火) 10:01:10
>>802
(1) 子プロセスを起動
(2) 子プロセスごとのユニークな名前でCreateFile(..,CREATE_NEW,..,FILE_FLAG_DELETE_ON_CLOSE...)
(3) DuplicateHandleで(2)のハンドルを子プロセスに継承
(4) 親側の元ハンドルは閉じる
これで、子プロセスが落ちると自動的にファイルが削除される。
ファイルの置き場所と命名規則を決めておけば、どのプロセスが生きているかわかる。

個人的な感想としては、
>もしその第3のプログラムにも異常が発生した場合には全く同じ問題がおきます。
まで問題となるような状況で”Windowsで(は)大丈夫?”と聞きたくなる。



810 名前:デフォルトの名無しさん :2007/01/09(火) 10:32:31
mutex

811 名前:デフォルトの名無しさん :2007/01/09(火) 10:41:32
>>809
レスどうも有難うございます。なるほど、これはいいかもしれないです!
今さっきまで、NtQueryInformationProcessで子プロセスのPEBのアドレスを取得し、
子プロセスのメモリ空間から環境ブロックをReadProcessMemoryする方法ができないかを考えていましたが、
FILE_FLAG_DELETE_ON_CLOSEの仕様を確認してよければCreateFileの方法のほうがずっとスマートなのでこちらの方法にしようかと思います。
809さん、本当に有難うございました。
Spec Fixまでまだ時間があるので他の方法も一応検討をしてみます。

>まで問題となるような状況で”Windowsで(は)大丈夫?”と聞きたくなる
色々しがらみがありまして…
フェイルオーバークラスタリングで別マシンでも並行稼動させるのと、
Jobでクォータ管理してOSへダメージが波及しないようにしようかと思います。

812 名前:デフォルトの名無しさん :2007/01/09(火) 12:53:40
ち・ちんぽ

813 名前:デフォルトの名無しさん :2007/01/09(火) 14:55:09
はじめまして。
僕は今チャットウィンドウを作っていて、
文字を打ち込むためのエディットボックスなどはCreateWindow関数を用いて作りました。
そのため、位置などは、数字を打ち込んで確かめて調整していかなければなりません。

もっと、視覚的にメインウィンドウをレイアウトしたいのですが、
この方法しかないのでしょうか?
親ウィンドウをリソースエディタでダイアログボックスとして作ってもいいのでしょうか?
どなたか返答お願いします。

814 名前:デフォルトの名無しさん :2007/01/09(火) 14:57:46
>>813
素直にIDEの付いてる言語にしなさい

815 名前:デフォルトの名無しさん :2007/01/09(火) 15:02:24
>>813
>親ウィンドウをリソースエディタでダイアログボックスとして作ってもいいのでしょうか?
それはあなたが作ってるアプリの仕様次第。好きにしたらいい。

816 名前:デフォルトの名無しさん :2007/01/09(火) 15:19:31
>>813
最初にきちんときめちゃえばいいじゃん。

817 名前:デフォルトの名無しさん :2007/01/09(火) 15:27:55
>>813
初心者はまず見た目から作ろうとするけど
まずは何をするのかを考え
それに必要なデータなどを格納するオブジェクトを宣言し
そして初めて外見を作っていく
こうするとスムーズにプログラミングできる
外見を作りながらやると、後で機能を増やしたいとか
仕様を変更したいとかなると面倒なことになり
また1から作り直すことになる

頭の中だけで考えず、ヘタでもいいので絵に描いたり
何ができるか箇条書きすることを薦める

818 名前:デフォルトの名無しさん :2007/01/09(火) 15:31:03
>>813
ダイアログをメインウィンドウにしたアプリケーションを
俗に「ダイアログベースアプリケーション」と言って
Windowsではよく使われる手法。何の問題もないよ。

819 名前:デフォルトの名無しさん :2007/01/09(火) 15:42:32
>>813
>そのため、位置などは、数字を打ち込んで確かめて調整していかなければなりません。
フォントが変わると(同じフォントでもOSが変わったりユーザー設定が変わったりすると)正しい
位置が変わる。だからプログラム中で固定値の指定はNG。
面倒だけどGetSystemMetrics()などで取得した値から計算で位置等を決めるように。

ダイアログをメインウィンドウにするのはOK。


820 名前:デフォルトの名無しさん :2007/01/09(火) 18:03:28
文字変換で迷って伊いますBSTRの指すアドレスに文字列が入っているんだけど
どのように取り出してMessageBoxで見ることが出来ますか?
教えてくださいオナガイシマス

821 名前:デフォルトの名無しさん :2007/01/09(火) 18:04:34
>>813の人気に嫉妬

822 名前:デフォルトの名無しさん :2007/01/09(火) 18:04:41
今まで、レジストリ関係のソフトと、
画像処理系と、ゲームしか作ったことがないのですが、
httpを利用して、情報を取得したいと思ってます。
既存のwebページから読み込むということです。
そこら辺の知識は皆無なのですが、何で検索すれば、
大まかな概要と、手順を見つけることができますか。

823 名前:デフォルトの名無しさん :2007/01/09(火) 18:05:19
>>821
の嫉妬心に嫉妬

824 名前:デフォルトの名無しさん :2007/01/09(火) 18:09:14
>>820
ググれ

825 名前:デフォルトの名無しさん :2007/01/09(火) 18:09:35
>>822
開発環境くらい書けボケ
あとスレ違い

826 名前:デフォルトの名無しさん :2007/01/09(火) 18:12:56
>>822
RFC2616だな。 ttp://www.studyinghttp.net/
APIスレ というのであれば WinSock

827 名前:デフォルトの名無しさん :2007/01/09(火) 18:25:40
>>825
開発環境関係あるんですか。
VC2005EEです。

>>826
ありがとうございます。


828 名前:デフォルトの名無しさん :2007/01/09(火) 18:31:03
>>827
環境によって出来合いのものを利用できたりするからな

829 名前:デフォルトの名無しさん :2007/01/09(火) 18:37:17
>>820です
3日具具って
BSTR pfoo;
char choge[ 256 ];
::ZeroMemory( choge, 256 );
int n = WideCharToMultiByte( CP_ACP, 0, pfoo, SysStringLen( pfoo ), choge, sizeof( choge ) - 1, 0, 0 );
MessageBox( NULL , ( LPTSTR )pfoo, "Kitty on your lap.", MB_OK | MB_TOPMOST );
このようにしたのですが結果が出ません(何も表示されません)
よろしくお願いします。

830 名前:デフォルトの名無しさん :2007/01/09(火) 18:43:27
>>829
なぜpfooをMessageBoxに渡しているのだ?

831 名前:デフォルトの名無しさん :2007/01/09(火) 18:45:36
>>822
多分InternetReadFileExとかで用が足りるんだろうけどな

832 名前:デフォルトの名無しさん :2007/01/09(火) 18:45:40
BSTR=WideCharだってわかってるなら
MessageBoxW使えばいいだけじゃないのか

833 名前:826 :2007/01/09(火) 18:48:07
>>831
すまね。 WinINet の存在を知らなかった…

834 名前:デフォルトの名無しさん :2007/01/09(火) 18:52:43
>>831
たぶんこれで足ります。

835 名前:813です。 :2007/01/09(火) 22:33:44
いろいろ言ってくれて助かりました。
ありがとうございます。

836 名前:デフォルトの名無しさん :2007/01/09(火) 22:45:42
WinAPI32の初心者です。
リストビューにアイコンを表示したいのですが、
どうもうまくいきません(1日中やってました)
実行しますと、アイコンが表示される場所が空白になっています。
アイコンのサイズもしっかり確認しました。
ソースはこちらです↓

LV_COLUMN lvcol;
LV_ITEM item = {0};
HIMAGELIST hImg;

hList = CreateWindowEx(WS_EX_CLIENTEDGE , WC_LISTVIEW, "",
WS_CHILD | WS_VISIBLE | LVS_REPORT, 400, 50, 140, 300,
hWnd, (HMENU)IDC_EDIT3, hInst, NULL);
//コモンコントロールの初期化
InitCommonControls();
//イメージリストを作成
hImg = ImageList_Create(16 , 16 , ILC_COLOR8, 1 , 1);
//イメージリストにアイコンを追加
ImageList_AddIcon(hImg , LoadIcon(hInst , MAKEINTRESOURCE(IDI_ICON1)));
ListView_SetImageList(hList , hImg , LVSIL_SMALL);
lvcol.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT ;
lvcol.fmt = LVCFMT_LEFT;
lvcol.cx = 100;
lvcol.pszText = "Member";
lvcol.iSubItem = 0;
ListView_InsertColumn(hList, 0, &lvcol);
item.mask = LVIF_TEXT | LVIF_IMAGE ;
item.pszText = "dud";
item.iImage = 0;
ListView_InsertItem(hList, &item);

837 名前:デフォルトの名無しさん :2007/01/09(火) 23:06:44
>>836
ImageList_AddIconの戻り値はイケてる?

838 名前:デフォルトの名無しさん :2007/01/09(火) 23:07:14
>>836

おかしいとこ無いんでそのまんまコピペしたらちゃんと出たぞ?
アイコンの16x16にはちゃんと絵が入ってる?

839 名前:デフォルトの名無しさん :2007/01/09(火) 23:07:28
>>820
Win32/64のBSTRは、単にWCHARへのポインタと見なして扱える(ただしその逆は真でない)。
>>832の補足になるが、MessageBoxWは9xにも実装されているので、躊躇せず使える。

840 名前:836 :2007/01/09(火) 23:15:26
>>837
戻り値は「-1」で失敗してることが分かりました。
でも、なぜ失敗しているんでしょうか??

841 名前:デフォルトの名無しさん :2007/01/09(火) 23:18:25
>>840
アイテムを挿入するメモリ領域を確保してないから

842 名前:837 :2007/01/09(火) 23:20:33
>>840
>>838が真実。
8ビットフォーマットのアイコンがナイんじゃない?


843 名前:836 :2007/01/09(火) 23:25:51
>>837
僕の今読み込んでるアイコンは16x16の256色です。
ということは、
hImg = ImageList_Create(16 , 16 , ILC_COLOR8, 1 , 1);
↑この部分に問題があるのでしょうか?

844 名前:836 :2007/01/09(火) 23:28:07
読み込んでるアイコンのプロパティを見たら
ビットの深さが32になっていました。
どうしたらよいでしょうね?

845 名前:デフォルトの名無しさん :2007/01/09(火) 23:29:01
>>840
IDI_ICON1のプロパティを確認。
めんどくさかったら、 ILC_COLOR8を
ILC_COLOR16か ILC_COLOR24か ILC_COLOR32か ILC_COLORDDBに変えてみて、
IDI_ICON1が何ビットフォーマットか調べてみる・・・などなど。

846 名前:デフォルトの名無しさん :2007/01/09(火) 23:32:06
アイコンのツールは何を?

847 名前:836 :2007/01/09(火) 23:33:38
>>846
アイコンのツールってなんでしょうか?
VCのリソースエディタで編集してましたが・・・

848 名前:デフォルトの名無しさん :2007/01/09(火) 23:35:28
>>847
Visual Studio 2005を使っているのなら、
リソースエディタ上部、メニューより、
[イメージ(I)]→[現在のアイコン イメージタイプ(E)]で16x16、16色を選択。

なければ[新しいイメージ タイプ(W)]で追加。

849 名前:836 :2007/01/09(火) 23:35:43
ILC_COLOR16か ILC_COLOR24か ILC_COLOR32か ILC_COLORDDB
に変えてみましたが、全部ダメでした。

ImageList_AddIcon(hImg , LoadIcon(hInst , MAKEINTRESOURCE(IDI_ICON1)));
↑ここをデバッグボックスで表示されたら -1 になっています。
やはり、ここで失敗しているようです。


850 名前:デフォルトの名無しさん :2007/01/09(火) 23:36:39
VCだったら、アイコン編集でイメージメニューに
現在のアイコンメニューの表示とか
新しいアイコンイメージの追加という項目があるだろ
それいろいろいじってみ

851 名前:デフォルトの名無しさん :2007/01/09(火) 23:42:58
ないとは思うが画像ファイルの拡張子を.ico に変えるだけじゃだめだぞ?
(ウソだと思いたいがマジにいたから言っておくんだが)

852 名前:836 :2007/01/09(火) 23:43:45
やはりダメです(>_<)
どうやっても表示されません・・・。

853 名前:836 :2007/01/09(火) 23:46:14
>>851
それは大丈夫です!
それから、16x16、16 色 にしっかりしてもダメみたいです・・・


854 名前:デフォルトの名無しさん :2007/01/09(火) 23:49:02
おいおい、16色は ILC_COLOR4 だぜ?

855 名前:デフォルトの名無しさん :2007/01/09(火) 23:50:05
IDI_ICON1 の宣言ミスとか?

856 名前:デフォルトの名無しさん :2007/01/09(火) 23:51:04
ワロスw

857 名前:デフォルトの名無しさん :2007/01/09(火) 23:52:33
>>854
おまえあたまいいな

858 名前:836 :2007/01/09(火) 23:52:44
>>855
それもないようです!
IDI_ICON1 はもうすでにウィンドウのタイトルの方で使っていて
そちらの方ではアイコンが表示されています。

リストビューにだけ表示されません・・

859 名前:デフォルトの名無しさん :2007/01/09(火) 23:55:33
HIMAGELIST型のhImgのスコープなどなど

860 名前:836 :2007/01/09(火) 23:56:25
スコープってなんですか(@_@。
すいません・・・初心者で・・

861 名前:デフォルトの名無しさん :2007/01/09(火) 23:56:50
リストビューに表示されないのが問題なんじゃなくて
ImageList_AddIconが失敗するのが問題なんだろう?
GetLastError() の値はどうよ。

アイコン全種類追加してしまえ

862 名前:デフォルトの名無しさん :2007/01/10(水) 00:00:00
>>860
これをhInstが宣言されている近くに。
>>836の関数から外に出すの)

static HIMAGELIST hImg = NULL;


863 名前:836 :2007/01/10(水) 00:06:02
>>862
それでもだめです・・・
ちなみにGetLastError()とは・・・

864 名前:デフォルトの名無しさん :2007/01/10(水) 00:06:46
googleを知らないんだろうか

865 名前:デフォルトの名無しさん :2007/01/10(水) 00:07:02
>>854

866 名前:デフォルトの名無しさん :2007/01/10(水) 00:08:01
GetLastError()
簡単に理解したいなら最後に出したエラーコード吐き出しみたいなものと認識してればいい
因みにFormatMessage使えばエラーコードのメッセージ吐き出してくれるよ

867 名前:836 :2007/01/10(水) 00:09:24
アイコン全種類追加したらできました
ありがとうございました

868 名前:デフォルトの名無しさん :2007/01/10(水) 00:10:00
ウィンドウに貼り付けたエディットコントロールが
左右キーのイベントを拾ってくれないバグに悩んでます。
上下を押すと左右に移動するのですが・・・

869 名前:デフォルトの名無しさん :2007/01/10(水) 00:11:34
スコープ
変数の寿命みたいなもの
staticで宣言した変数なんかはまさに不死身
static=癌変数と思えばいい
そのほかローカル変数、グローバル変数とかあるけどそれくらい自分で調べよう

870 名前:836 :2007/01/10(水) 00:11:48
>>ALL
すいませんね。
ご迷惑かけました。
出直してきます。
(できてませんけどw

871 名前:デフォルトの名無しさん :2007/01/10(水) 00:13:01
COLOR4 = 4ビット = 16色 なのはわかってるのかなあ
COLOR8 は256色な

872 名前:デフォルトの名無しさん :2007/01/10(水) 00:13:01
というか変数スコープもしらないでwindowsプログラムに手を出してるのがすごい

873 名前:デフォルトの名無しさん :2007/01/10(水) 00:13:03
>>867
ちゃんと、原因究明しろよw

874 名前:デフォルトの名無しさん :2007/01/10(水) 00:14:36
>>854が見事にスルーされてて藁った

875 名前:デフォルトの名無しさん :2007/01/10(水) 00:14:47
>>872
いや、スコープって単語が何を意味しているのかを知らないだけかも?

876 名前:デフォルトの名無しさん :2007/01/10(水) 00:15:29
僕ハッカー

877 名前:デフォルトの名無しさん :2007/01/10(水) 00:19:08
GetLastErrorのFormatMessageぐらい晒してから逝って欲しかったな

878 名前:デフォルトの名無しさん :2007/01/10(水) 00:19:48
>>836の人気に嫉妬

879 名前:868 :2007/01/10(水) 00:30:06
ダイアログ自体を子コントロールとして他のウィンドウに貼り付けるのって良くないかな?

880 名前:デフォルトの名無しさん :2007/01/10(水) 01:13:37
>>878の嫉妬心に嫉妬

881 名前:デフォルトの名無しさん :2007/01/10(水) 09:49:56
>>879
メッセージの中継をするようになってればいいとおもうけど

882 名前:デフォルトの名無しさん :2007/01/10(水) 15:43:23
>>797
もう見ていないと思うけど、STARTUPINFOの予約メンバについて調べてみた。

cbReserved2はlpReserved2の長さを指定している。
なので、lpReserved2に任意のデータ構造体を指定して、
cbReserved2にそのサイズを指定すれば、任意のデータを送れる。

まぁ、将来の仕様変更で使えなくなる可能性はあるが。

>>879
SetParentでそれっぽい事ができそうな気がする。

883 名前:デフォルトの名無しさん :2007/01/10(水) 15:46:57
>>879
リソースエディタで チャイルドスタイルにして
CreateDialog(.... 親窓)
は良くやるな。

TABのフォーカス周りをちゃんとしようとすると、IsDialogMessage() 利かさなきゃいけないけど

884 名前:882 :2007/01/10(水) 16:10:42
うお、URLを忘れてた。
ttp://www.catch22.net/tuts/undoc01.asp

lpReservedは別の用途にあるので、固有のIDを付けるという用途なら
lpReserved2を使った方が良いかと。

885 名前:795 :2007/01/10(水) 19:51:07
>>884
レス、有難うございます。もしかしたらレスがつくかもと思ってまだ見てました
MSのCランタイムがランタイムでオープンしたファイルハンドルを子プロセスに継承させる情報を伝えるために、
プロセス初期化時にlpReserved2を使って細工をしているなので、このままでは大部分のプログラムで問題が起きそうですね。
とりあえずはcbReserved2を使えば良さそうなのと、ページの最後に説明されているように、
lpReserved2に渡すバッファの先頭をポインタサイズでnullにすることに取り決めておけば使えるようです。

cbReserved2もしくはlpReserved2のいずれを使ってもGetStartupInfoで取得できそうですが、
GetStartupInfoは自プロセスのみに使える方法なので、他のプロセスからSTARTUPINFOを覗くにはPEBをハックして引きづり出すか、
ターゲットのプロセスにDLLを注入してGetStartupInfoを実行させないと取得できないかもしれません。
やっぱりこのあたりに行き着いてしまうようです。

とはいえ、884さん、とても参考になる情報を有難うございました。

886 名前:デフォルトの名無しさん :2007/01/10(水) 20:22:12
現在、PrintDlgで選択したプリンタと設定でメタファイルを印刷する処理を作っています。

そこでDEVMODE構造体のdmPaperWidthとdmPaperLengthが
dmOrientationの設定によって入れ替えるプリンタと入れ替えないプリンタがあるのですが、
その入れ替える・入れ替えないを取得する方法はありませんか?

DeviceCapabilitiesでDC_ORIENTATIONを指定すれば
取得できるかと思ったのですがどちらのプリンタも90が帰ってきました。
またdmFieldsも両方でDM_ORIENTATIONが設定されていました。

それと、dmPaperWidth、dmPaperLengthがdmOrientationの設定によって入れ替わらない場合、
メタファイルを90度回転させてから出力する必要があるのですが
それはどのようにすればできますか?

以上2点、ぐぐるヒントでもいいので教えてください。

887 名前:886 :2007/01/10(水) 20:23:36
現在使用しているソースです。(変数の宣言や初期化は行数節約のために省略しています)

//A4横方向を設定
if(PrintDlg(&printdlg))
{
  pdv = (DEVMODE)GlobalLock(printdlg.hDevMode);

  rect.Bottom = pdv.dmPaperLength; // ※2100と2970のどちらかになる
  rect.Right = pdv.dmPaperWidth;  // ※2970と2100のどちらかになる

  StartDoc(&docinfo);
  StartPage(printdlg.hDC);

  hEMF = GetEnhMetaFile((LPCTSTR)metafile);

  PlayEnhMetaFile(printdlg.hDC, hEMF, &rect);

  DeleteEnhMetaFile(hEMF);

  EndPage(printdlg.hDC);
  EndDoc(printdlg.hDC);

  GlobalUnlock(printdlg.hDevMode);
  GlobalFree(printdlg.hDevMode);
  GlobalFree(printdlg.hDevNames);
}

888 名前:デフォルトの名無しさん :2007/01/10(水) 21:25:46
>>887
して、pdv.dmOrientationは調べた?

889 名前:デフォルトの名無しさん :2007/01/10(水) 21:26:20
>>886
プリンタでやったことないけど
SetWorldTransformでできないかなー

890 名前:デフォルトの名無しさん :2007/01/10(水) 21:38:51
MIDIを再生したいのですが、どうすればいいんでしょうか?
ググってもパッとしたものが見つからなかったもので…

891 名前:デフォルトの名無しさん :2007/01/10(水) 21:42:22
ああ、MCIか。スマソ

892 名前:デフォルトの名無しさん :2007/01/10(水) 21:58:47
細かい制御がしたいなら
midiOutOpen()して
midiOutShortMsg()とかすれば
ほぼなんでも可能

893 名前:デフォルトの名無しさん :2007/01/10(水) 22:03:09
mciならこんな感じかも。
ダメソースだからちゃんと評価する処理にえんこうしてね。

MCI_OPEN_PARMS mciOpenParms;
MCI_STATUS_PARMS mciStatusParms;
MCI_PLAY_PARMS mciPlayParms;


mciOpenParms.lpstrDeviceType = "sequencer";
mciOpenParms.lpstrElementName = ファイル名;
::mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE|MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciOpenParms);

mciStatusParms.dwItem = MCI_SEQ_STATUS_PORT;
::mciSendCommand(mciOpenParms.wDeviceID, MCI_STATUS,MCI_STATUS_ITEM,(DWORD)(LPVOID)&mciStatusParms);

mciPlayParms.dwCallback = (DWORD)親ウィンドウ;
::mciSendCommand(wDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD)(LPVOID) &mciPlayParms);



894 名前:デフォルトの名無しさん :2007/01/11(木) 00:21:46
コントロールのIDってウィンドウの中でユニークであればOK?
たとえば、WindowAの中にControlB1とControlB2があって、
ControlB2の中にControlCがあるとする。
ControlB1とControlCのコントロールIDが同じだとまずいですか?

895 名前:デフォルトの名無しさん :2007/01/11(木) 00:27:28
>>894
同じIDが複数あっても、IDで識別できなくなるだけで仕様的にはかまわない。
アプリ次第。

896 名前:デフォルトの名無しさん :2007/01/11(木) 01:00:55
thx。あとコントロールIDの値の範囲って#defineされてましたっけ?

897 名前:デフォルトの名無しさん :2007/01/11(木) 01:06:39
うん

898 名前:デフォルトの名無しさん :2007/01/11(木) 01:19:24
うう、ぐぐっても出てこないっす。ヘッダ見てもどれだか・・・教えてください。

899 名前:デフォルトの名無しさん :2007/01/11(木) 02:19:32
USBハンドセット(HID)のボタン情報を取得したいんですが、情報がなくて困っています。
使っているのはP1-Kというものです。
SetupDiEnumDeviceInterfaces()で見つけてCreateFile()でハンドルを得て、
HidP_GetCaps()で得たサイズでReadFile()してますが、ブロックされて帰って来ません。
同様の方法でジョイスティックのボタン情報は取れるのですが、やり方が間違ってるんでしょうか。


900 名前:886 :2007/01/11(木) 09:24:03
遅レス失礼、886です。

>>888
dmOrientationを確認しましたが、どちらの場合も正しく設定されていました。
(縦方向ならDMORIENT_PORTRAIT、横方向ならDMORIENT_LANDSCAPE)

>>889
XFORM構造体を上手く設定できれば使えそうですね。ありがとうございました。

901 名前:デフォルトの名無しさん :2007/01/11(木) 13:05:46
_____________
|_________−□×|
|L |         |
|I | EDIT     |
|S |         |
|T |         |
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
↑このようなウィンドウを作ったとして、リストボックスとエディットボックスの境界線を
ユーザが移動できるようにするにはどうすればいいのでしょうか

902 名前:デフォルトの名無しさん :2007/01/11(木) 13:09:49
境界線をドラッグで移動した分だけListとEditの位置とサイズを変更する。

903 名前:デフォルトの名無しさん :2007/01/11(木) 13:10:18
境界線をドラッグしたら、リストボックスとエディットボックスのサイズを調整するようなプログラムを組む。

904 名前:デフォルトの名無しさん :2007/01/11(木) 14:08:37
特定の操作をしたとき、
アプリケーションを終了させたいです。

WindowProcedureを自分で作って、MSGの値によって、
PostQuitMessage()を呼ぶ。
メッセージループを GetMessage(...)>0 のとき繰り返すようにする。

のようにしていますが例えば
switch(msg){
case WM_LBUTTONDOWN:
PostQuitMessage(0);
return 0;
}
としても、右ボタンクリックで終了しません。
そこで、ちゃんと実行されているのか確認しようと思って、
switch(msg){
case WM_LBUTTONDOWN:
MessageBox(hWnd, TEXT("test"), TEXT("test"), NULL);
PostQuitMessage(0);
return 0;
}
としたら、1回クリックするとメッセージボックスが表示されて
もう1度クリックすると、メッセージボックスが表示されずに終了しました。

何が起こっているのかわからないので、説明してください。

905 名前:デフォルトの名無しさん :2007/01/11(木) 14:14:33
>>901
LISTとEDITの間に幅のちんまい自作コントロールを貼り…
自作コントロール側: ドラッグ処理後、親にドラッグあったことを通達
親:通達をうけて、LIST/自作コントロール/EDIT を再配置

906 名前:デフォルトの名無しさん :2007/01/11(木) 14:32:47
>>904
LBUTTONだから左クリックでは?

907 名前:デフォルトの名無しさん :2007/01/11(木) 14:40:17
>>906
すいません、文章のミスです。左クリックの間違いです。

908 名前:デフォルトの名無しさん :2007/01/11(木) 14:43:54
>>907
だったらそのコードだけではそんな文章のようにはならない。
メッセージボックスが出た場合は、閉じたら即PostQuitなのでそのまま終了する

まああちこちにPostQuitMessage置かないほうがいいと思うけどね。
WM_CLOSE投げとけ。

909 名前:デフォルトの名無しさん :2007/01/11(木) 14:48:22
     ∧__∧
    ( ・ω・)   いやどす
    ハ∨/^ヽ
   ノ::[三ノ :.'、
   i)、_;|*く;  ノ
     |!: ::.".T~
     ハ、___|
"""~""""""~"""~"""~"

910 名前:デフォルトの名無しさん :2007/01/11(木) 15:11:19
>>909
誰w
>>908
ということは別の何かが原因ってことですか。
WM_CLOSE投げたら、思ったように終了しました。
なんでだろ。
ありがとうございます。

911 名前:デフォルトの名無しさん :2007/01/11(木) 16:02:36
>>901
MFCかVCLのソース嫁

912 名前:デフォルトの名無しさん :2007/01/11(木) 17:40:02
>>904
たぶん、その問題とは関係ないけど

MSDNそのまま読むと、
GetMessage関数って-1は失敗だけど、それ以外は成功じゃね?

その記述だと、-2以下が帰ってきたらダメな希ガス
(そんな値が帰ってくるかどうかシランがwww)

913 名前:デフォルトの名無しさん :2007/01/11(木) 17:44:08
>>912
なら
!= -1 が正解なのか。
でも、MS以外のサンプルだと>0ってのも良く見る。

914 名前:デフォルトの名無しさん :2007/01/11(木) 17:51:12
>>913
ちげーだろ、
0のときループから抜ける、-1のときエラー処理、それ以外のときループしなければならないんだから。

915 名前:デフォルトの名無しさん :2007/01/11(木) 17:53:15
>>914
さーせん・

916 名前:デフォルトの名無しさん :2007/01/11(木) 17:53:56
とりあえず、WM_QUIT を受け取ったら 0 が返るからループ終了。

これだけは外せないベ

917 名前:デフォルトの名無しさん :2007/01/11(木) 17:57:34
でも実際エラー処理なんてする?

918 名前:デフォルトの名無しさん :2007/01/11(木) 19:02:42
質問です。VC7を使っています。
外部のプロセスのウィンドウに存在する、
SysListView32コントロールの選択状態を変更したく、
以下のマクロを用いて実行してみたのですが、
どうも反応がありません。

ListView_SetItemState(対象ウィンドウ,アイテム番号,LVIS_SELECTED,LVIS_SELECTED);

なおこのマクロは、

LV_ITEM _ms_lvi;\
_ms_lvi.stateMask = mask;\
_ms_lvi.state = data;\
SNDMSG((hwndLV), LVM_SETITEMSTATE, (WPARAM)(i), (LPARAM)(LV_ITEM *)&_ms_lvi);\

のように定義されております。
この原因は、プロセス外のウィンドウに対し、ポインタを用いたメッセージを使用することにあるのでしょうか?
また、リストビューの選択状態を外部から変更できる、別の正しい方法があるのでしょうか?
ご教授下さい。

919 名前:デフォルトの名無しさん :2007/01/11(木) 19:10:49
>>918
>この原因は、プロセス外のウィンドウに対し、ポインタを用いたメッセージを
>使用することにあるのでしょうか?

その通りじゃね?

920 名前:デフォルトの名無しさん :2007/01/11(木) 19:22:38
>>919
ご返事ありがとうございます。
EditのSETTEXT等は上手くいっていたため、違うのではと思っていました。
それでは、このような場合の対処としては、どのようにすればよいか、ご存知でしょうか?
前に検索してみたときは、9x時代の情報でVirtualAllocというのを少し目にした事があるのですが、
今もこれを使うものなのでしょうか?

921 名前:デフォルトの名無しさん :2007/01/11(木) 19:32:24
>>920
共有メモリにすればいいんじゃね?

922 名前:デフォルトの名無しさん :2007/01/11(木) 19:36:22
>920
NTではVirtualAllocEx、9xではメモリマップドファイルを使う。
ttp://techtips.belution.com/ja/vc/0001/


923 名前:デフォルトの名無しさん :2007/01/11(木) 20:03:14
>>921-922
ありがとうございます。
リンク先のサンプルソースを改変して、無事希望の動作が出来るようになりました。
VirtualAllocExを使用する方法、初めは面倒くさそうに思っていたのですが、意外と簡単に出来て良かったです。

1.ウィンドウハンドルから、対象のプロセスの仮想メモリ読み書き可能なハンドルを得る
2.自プロセスと対象プロセスで共有メモリを作成
3.ローカルの共有メモリを好きなように書き換え、
 WriteProcessMemoryでグローバルな共有メモリに上書き
4.SendMessageで共有メモリを使用する
5.解放

このような動きですよね。
今回非常に助かりました。ご助言や適切な参考リンクに感謝いたします。
本当に、ありがとうございました。

924 名前:デフォルトの名無しさん :2007/01/11(木) 20:26:13
>>922
繋がらないです。

925 名前:デフォルトの名無しさん :2007/01/11(木) 20:27:39
>>924
ふーん

926 名前:デフォルトの名無しさん :2007/01/11(木) 21:05:41
http://wisdom.sakura.ne.jp/system/winapi/win32/win22.html

ここを参考に画像を描画するプログラムを作りたくて、画像ファイルを別の関数で読み込んだんですが、
どのタイミングで読み込みの関数を呼び出せばいいのかわかりません。

927 名前:デフォルトの名無しさん :2007/01/11(木) 21:22:18
>>926
メニューハンドラから呼んで読み込むんでないの?
読んだらビットマップにしておいて、WM_PAINTでBitBlt()すればいいと思うよ。
もちろん、あなたのプログラムの構造によっていろいろやりかたもあるだろうけど

928 名前:デフォルトの名無しさん :2007/01/11(木) 22:48:13
>>882
> まぁ、将来の仕様変更で使えなくなる可能性はあるが。
CRTが使ってるからそのCRTがサポートされる限りは大丈夫だと思うけど
アプリが勝手に使えないという結論に変わりはないな
>>885
> lpReserved2に渡すバッファの先頭をポインタサイズでnullにすることに取り決めておけば使えるようです。
これやるとVista x64でおかしくなる可能性があるからやめてくれ
詳しくは12月のCygwin ml参照

929 名前:デフォルトの名無しさん :2007/01/11(木) 22:48:15
コンパイラとかのコンソールアプリから、
出力をリダイレクトするにはパイプでよかったよね?

930 名前:デフォルトの名無しさん :2007/01/11(木) 23:02:29
>>917
GetMessage のエラー処理は「する」のが基本


931 名前:デフォルトの名無しさん :2007/01/11(木) 23:09:40
GetMessageのエラー処理とはreturn -1;しているだけという俺のコード。

932 名前:デフォルトの名無しさん :2007/01/12(金) 00:08:06
>>931
正直、それだけで充分。
それをしてないプログラムもあったりするのが現実なんだよ。


933 名前:795 :2007/01/12(金) 00:34:48
>>928
レスどうもです。
lpReserved2のほうはVista x64で問題がおきる可能性があるのですね。
実はlpReserved2を使うほうは諦めました。
そもそもバッファを用意してその先頭をポインタサイズでnullにする方法はトリッキーすぎるかもしれません。

今のところ、下記の3通りの方法を考えています
@STARTUPINFOの読み出し方法は別途考えることにしてcdReserved2のほうはまだ諦めていません。
Aプロセス初期化時にDLLを注入してプロセスを識別できるように細工する方法も考えています。
B809さんに教えていただいたFILE_FLAG_DELETE_ON_CLOSEでCreateFileの方法も考えています。

どれも一長一短あり、まだ検討中です。もっとスマートな方法があるといいのですが。

934 名前:デフォルトの名無しさん :2007/01/12(金) 00:44:31
>802の、ジョブとプロセスの整合性を取る、
というのがよく分からん。ジョブオブジェクトが存続し続けるなら、
そのような整合性を取る必要はないのではないのか?

935 名前:795 :2007/01/12(金) 00:52:28
>>934
Jobオブジェクトはその中で動作しているプロセス群を列挙する方法や識別する方法がないので、
もしJobオブジェクトを握っているアプリ(プロセス監視プログラム)が異常終了してしまうと、
再起動した際にJobオブジェクトは認識できても、その中で動いていたプロセスであるかはわかりません。
そこでプロセスのどこかにどのJobオブジェクトに属してたのかを識別する方法として何らかの情報を打ち込んでおきたいのです。

もしJobオブジェクトからその中で動いてるプロセス群を識別する方法があれば、
各プロセスに「紐付け」する必要はないのですが…

936 名前:デフォルトの名無しさん :2007/01/12(金) 00:55:44
プロセスがpidファイルに書き残すのがいいんだろうけど
死んだときにそのファイルが一緒になくなるとは限らないのが問題なんだよね


937 名前:デフォルトの名無しさん :2007/01/12(金) 00:56:57
若いの。オラが村では派遣の問題を口にしちゃなんねーだ
お前さんはまだわけぇから言いたいこともあるべぇ
だべな、派遣問題を口にすると怒る者がおるでよぉ
問題の指摘は駄目だっぺぇ
派遣のことは口にしちゃなんねぇ
この村みたいな田舎で生きていくためにはよぉ
駄目のものを駄目と言ってはなんねえだめさ


938 名前:デフォルトの名無しさん :2007/01/12(金) 00:57:47
誤爆乙

939 名前:デフォルトの名無しさん :2007/01/12(金) 00:59:16
          ヽ / /⌒\
         /ヽヽ|/⌒\ii|\
       / /ヾゞ///\\|
       |/   |;;;;;;|/ハ \|
             |;;;;//⌒ヽ
             |;/( ^ω^) >>937 おっおっおっ誤爆乙枯ー
.           |{ ∪  ∪
             |;;ヾ.,____,ノ
             |;;; |
             |;;;;;|
             |;;;;;|

940 名前:デフォルトの名無しさん :2007/01/12(金) 01:00:48
IsProcessInJob
とか
QueryInformationJobObjectのJobObjectBasicProcessIdList
は何らかの理由で使えない、という話なのかな?

941 名前:795 :2007/01/12(金) 01:06:12
>>934
FILE_FLAG_DELETE_ON_CLOSEでCreateFileの方法ならプロセスの消滅とともにファイルも消えるので、
ファイル名かファイルにJobとProcessの関係を示す情報をもっておけば良さそうです。

>>940
「QueryInformationJobObjectのJobObjectBasicProcessIdList」!!!!
あれれ、QueryInformationJobObjectの情報問い合わせの系(7種)の中にPIDを列挙するものがありましたっけ!
もしかしたら、これ見落としてたかも… orz
今からよく調べてみます!

942 名前:795 :2007/01/12(金) 01:16:04
おおお!これはまさに!今まで何を苦労してチェックしてきたんだ… orz

>>940
すばらしい!あなたは神!

もし知っていたらついで教えてください。(おしえてばかりですみません)
プロセスがハングアップしたことを検出する方法はありますか?
タスクマネージャなどで「応答なし」という状態になっているプロセスのことですが、
これを識別する方法はありますでしょうか?

たぶん、メッセージポンプを駆動してるスレッドがブロックされて、メッセージが一定時間ディスパッチされないアプリを見つけるのだろうと思うのです。
またCUIタイプのプロセス(Subsystem=CUI)でGUIでないプロセスがハングアップした場合はメッセージポンプの方法では判別できないと思います。
Windowsはどうやってプロセスがハングアップしたことを認識してるのだろう…

943 名前:デフォルトの名無しさん :2007/01/12(金) 01:26:09
単に時間かかってるかどうかだろ
ハングアップじゃなくてしばらく返事しないだけで応答なしになる

944 名前:デフォルトの名無しさん :2007/01/12(金) 01:27:04
IsHungAppWindow(HWND)

945 名前:デフォルトの名無しさん :2007/01/12(金) 01:29:47
というか、タスクマネージャの応答無しはトップレベルウインドウ限定だからね〜

946 名前:795 :2007/01/12(金) 01:35:38
>>943
レスどうもです。確かに異常に重い処理をしてるアプリが動いていても「応答なし」となることがあります。
でもこれはメッセージをディスパッチしてないからだと思ってました。

>>944
レス有難うございます。こんな明快なAPIが存在してたなんて…

これでほぼ問題点を解決できました。
レスを下さった皆さん本当に有難うございました。

947 名前:デフォルトの名無しさん :2007/01/12(金) 01:36:36
ちゃんと動いてて
実情としてはメッセージループに処理が戻ってこないだけ
っていうときでも応答なし表示されるから

よく分かってないユーザーがそれ見て
そこでプロセスの終了したりして余計状況を悪くするんだお



948 名前:デフォルトの名無しさん :2007/01/12(金) 01:36:45
他人の(一般的な・限定しない)コンソールアプリがハングしているかどうかを
見分けるって、チューリングマシンの停止問題に帰着しかねないよな。
ハートビートを定期的に出すような作りにするとか、単にタイムアウトを付けるとか、
アプリの特性にあわせたハング検出ルーチンを用意しないとね。

949 名前:デフォルトの名無しさん :2007/01/12(金) 01:44:34
Outlookとか
OutlookExpressとか
M$のアプリにやたらとそれが多いような気がするのは
気のせいではあるまい

950 名前:デフォルトの名無しさん :2007/01/12(金) 01:46:33
あと
InternetExplorer とか
Explorer (つまり shell) とか
もうどこが安定した OS なのかと(ry

951 名前:デフォルトの名無しさん :2007/01/12(金) 01:47:32
あれ 950 踏んでる・・・

952 名前:795 :2007/01/12(金) 01:50:37
>>947
レス有難うございます。
確かにメッセージをディスパッチしてるスレッドを止めると応答なしとなることからも
単にスレッドが他の処理をやってて結果として応答なしとなってしまうようです。

>>948
レス有難うございます。
IsHungAppWindowのAPIはウィンドウハンドルをとることからもCUIのプロセスは判別が難しいかなと思いました。
やっぱり、そこまでするならクラスタリング用アプリのようにハートビートでロックしていないことを定期的に示すようにしないと無理そうです。
今回のプロセス監視プログラムは任意のアプリを監視する仕様なので残念ながらクラスタリング用の細工をプログラムにすることはできません。

もしかしたら、CUIアプリのスレッドが全てブロックされた状態になったことを検出してハングアップを検出できるかもしれませんが、
単にWaitしてブロック状態であることも考えられますのでこれもダメそうです。

またループしてた場合などは、ハングアップしたのか処理を継続してるのか判別がつかないので難しいと思います。
仮にデバッガープロセスであればインストラクション実行状況やアドレスを定期的に監視することもできますが、
それでもループ処理なのか無限ループなのかわかりません。
これは八方塞がりだと諦めています。

953 名前:デフォルトの名無しさん :2007/01/12(金) 07:43:42
Jobとか使わずに、専用ユーザーつくって、runas ってのはだめなのかな?
と、適当なことを書いとく・・・

どちらにしろ、すげークリティカルな相手みたいで大変だね・・・

954 名前:デフォルトの名無しさん :2007/01/12(金) 16:06:28
ハリコの虎見てちんちんおっきおっき


こ の 書 き 込 み を 見 た 人 は 三 年 後 に イ ン ポ に な り ま す 。

イ ン ポ に な っ て オ ナ ニ ー が 出 来 な く な る の が 嫌 な 人 は
こ の 書 き 込 み と 同 じ 文 章 を 三 時 間 以 内 に
違 う ス レ に 五 回 以 上 コ ピ ペ し て く だ さ い 。

五 回 書 き 込 ま な か っ た 男 子 学 生 が
書 き 込み を 見 た 後 三 年 後 に イ ン ポに な り ま し た 。




955 名前:デフォルトの名無しさん :2007/01/12(金) 17:55:35
        ∧_∧ n^)   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
       ( ´Д`/ /  <  先生!すでにインポな漏れはどうなるんでしょうか?
      / ,    /     \_________________
        | | , 、 i
 ____| |  | | |__
 ||\   (_/         \
 ||\\            \
 ||  \|| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄||
 ||   || ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄||
     ‖               ||


956 名前:デフォルトの名無しさん :2007/01/12(金) 18:40:37
USBデバイスが接続されたときに、
1.0と2.0のどちらで接続されたかどうかを判定したいのですが
そのようなAPIはありますか?
できればSHCNE_DISKEVENTSのタイミングで取りたいのですが。

957 名前:デフォルトの名無しさん :2007/01/12(金) 18:54:18

ここになんかありました
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/win32_usbcontroller.asp

958 名前:デフォルトの名無しさん :2007/01/12(金) 18:58:04
SetupDi を使用してハードウェア機器を列挙する方法
http://support.microsoft.com/kb/259695/ja

959 名前:デフォルトの名無しさん :2007/01/12(金) 20:21:19
>>958
なつけーソースw
その内容って、2000とXPで動作が異ならない?

確か文字数が・・・

960 名前:デフォルトの名無しさん :2007/01/13(土) 21:47:06
大丈夫だよおまえら
2chなくならないから

961 名前:デフォルトの名無しさん :2007/01/13(土) 21:51:30
てか、普通にAPI質問箱無くなると困るんだけどなー


962 名前:デフォルトの名無しさん :2007/01/14(日) 00:45:10
ム板はないと困る俺は底辺なのかな('A`)

ところで>>970あたりの方はお願いします

963 名前:デフォルトの名無しさん :2007/01/14(日) 00:53:02
だがこ、とわる!

964 名前:デフォルトの名無しさん :2007/01/14(日) 01:54:57
>>962
少なくともAPI32は情報交換って言う意味で俺には必要('A`)

965 名前:デフォルトの名無しさん :2007/01/14(日) 01:58:52
('A`)←しね

966 名前:デフォルトの名無しさん :2007/01/14(日) 02:05:50
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)


967 名前:デフォルトの名無しさん :2007/01/14(日) 02:09:18
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)
('A`)('0`)('0`)('0`)('0`)('0`)('0`)('0`)('A`)
('A`)('A`)('0`)('A`)('A`)('0`)('A`)('A`)('A`)
('A`)('A`)('0`)('0`)('A`)('0`)('A`)('A`)('A`)
('A`)('0`)('A`)('0`)('A`)('0`)('0`)('0`)('A`)
('A`)('0`)('0`)('0`)('A`)('0`)('A`)('A`)('A`)
('0`)('A`)('A`)('0`)('A`)('0`)('A`)('A`)('A`)
('0`)('A`)('0`)('A`)('A`)('0`)('A`)('A`)('0`)
('0`)('A`)('0`)('A`)('A`)('0`)('A`)('A`)('0`)
('A`)('0`)('A`)('A`)('A`)('0`)('A`)('A`)('0`)
('0`)('A`)('A`)('A`)('A`)('A`)('0`)('0`)('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)

968 名前:デフォルトの名無しさん :2007/01/14(日) 02:27:05

次スレ

Win32API質問箱 Build49
http://pc10.2ch.net/test/read.cgi/tech/1168708801/


969 名前:デフォルトの名無しさん :2007/01/14(日) 02:36:45


>>967は「死」って出るのか
よくやるなぁ

970 名前:デフォルトの名無しさん :2007/01/14(日) 03:45:51
>>968が新スレたててくれたから、質問させてもらいます。

CreateProcess()で起動したInternet Explorer(IE1)からjavascriptのwindow.open()で
新しく、別ウィンドウのInternet Explorer(IE2)を開いてるのですが、IE2がアイドル状態に
なるまで自作プログラムの処理を待機させるにはどのようにすればよいでしょうか?
IE2はIE1と別プロセスではなく,同一プロセスの別スレッドで動いている状態です。

呼び出しの関係は↓のようになってます。
自作プログラム(コンソールアプリ) -> CreateProcess() -> IE1 -> window.open() -> IE2

971 名前:デフォルトの名無しさん :2007/01/14(日) 10:07:51
while( IE2.Busy ){}

972 名前:デフォルトの名無しさん :2007/01/14(日) 10:22:06
_(アンダーバー)の仮想キーコードを教えてください。
何処を調べても出てきません(;´Д`)ハァハァ

973 名前:デフォルトの名無しさん :2007/01/14(日) 11:13:20
>>972
アンダーバーってSHIFT+バックスラッシュキーじゃないの?
少なくとも俺のIME+キーボードではそうなんだけど。
バックスラッシュキーならキーコード無しの0xE2
あとGetAsyncKeyStateとか使う場合はこれが何気に便利なんだぜ
ttp://www.vector.co.jp/soft/winnt/util/se074436.html


974 名前:デフォルトの名無しさん :2007/01/14(日) 11:17:18
CreateFileMapping使うときに
CreateFileでハンドル取得後
CreateFileMapping使うんですが
処理が終わった後
CloseHandleする時上記のAPIで取得したハンドル
どちらともClose処理しなければならないのでしょうか?

975 名前:デフォルトの名無しさん :2007/01/14(日) 11:43:19
>>974
YES。CreateFileは該当のファイルをオープンし、そのハンドルを返します。
つまり、このハンドルは開いたファイルに関する情報の構造体への
ポインタみたいな感じ(実際はちょっと違います)です。
CreateFileMappingはオープンしたファイルに関連付けられた
マッピングオブジェクト(メモリマッピングに必要になる色々な情報)
を作成、纏めてそのハンドルを返します。2つとも全く別物です。
片方が閉じられると連動してもう片方も閉じられるとか、そういう事はありません。

ちなみにメモリマップドファイルの蛇足として、
実際にファイルがメモリ上にロードされるのはMapViewOfFileが実行された時で、
メモリ上のファイルデータが実際のファイルに反映されるのは
UnmapViewOfFileが実行された時です。参考までに。

976 名前:970 :2007/01/14(日) 11:57:03
970です。
すいません、環境を書くの忘れてました。VC6.0でMFCは使ってません。
Win32APIのみで作成しています。あと、質問内容の書き方も悪かったので、
下に改めて書き直します。

1.自作プログラムからIE1を起動(CreateProcessでHTMLファイルを
  IE1の引数として起動させてます。自作プログラムとIE1は別プロセス)
2.IE1に読み込まれたHTMLファイル内のjavascriptのwindow.openで
  新たにIEのウィンドウ(IE2)を開く(IE1とIE2は同一プロセス)

この状態で、自作プログラムからIE2の状態を監視して,IE2がアイドル状態に
なるまで,自作プログラムの処理を待機させたいのです。

>>971氏の方法はIE1内でwindow.openではなくてCreateObjectを使うってことでしょうか?

長文で申し訳ないですが、よろしくおねがいします。


977 名前:デフォルトの名無しさん :2007/01/14(日) 11:59:57
>>975
参考になりました。ありがとうございます。

978 名前:デフォルトの名無しさん :2007/01/14(日) 13:37:46
>>973
US配列だとshift+マイナスだったりしないかな

979 名前:デフォルトの名無しさん :2007/01/14(日) 13:47:34
>>973
スキャンコードは仮想キーコードからMapVirtualKeyで変換したもの使わないとキーボードドライバによっては不具合出る。(US101ドライバとか)


980 名前:デフォルトの名無しさん :2007/01/14(日) 14:45:42
>>973
>>972どえす
おおきにアンダーバー0x2Eでビンゴでした、それからVKどわすれくん、重宝します。


981 名前:デフォルトの名無しさん :2007/01/14(日) 15:33:28
埋め

982 名前:デフォルトの名無しさん :2007/01/14(日) 21:10:52


983 名前:デフォルトの名無しさん :2007/01/14(日) 21:16:51
>>974
ハンドルを2つ管理するのが面倒だったらCreateFileMappingの後で
CreateFileから返ってきたハンドルは閉じてしまってかまわない

984 名前:デフォルトの名無しさん :2007/01/14(日) 21:17:01
土里

985 名前:デフォルトの名無しさん :2007/01/14(日) 21:20:19
埋める前に次スレ立てろよ…と思ったらもう立ってたのか
http://pc10.2ch.net/test/read.cgi/tech/1168708801/l50

986 名前:デフォルトの名無しさん :2007/01/14(日) 21:27:46
十田
/土

987 名前:デフォルトの名無しさん :2007/01/14(日) 22:24:13
>>983
それって大丈夫なのか?

988 名前:デフォルトの名無しさん :2007/01/14(日) 22:47:02
>>987
大丈夫じゃない。
ttp://msdn2.microsoft.com/en-gb/library/aa366542.aspx
>In addition, the file handle should remain open until the process no longer needs the file mapping object.

989 名前:デフォルトの名無しさん :2007/01/14(日) 22:47:20
>>987
ファイルマッピングハンドルは内部的にファイルハンドルへの参照も持つから
大丈夫なことは保証されてる。確かAdvanced Windowsにも出てた

990 名前:デフォルトの名無しさん :2007/01/14(日) 22:49:28
>>988
その直前にある分を無視するなよ。排他アクセスを保証したい場合は、だろ。
> To ensure that other processes cannot write to the portion of the file that
> is mapped, you should open the file with exclusive access.

991 名前:デフォルトの名無しさん :2007/01/14(日) 23:19:14
結局どっちでもいいんでね?

992 名前:デフォルトの名無しさん :2007/01/14(日) 23:46:09
どうせATL::CHandle使うからどうでもいい。

993 名前:デフォルトの名無しさん :2007/01/14(日) 23:48:38
うま


994 名前:デフォルトの名無しさん :2007/01/14(日) 23:51:23
うま

995 名前:デフォルトの名無しさん :2007/01/14(日) 23:53:10
まう

996 名前:デフォルトの名無しさん :2007/01/14(日) 23:54:18


997 名前:デフォルトの名無しさん :2007/01/14(日) 23:55:06


998 名前:デフォルトの名無しさん :2007/01/15(月) 00:02:07
ちんちん

999 名前:デフォルトの名無しさん :2007/01/15(月) 00:03:22
かいかい

1000 名前:デフォルトの名無しさん :2007/01/15(月) 00:03:41
Win32API質問箱 Build49
http://pc10.2ch.net/test/read.cgi/tech/1168708801/


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