スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんやお姉さんたちが答えてくれるかも。
過去スレ、関連リンクは
>>2-5 くらい。
■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(
http://msdn.microsoft.com/library/ )の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで
2 :
2 :2007/02/17(土) 23:13:16
自己解決しました。
>>1 にカチンときたので教えません。
バーカ!
リストボックスにアイテム挿入してるんだけど 一番左のカラムにしか文字列が挿入されないんですが。 ちゃんとiSubItemの値を変えてるのに何でだろうと2時間ぐらい悩んでてもう限界です。 何か心当たりがある事があれば教えてください。
妹「お兄ちゃんって落ち込んだ時どうする?」 俺「んー、別に何も。寝るかな」 妹「ふーん・・」 俺「どうした?何かあったか?」 俺「ううん、ちょっとね」 俺「何だよ水くさいな、言ってみろよ」 俺「う、うんとさ・・・」 俺「おう」 俺「お兄ちゃん、この間一緒に歩いてた人、彼女?」 俺「・・・は?」 俺「前学校の近くで話してたじゃん」 俺「ああ・・・あいつか。なわけないだろ、ただのクラスメートだよ」 俺「ほんと?」 俺「嘘言ってどうすんだよ」 俺「そっか」 俺「てかそんな話はいいんだよ。落ち込んでたんじゃなかったのか?」 俺「ううん、それならいいんだ!えへへ」 俺「おかしな奴だな」 俺「ふふ♪お兄ちゃんに彼女なんてできるわけないよね、よく考えたら。」 俺「こらこら、失礼だぞ」
ここまで点プレ
俺「お・に・い・ちゃん!」 俺「なんだ勝手に部屋に入っちゃだめだろ」 俺「えへへ…」 俺「あたし…知ってるんだよ…おにいちゃんのベットの下に…」 妹「あんた何やってるん?」
13 :
8 :2007/02/18(日) 01:28:21
item.mask = LVIF_TEXT; item.pszText = TEXT("aa"); item.iItem = 0; item.iSubItem = 0; ListView_InsertItem(List, &item); item.mask = LVIF_TEXT; item.pszText = TEXT("bb"); item.iItem = 0; item.iSubItem = 1; ListView_InsertItem(List, &item); item.mask = LVIF_TEXT; item.pszText = TEXT("cc"); item.iItem = 0; item.iSubItem = 2; ListView_InsertItem(List, &item); item.mask = LVIF_TEXT; item.pszText = TEXT("dd"); item.iItem = 0; item.iSubItem = 3; ListView_InsertItem(List, &item); これで何で一番最初のカラムにしか文字がはいらないんだsdlgkj;あfwぇk;うぇふぃじこあ;sdlふぁうぇ
わっふるわっふる
>>13 iSubItem=1 以降は ListView_SetItem()
>>13 もしかして、LVCOLUMNってのか?
わっふるわっふる
17 :
8 :2007/02/18(日) 01:54:09
>>15 ちょっと試してみます。
>>16 LVCOLUMNですが何か特別な問題でもあるんでしょうか?
18 :
8 :2007/02/18(日) 01:59:46
できました。ありがとうございます
仕事でもなく寝ずにSDK書いてる俺ってもうダメかな?
20 :
19 :2007/02/18(日) 04:33:49
もうすぐ日が昇ってくるぜ
21 :
19 :2007/02/18(日) 04:36:18
反応が無いからなのか何故だかわからないが目の前のディスプレイが歪んできた
22 :
19 :2007/02/18(日) 04:37:08
やっぱ誰もいないべな
23 :
19 :2007/02/18(日) 04:40:32
もう疲れたし、オ○ニーでもして寝るか
24 :
19 :2007/02/18(日) 04:45:52
仲間がいたぜwwwwwwww
SDKで書いてるなら、がんがれ SDKを書いてるなら、もっとがんがれ
26 :
19 :2007/02/18(日) 04:58:24
息抜きに続き考えたぜwwwwwww 俺「あっ・・・いや、学校での・・・・演劇の・・・練習をちょっと・・。」 妹「はっ?私もあんたと同じ学校だけどうちの学校に演劇部なんてないでしょ?」 俺「いやだかr」 妹「あんたさー。妄想するのは勝手だけど私をネタにするのはやめてくれる?(笑)」 妹「この・・・邪気眼が!!!!!!!!!!」 バタンッ・・・ 俺「やれやれ、もう少しで俺の手が暴れだす所だったぜw」 俺「・・・・・・アッー!!!」
27 :
19 :2007/02/18(日) 05:01:30
28 :
19 :2007/02/18(日) 05:04:53
すんませんwwwwwwwww もう寝れない時間まで起きてしまいました 今日仕事で今寝ると絶対遅刻しちゃってそりゃもう大変な事になってしまいます
29 :
19 :2007/02/18(日) 05:10:44
それじゃ、もう寝るです。おやすみなさい。
30 :
19 :2007/02/18(日) 06:05:37
おはようおまえら
31 :
デフォルトの名無しさん :2007/02/18(日) 07:37:38
33 :
19 :2007/02/18(日) 08:30:22
あ、プリキュア見なきゃ
34 :
19 :2007/02/18(日) 08:33:42
おお、いかんいかん忘れるところだったdd
35 :
デフォルトの名無しさん :2007/02/18(日) 09:58:00
裏切派遣って知ってる? 元々は正社員だったのに取引先にフリーのほうが稼げるとか騙されて、派遣やってるバカのことw 前の会社を裏切り、結局派遣先からも騙されてる。 そもそも信頼されてるなら直接契約するか正社員にするはずだが、派遣会社経由って舐められ杉 自分でも騙され裏切れられることは薄々わかったるから派遣問題の話が出るとウッキー!って逆ギレw
36 :
19 :2007/02/18(日) 10:09:54
何人いるんだよwwwwwwwwww
37 :
デフォルトの名無しさん :2007/02/18(日) 14:13:27
CTRL+ALT+DELをプログラムからPCに送る方法ありませんか? keybd_eventやVNCがやってる方法では期待する動作になりませんでした。 単にタスクマネージャーを出したいわけではなく、割り込みを発生させたいのです。
その質問どこかで見た
>>38 前スレの最期の方の質問。
お ま え ら カ チ ン と 来 る な よ !
40 :
31 :2007/02/18(日) 16:04:04
sageろ低脳
>>40 アナログ時計画面を閉じた時点で、アナログ時計画面が破棄されている。
メニュー選択時に作成するようにするとか、
アナログ時計画面のWM_CLOSEで、ShowWindowで隠すだけにして、DestoroyWindowしない。
43 :
31 :2007/02/18(日) 16:50:47
>37 割り込みを発生させたい、の意味が分からん。
システムがヒィヒィ言ってるときでも速やかに応答させたいんじゃないの
今、彼女をヒィヒィ言わせてますが何か?
47 :
46 :2007/02/18(日) 21:38:10
昨日、仕事から帰ってきた姉に、オナニー見られて大爆笑された。 その後、部屋に真っ赤になって閉じこもってたら、 姉から携帯にメールがあって、 「あたしも毎日やってるんだから気にするな!ファイト!!」 って書いてあった。
素朴な疑問なんだけどCTRL+ALT+DELとかALT+TABってシステムコールなん?
SAS。winlogonが最優先で奪取するキーの組み合わせ。
仮想空間アドレスがどの物理メモリに割り当てられているか知る術がありますか。
Win32APIのレベルでは、「知ってどうするの?」だなー。
>>49 サンクス
つまりwinlogonにTerminateProcessするとunknown hard errorになる代わりに
CTRL+ALT+DELを横取りされなくなるんですね
確かに横取りは出来なくなると思うが、それはOSが落ちる事を意味するのでは? 一度試してみれ。
マジレスされちゃったので答えとくと当然青画面になるよ
57 :
デフォルトの名無しさん :2007/02/18(日) 23:38:08
BSODってドライバ以外から作り出せるのかね
GetFontUnicodeRanges( dc , NULL )が返す値について教えて下さい cRangesの値が4でWCRANGEの0〜3が下記のような値が得られました。 ranges[0].wcLow = 0x0000 ranges[0].cGlyphs = 0x0081 ranges[1].wcLow = 0xf8f0 ranges[1].cGlyphs = 0x0004 ranges[2].wcLow = 0xff61 ranges[2].cGlyphs = 0x003f ranges[3].wcLow = 0xffff ranges[3].cGlyphs = 0x0001 平仮名の'あ'(0x3042)は、得られたWCRANGEのいづれにも 含まれないのでTextOutでの表示はできないと思っていた のですが、問題なく'あ'が表示できます。 現在選択中フォントのUNICODE文字有無は、GetFontUnicodeRanges()では できないのでしょうか? 環境は、Windows2000+VC6+SP6です。
自分でペイントで作ったマウスカーソルを使いたいのですが 調べてもよく方法がわかりませんでした よろしければ教えてください
60 :
19 :2007/02/19(月) 00:29:33
>58 フォントリンクがあるからねぇ。
62 :
567 :2007/02/19(月) 06:28:56
おまいら久しぶり
>61 そうなると任意のunicode文字が表示可能かを判断する方法は フォントリンクまでたどらないと判別できないという事ですね? なんか単純な方法は、ないかなぁ・・・
DrawText で DT_CALCRECT 矩形サイズなり LastError なりで判定できないもんかな?
>>63 要点が見えないんだが・・・
もう少し詳しく説明してくれね?
何をしたいのか、命題はいかに?
>>65 やりたい事は、「表示しようとしているunicode文字が
現在のフォントで表示できるか判断したい」です。
表示しようとしているunicode文字が現在フォントに
グリフが無ければ代替文字(×マークとか?記号とか)にして
存在すればそのまま表示したいのです。
67 :
デフォルトの名無しさん :2007/02/19(月) 13:45:00
サービスの ServiceMain コールバック関数に、 ユーザー定義データを渡せないのは痛いね。 オブジェクト指向化しにくいね。みんなどうやってる?
ドライブレターを割り当てていないパーティションがあって、 そのパーティションにアクセスしたい(そのパーティションの情報を取得したい) どうすればできますか? 無理なら無理矢理空いているドライブレターを割り当ててそこから情報を取得 すればいいと思うけど、割り当てをプログラム上からできるのかしら・・・?
FindFirstVolume、FindNextVolume でみつかる?
>>69 ボリューム名は取得できました。
そこからはどうすればいいでしょうか?
QueryDosDeviceでデバイスを取得して、そのデバイスをCreateFileで開いてハンドルを
取得してDeviceIoControlで情報取得しょうか?
TransparentBltやAlphaBlendはWindowsMeでは機能しないんですか?
たしかにMSDNライブラリを見るとWindows 2000からと書いてあるね。
Windows98/SEでTransparentBltを使うとすごい勢いでGDIハンドルが増加していくんだよな Meでは使い物になるんだろうか
>>70 それでいけると思う。
末尾の \ は消さないとCreateFile()で失敗するかも。
あとOSによって差が大きかった気がする。
>>72 英語版を読むと、98/MEもいけそうだよね
76 :
デフォルトの名無しさん :2007/02/19(月) 20:24:19
コードが配置されてる先頭のアドレスが知りたいのですがうまくできせん CONTEXT c = {0}; c.ContextFlags = CONTEXT_CONTROL; GetThreadContext(hThread, &c); LDT_ENTRY ldt = {0}; GetThreadSelectorEntry(hThread, c.SegCs, &ldt);
そのアドレス、って何アドレスだ? 物理か?セグメント相対か?
78 :
デフォルトの名無しさん :2007/02/19(月) 21:13:26
質問です。 親ウインドウから子ウインドウを起動させて、子ウインドウを終了させると 親ウインドウがアクティブウインドウになってくれず他のウインドウの 下に隠れてしまいます。親ウインドウがアクティブになる方法を 教えてちょんまげ。
ちょんまげにキレた。子ウィンドウ終了時にShowWindowじゃダメなのか。
>>76 PEヘッダに書いてあるベースアドレス+セクションの仮想アドレスで求まる。
コードサイズも同じ場所の仮想サイズから特定できる。
exeが読めない状況でもPEヘッダ自身はベースアドレスにロードされてる。
ほとんどの場合は上記の方法で判るが、意地の悪いプログラムだと
デバッガを化かすコードが入ってたりするので、実際のコードの開始
アドレスはプログラム毎に任意と考えるべき。
信用して良いのはGetThreadContextで得たEip以降のコード。
ウィンドウを終了、tぽいう表現に違和感を感じる今日この頃。
書き忘れてたけどベースアドレスはGetModuleHandleで判るからね。
>>78 Owned Windowは、WS_POPUPにすべし
“普通”の、例えばMFCを中心に使っている初級Windowsプログラマが見て
「そこまでトリッキーなことはしていなさそう」と感じる程度の
アプリケーションを開発する上で、
>>80 みたいな知識が必要になることってどれくらいあるんですか?
1.他プロセスにアタッチするようなアプリケーションはかなり特殊な
存在であって、「普通の」アプリ開発者とは接点がない
2.普段は使わない知識だが、時々必要になることがあるので
こうして質問する人がやって来る
3.実はWindowsでプログラムを書く上では割と基本的な知識
他のアプリケーションに介入して弄り回したいときとかは、場合によっては 必要になることもあるかもしれない。詳しく知っててモノ書いてる連中は だいたいMVP持ってたりするな。
俺は1だと思うが、2だと言う意見の人がそれなりにいてもおかしくないとは思う。 それに実際必要かどうかはともかく80くらいは豆知識として知っていておいて損はない。
勘違いでなければ多分こんなの? DWORD dwDummy; IMAGE_DOS_HEADER dos; IMAGE_NT_HEADERS nt; if ( ::ReadFile(hFile, &dos, sizeof(IMAGE_DOS_HEADER), &dwDummy, NULL) // DOSセクション分読む && dos.e_magic == IMAGE_DOS_SIGNATURE // DOSですか? && ::SetFilePointer(hFile, dos.e_lfanew, NULL, FILE_BEGIN) // dos.e_lfanew==エントリーポイント && ::ReadFile(hFile, &nt, sizeof(IMAGE_NT_HEADERS), &dwDummy, NULL) // PEセクション分読む && nt.Signature == IMAGE_NT_SIGNATURE ) // PEですか? { entryPoint = nt.OptionalHeader.ImageBase + nt.OptionalHeader.AddressOfEntryPoint; } 俺はそれよりGetThreadSelectorEntryの使い道が全く判らない
1であり2である
>>84 2かな。他プロセスに干渉するアプリは確かに特殊な部類ではあるけど
必要に迫られて使うことって結構あると思うし。
WindowsプログラミングするならAdvanced Windowsは持っといて損は無いと思うよ。
全部理解するのに余裕で2ヶ月とかかかるけど。学生ならそのうちにやっとくのも良し。
>>85-86 他プロセスへのAPIフックぐらいなら出来るのですが、
それがどうしても必要になるといった状況にはなかなか出会ったことがなくて、
しかしこのスレにはかなりの頻度で他プロセスが絡む質問が出てくるので
疑問に思って質問させていただきました。
何にせよ、知っていて損はしないので、ぼちぼち覚えていこうと思います。
ありがとうございました。
>>75 ただしWin98のAlphaBlendはバグ持ちなので実質的に使えない。
(WinMeでは修正されてる)
>>87 WOW32とかOS/2サブシステムとかで必要だったものをついでにWin32にも
開放してみたという感じかと
自分以外の指定したウインドウが更新されたかどうかと、その更新された 領域を知りたいと思っています。SetWindowsHookEx()を使ってWM_PAINTを フックしているのですが、監視対象の子ウインドウが更新されたかどうか まではわからないようです。この場合、子ウインドウも全てフックして やるしかないのでしょうか?
つーかAlphaBlendなんて自前でやるもんだろ フルスクラッチ(ryでも買って読めば誰でもできるし
>>89 "Advanced Windows"、興味は前々から持っていたのですが
いかんせん自腹で買うのには少々高くて二の足を踏んでいました。
これを機に検討してみます。。
昔VIPのプログラムやろうぜスレにSSE2使った アルファブレンドのソースがあってたまげたの思い出した。
>>91 そういう理屈なのかー
なんかPEB拾うとかいう用途はあるみたいだけどNtQueryでできるし
俺「なー姉貴。ReadFileEx関数の、最後の引数なんだよ?」 姉「あぁそれね・・・完了ルーチンのポインタなんよ」 俺「へ?」 姉「読込処理が終わった時に呼ばれる、完了ルーチンのポ・・・・ぽ」 (急に小声) 俺「?」 姉「終わったときに呼ばれる関数のポインタ!!。変なこと聞かないデ!!」 (なぜかプリプリ怒ってる)
やあ義弟
くだらねーwww
チンポイン
日本にWin32について語れる姉弟が何組いるのか
わっふるわっふる
アルファブレンドって、何かうまそうじゃね? 秋葉でカフェオレとかをアルファブレンドコーヒーに名前変えたら売れね?
ここにアルファー
106 :
78 :2007/02/20(火) 06:43:35
>>96 フルスクラッチによるグラフィックスプログラミング入門
秀和システム発行
3つのSTATICの子ウインドウを作ってサブクラス化し、ひとつのプロシージャで 処理をしたいと思っています。 どのウインドから飛んできたのかを知りたいのですが、どのパラメータを見たら それがわかるのでしょうか? 質問の仕方がわかりづらければ申し訳ありません。 解ればお教えください。
HWNDが違うんじゃないの?
HWNDで判断するしかないのでしょうか? CreateWindow時の子ウィンドウIDを取得する方法がないでしょうか? という質問の仕方に気づかず余計な回答をさせてしまって申し訳ありません。 今もGoogleで調べているのですが、ちょっと難しくてなかなか回答に たどり着くことができていません。
あなたの日本語がわかりません。
>>111 質問読まず書き子
メニューのリソースIDで判別できるんじゃね?
>>111 GetWindowLong(hWnd, GWL_ID)
>>113 質問の仕方がわるくて本当に申し訳ありません。
それです。
それを取得する方法を探しています。
勉強をはじめたばかりで回答になかなかたどり着けなくて・・・。
>>111 いまいち、何を言いたいのか見えてこないが
たぶん、GetWindowLongでGWL_ID
>>116 サンプルを作って試してみました。
その方法を探していました。
回答ありがとうございました。
119 :
デフォルトの名無しさん :2007/02/20(火) 12:37:31
ウインドウの上からマウスが外れたときに検地するにはどうしたら良いでしょうか?
>>119 日本語が不自由だとなにかと不便だよね。
日本での生活は辛いかも知れないけど、母国のことを思い出してがんばってね。
>>119 >検地
歴史書を紐解くといいと思います。
TrackMouseEventが使いにくいからといってフックしたり常時監視したりするアホ
ウィンドウに乗っているコントロールに対して 透過でフェードアウトを実装する事は可能でしょうか? AnimateWindow SetLayeredWindowAttributes あたりで可能でしょうか? 見た感じでは、Window限定のような気がするのですが・・・。
GDIで透過色付きで且つ半透明なものを描画しようと思うんですが、 ワーキングメモリとしてのビットマップは静的にある程度の大きさを持つものを予め用意しておくか、 描画用の、AlphaBlend等のAPIをラップした関数を呼び出すたびにその関数のスコープ内部で済ませるか迷っているんですが、 前者の場合は始終無視できない程度のメモリが占有される事が、 後者の場合は関数呼び出しのたびのオーバーヘッドの事が心配で一向に開発が進みません。 普通はどうするんでしょうか。
まず以下のことを明確にせよ。 無視できない程度のメモリは何メガなのか? 無視できる程度のメモリは何メガなのか?
>>124 普通はそれぞれどの程度の問題になるのか数値化して検討する。
いや、寧ろこんなところで聞かない。
静的に確保するとすれば、512KB以上は無視できない。 関数のオーバーヘッドは、1KB以上であれば無視できない。
ばーか
そろそろカチンときそうです。
>>124 その描画関数がどんなタイミングでどの程度呼ばれることになるのか?
とかも考えましょう。アプリケーション自体の寿命に対して局所的かつ連続して呼ばれる
なら初期化関数、描画関数、終了関数に分けて以下のようにするとか。
初期化関数()
描画関数()
...
描画関数()
終了関数()
親ウインドウに子ウインドウは貼り付けて、子ウインドウだけを 半透明にさせることって出来ますか? ウインドウ全体を半透明にするのは簡単に出来たのですが、 子ウインドウだけってのは無理でした。 自分のソースが間違っているのか、そもそも無理なのか 解らないので知っていたら教えてください。
みんな! あたしの為の、カチンとならないで!!
VistaでCSIDL_PROFILE の仮想フォルダ のCSIDLってないですか?
Win32APIの32とはなにですか?しりたいのです。
16の倍で、64のちょうど半分です
丁度指が足りなくなる数
ゲイツ「えと、なんとなく…」
√1024 美しいと思わないかね?
Win32は32ビットCPUを対象として開発されたものだから32ビットの32。 当然Win16もあった。 x64やIteniumのはWin64かと思いきゃ、 Win32 for 64-bit Windowsという呼称が一部で見受けられる。 (無論WOW64のことではない)
ゲイツ「そうだったんだー、へー」
質問箱って書いてありますが、ここ、箱じゃないですよね。 なのに何で箱なんですか? タイトル名からうそをついているようではとてもじゃないけどうその答えを 返されそうで質問できません。
日本語でおk
おまえさんは箱の定義を勘違いしてるんだろう。
ネタにマジレスってカッコイイよね
質問できないといいつつ、質問してるのはお約束だな。
>>141 君はこのスレは箱ではないと思っているから、ここは箱ではないんだ。
ここが箱でない以上それは尤もな考え方であって、つまりここは箱ではないんだ。
しかし、よくよく考え直してみてくれ。ここが箱であったっていいじゃないか。
そういうわけで、仮にこのスレが箱だとしてみると、君の考え方は間違っていることになる。
それは即ちここが箱であるということに他ならず、仮定は正しかったということになるんだ。
148 :
78 :2007/02/20(火) 20:31:23
149 :
133 :2007/02/20(火) 20:59:20
自己解決しました。 FOLDERID_UsersFilesですね。 しかし糞スレだな
はこ 【箱/▼函/▼筥/▼匣/▼筐】 (5)厠(かわや)に置いて大便を受けるもの。しのはこ。また、大便。 「―すべからず/宇治拾遺 5」
キャスト以外の方法で、 整数を受け取って席轍に変換されたvoid*を返すようなAPIってありますか?
席轍→適切のミスです
意味不明
そもそも整数はデータ表現の問題で、キャストはコンパイラと言語仕様の問題、 それがAPIと何の関係があるんだ?
156 :
19 :2007/02/20(火) 22:25:35
うん、つっこまれて気づいた ごめんなさい
>>121 日本語が不自由な奴に秀吉見せたらファビョるぞ
サウンド機能についてです。 色々なメディアプレイヤーを使っていると 勝手に音量の位置が変わってしまいます。 これを固定とかしようと思うのですが どうすればいいですか? 既存ソフトだと細かい事ができないので 自分で何とかしたい訳ですが・・・
ミキサー勝手に弄るアプリは死んで良いと思う今日この頃。
サブクラス化したSTATICでTrackMouseEventでウインドウからマウスが外れたことを 知りたいと思うのですが、プロシージャのどの部分でTrackMouseEventを 設定すればよいのか、またメッセージのWM_MOUSELEAVEをどこで受け取ればよいのか が解りません。 サブクラス化が良く理解できていないのは解りますが、理解の助けになる、 もしくはマウスが外れたことを知る方法の参考になるサイトなどがありましたら 教えてください。
166 :
デフォルトの名無しさん :2007/02/21(水) 13:44:41
サブクラス化
http://wisdom.sakura.ne.jp/system/winapi/win32/win64.html ここを参考にSTATICのサブクラス化を学んでいます。
サブクラス化したプロシージャでマウスの左ボタンを押したことを
GetKeyState(VK_LBUTTON)にて検知していますが、switch (msg)で
case WM_LBUTTONDOWN:を使って検知することはできませんでした。
WM_LBUTTONDOWNなどのメッセージを受け取るにはどうするのでしょうか?
WM_MOUSEMOVEなどのメッセージを受け取りたいと考えていますが、
何から理解していけば良いのか途方にくれています。
ご助言をお願いします。
たぶんSTATICでメッセージ受けるのはサブクラス化以前で説明済みなんだろうな
168 :
デフォルトの名無しさん :2007/02/21(水) 20:02:19
>>76 とか
>>80 とかを見て実験してみようと思って
IMAGE_DOS_HEADER dos = {0};
ReadProcessMemory(proc, (LPCVOID)base, &dos, sizeof(dos), &bytes);
if(sizeof(dos) != bytes || dos.e_magic != IMAGE_DOS_SIGNATURE)
return false;
bytes = 0;
IMAGE_NT_HEADERS pe = {0};
ReadProcessMemory(proc, (LPCVOID)(base + dos.e_lfanew), &pe, sizeof(pe), &bytes);
if(sizeof(pe) != bytes || pe.Signature != IMAGE_NT_SIGNATURE)
return false;
ULONG64 start = pe.OptionalHeader.ImageBase+pe.OptionalHeader.BaseOfCode;
ULONG64 end = start+pe.OptionalHeader.SizeOfCode;
std::cout << (void*)start << " -> " << (void*)end << std::endl;
とコードを書いて実行したら0x00401000 -> 0x0048e000と表示されたのだが0x0048e000以降も関数が配置されてるorz. なにか勘違いしちゃってますか?
ちなみにターゲットはVC7.1で作った、いたって標準的なHelloWorldです
>>168 アドレスの計算の仕方はそれで合ってる。
ただしそのサイズはアラインメントされたサイズなので、
仮想メモリにマップ後の実際のコードサイズの値は、
セクション毎のVirtualSizeを見ないとわからんよ。
普通のコードセクション(.text)なら
SizeOfCode == SizeOfRawData >= VirtualSizeだから、
大よそが判れば良いなら
>>168 の方法でもいいけど、
SizeOfRawData < VirtualSizeもありうる。
>以降も関数が配置されてる
これはどういう方法で確認してる?
実際の所コンパイルオプション見ないとわからんけど、
インポートアドレステーブルだったり他のセクションが
混ざってるとかじゃないかね。
OptionalHeaderだけじゃなくてその後のセクションの
情報も見て位置を把握しないと判りづらいと思うよ。
170 :
168 :2007/02/21(水) 22:29:37
>>169 ありがとうございます
IMAGE_SECTION_HEADERから得られた情報でいけそうです
IMAGE_SECTION_HEADER::Nameによると名前にtextが含まれるセクションが2つありました (.textbssと.text
startに.textbssのIMAGE_SECTION_HEADER::VirtualAddress+base
endに.textのIMAGE_SECTION_HEADER::VirtualAddress+IMAGE_SECTION_HEADER::.Misc.VirtualSize+base
としたところ列挙された関数をすべて含むことが確認できました
関数列挙にはSymNextを使いました
しかしSizeOfCodeは信用ならんとして関数が配置されてるアドレス範囲をしらべるには
IMAGE_SECTION_HEADER::Nameに"text"が含まれるかどうかみたいな判定をしてごにょごにょみたいな方法しかないのかな。。。
printf風にデバッガに出力するコードを考えたんだが これだと小数を出力できない。。。 小数もOKにしたいのだけどどうしたらいいですか? void DebugPrintf(LPSTR lpszFormat, ...) { LPSTR *lplpParam; static char szTextBuff[128]; lplpParam = ((LPSTR *)&lpszFormat) + 1; wvsprintf(szTextBuff, lpszFormat, (LPSTR)lplpParam); OutputDebugString(szTextBuff); }
APIのは対応してないと明示されてるので、諦めてCRTのvswprintfを使う。
>>171 っ stdarg.h
っ va_start
っ va_end
すでにAPI関係ないな
>>172 vsprintfにするだけでよかったのか
アリガトン
switch文で
%fの場合、
%sの場合、
とかめんどいことして対処してたorz
ウィンドウをTOPMOSTに変更し、サイズをデスクトップと同じにするとフルスクリーンの表示ができます ですがフルスクリーンに切り替わった時、タスクバーの表示が消えるのが一拍遅れます 実際メディアプレイヤーなんかだとフルスクリーンは瞬時に切り替わりますし、ちょっと気になります APIの呼び出し順とかに問題があるんでしょうか 切替は同一関数内で以下のような呼び出しで行っています CRect rect; GetDesktopWindow()->GetWindowRect(rect); SetWindowLong(m_hWnd, GWL_STYLE, WS_POPUP|WS_VISIBLE); SetWindowPos(&CWnd::wndTop, 0, 0, rect.Width(), rect.Height(), SWP_SHOWWINDOW); ちなみにソースはMFCです
メディアプレイヤーのフルスクリーンは DirectX のフルスクリーンモードではないかと…
DirectXの切替だと結構もっさりするんですよね デスクトップの解像度と同じで切り替えたとしてももっさり 調べてるわけじゃないけどメディアは瞬時に切り替えてるからDirectXじゃないんじゃないかな
いや、Media Playerは少なくともDirectShowを使っている。
論点が滅茶苦茶だな。 ハードウエアの解像度変更と、ソフトウエアでのスケーリングを混同するな。
>>178 は「モニターの解像度切り替えと似てもっさりしてる」と言ってるだけで
同列に扱ってるわけじゃないと思うんだけど、違うのかな
>>181 デスクトップの解像度でD3Dフルスクリ-ン と
コンテンツの解像度でD3Dフルスクリ-ン とでは微妙に違う。
>>179 あぁすまん、DirectShowは使ってると思う。
>>178 はDirectGraphicsのCreateDevice()のフルスクリーン切替は使ってないんじゃない?
と言いたかった
>>180 誰あてのレス?
>>181 そう、その通り
>>182 IDirect3DDevice9::CreateDevice()を使った切替ではデスクトップ/コンテンツの解像度に
よる違いって殆ど感じられなかったけど。(両方もっさり)
184 :
182 :2007/02/22(木) 14:36:50
>>183 そっか。
profile 取って、どこが遅いか見たほうが良いかもしれないし、
>>176 コードをベースに悪あがきするのも良い
185 :
178 :2007/02/22(木) 14:42:01
ちょっと勘違い、再確認したら
IDirect3DDevice9::CreateDevice()でのフルスクリーン切り替えはもっさりしてない
というか一瞬ブラックアウトして、描画が復帰するまで一呼吸いるだけ
>>176 で単にTOPMOSTにするだけならブラックアウトしないってだけだった
メディアプレイヤーもフルスクリーン切替時に背景ブラックだしDirectGraphicsでフルにしてんのかな
画面いっぱいに窓広げているだけだろ。アフォか?
187 :
デフォルトの名無しさん :2007/02/22(木) 16:52:55
なら
>>176 に回答してみろ、できなきゃオマエが真性アフォ
馬鹿バッカー
SetWindowPosの使い方が間違っている。HWND_TOPMOSTを指定しろ。というか全画面はこれが常識。 APIリファレンスも見ない馬鹿しかいないのか?
>>177 が無知なくせに頓珍漢なことを言うから変な流れになるんだよ。
僕ハッカー
192 :
176 :2007/02/22(木) 18:37:49
>>189 うぉぅっ、CWnd::wndTopMostを指定してるもんだとばかり思ってた
これは恥かしい、ありがとう解決した
挙動も意図したものになったよ
ウィンドウが全画面になった後、タスクバーがあった場所に 自分の描画をするのがもっさりしてるんじゃね?
194 :
デフォルトの名無しさん :2007/02/22(木) 19:20:10
インターネット回線や電話回線が 使える状態かどうかわかるAPIを教えてください
195 :
67 :2007/02/22(木) 19:40:43
#シカトされたので再送 サービスの ServiceMain コールバック関数に、 ユーザー定義データを渡せないのは痛いね。 オブジェクト指向化しにくいね。みんなどうやってる?
質問です。 なぜ、構造体に、それ自身のサイズを代入しないといけないのですか? xxxinst.dwSize = sizeof(xxx); みたいにするなら、必要ないと思うのですが…
>>196 過去との互換性のため。
例えば、Rev1のときはサイズが100バイトだったのが、Rev2では120バイトになったりしたら、サイズがあれば便利。
>>196 >>197 さんが言うように、
それで、構造体のバージョンを判別することもある。
DEVMODE,OSVERSIONINFOとかね
>>194 InternetAttemptConnect関数かな?
>>197 >>198 なるほど。んじゃあ、これってプログラマのためにある変数なんですか。
OSがメモリ確保するときに必要なわけじゃないんですね。
>>200 OS側で、どこまでのメンバをコピーすべきかの有効判別の意味が大きいかもにゃん。
>>196 例えば、OS側にお菓子レコードがあって、以下のデータがある場合・・・
|せ き は ら さ ゆ き 00|00 9E|00 50|00 3C|00 52|
SDK側のヘッダファイルは以下のように定義すれば楽珍なわけで。
typedef struct t_prf{
WORD cSize;
char Name[];
#if(WINVER >= 0x0400)
WORD Height;
#if (WINVER >= 0x0500) || (_WIN32_WINNT >= 0x0400)
WORD Bust;
WORD Waist;
WORD Hip;
#endif
#endif
}PRF;
>>203 ちょwwww
志村!
志村!
char Name[8];
205 :
67 :2007/02/22(木) 20:30:26
>>205 まず、どこがどう分からないかを具体的に記しなさい。
サービスのインスタンスは1プログラム中に10も20もあったりしないと思うのだが。
サービス関係のAPIを一通り目を通せば、目的の物が見つかるはず。 読んでないから、わからないんだろ。 あと今でも使われている古きテクニックとしてはマシン語生成ってのもある。
svchost.exeみたいに、同一プロセスに複数のサービスがあるのならまだしも。
210 :
67 :2007/02/22(木) 21:54:48
> サービスのインスタンスは1プログラム中に10も20もあったりしないと思うのだが。 いや、あるんですけど。
意味がわからんのだけど ServiceMain内でインスタンス生成すればいいんじゃないの?
知識がないわけじゃないのに工夫ができない子はいらない子
何ができなくて困ってるのかよく解らん。 ユーザ定義データを渡せると仮定して、渡せないときに比べて何ができるようになる?
マウスの動作を拡張するソフトって、どうやってるんですか? 自分で登録したクラスなら、メッセージ取れるけど、 ほかのウィンドウクラスに送信されたメッセージって メッセージキュー以前の段階でとらないといけいないですよね。 ヒントだけでもください。
Hook
216 :
デフォルトの名無しさん :2007/02/23(金) 00:18:28
>>214 SetWindowsHookEx
使うとか
どうも。
「オーナー描画ボタン」を少し改造しています。
http://wisdom.sakura.ne.jp/system/winapi/win32/win61.html 大雑把にですが
>>219 のようなにしています。
処理 1の部分は実行されず、処理 2の部分だけが実行されます。
SubBtnProcのWM_DRAWITEM:の部分を消しても結果は同じです。
処理 1も処理 2も実行されると思っていたのですが、何故でしょう?
自分の理解はSetWindowLongでSubBtnProcに飛んで、引数をそのままDefBtnProcに
代入されている WndProcに飛ぶのだと思っていました。
どこを勘違いしているのかわかりませんので、どなたかご指摘をお願いします。
LRESULT CALLBACK SubBtnProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) { switch (msg) { case WM_DRAWITEM: 〜何かの処理 1〜 return TRUE; } return CallWindowProc(DefBtnProc , hwnd , msg , wp , lp); } LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) { switch (msg) { case WM_CREATE: hBT = CreateWindow( TEXT("BUTTON") , TEXT("") , WS_CHILD | WS_VISIBLE | BS_OWNERDRAW , 0 , 0 , 400 , 100 , hwnd , (HMENU)1 , ((LPCREATESTRUCT)(lp))->hInstance , NULL); DefBtnProc = (WNDPROC)GetWindowLong(hBT, GWL_WNDPROC); SetWindowLong(hBT, GWL_WNDPROC , (LONG)SubBtnProc); return TRUE; case WM_DRAWITEM: 〜何かの処理 2〜 return TRUE; } return DefWindowProc(hwnd , msg , wp , lp);
>>218 WM_DRAWITEMは親ウィンドウに送られてくるものなので、それでOK。
221 :
194 :2007/02/23(金) 10:34:57
>>199 そういう感じのAPIで
繋がってる回線の数等わかるものはないですか?
>>221 WNetEnumResource関数も見たほうがいいかもね
>>222 それは違う関数だと思う。 >>221 WMIにあるかもね
繋がってる回線というのを具体的に定義すればわかるかもよ
繋がってるTCPコネクションの事なのか LAN回線の接続数の事なのか
226 :
デフォルトの名無しさん :2007/02/23(金) 12:06:25
LANではなくて電話回線の数を数えたいのですが WindowsのAPIで可能でしょうか?
227 :
194 :2007/02/23(金) 12:37:30
コンボボックスで今何番目の項目が選択されているか調べたいのですけど どのようにすればいいでしょうか?
>>226 WMIでWin32_POTSModemクラスかな?
231 :
228 :2007/02/23(金) 12:52:48
ShowMessage( SendMessage(In,CB_GETCURSEL,0,0) ); 試しでこんな風に書いてみたのですが、 0しか返ってきません。 書き方は間違ってませんよね?
In、て、なんだ、ハゲ。
ShowMessageって何かと思ったらbc++か
234 :
228 :2007/02/23(金) 15:59:17
環境はC++Builder6 Inはただ適当につけたハンドルです。
で、Inはそのコンボボックスのハンドルなの? いちおー、0は有効値(見つからないと-1)だから ハンドルが違ってる可能性高い
236 :
デフォルトの名無しさん :2007/02/23(金) 16:29:13
EnterCriticalSection した後、 その中で CreateThread しても問題ない?
根拠は?経験上?仕様上?
そもそもクリティカルセクション中にCreateThreadしちゃいけないって 何で思ったの?
なんとなく
クリティカルセクションは他のスレッドへの切り替えを抑止するような役目を果たしてるから、 EnterCriticalSectionの後にスレッド作ってそこでもクリティカルセクションを使った場合に大丈夫かって思ったんじゃないの?
243 :
228 :2007/02/23(金) 18:34:51
項目を変えたりしても、変わらないです。
CB_GETCURSEL以外はうまくいくのか? CB_GETCOUNT とか CB_RESETCONTENT とか
245 :
228 :2007/02/23(金) 18:46:25
void __fastcall 〜〜〜(SealInに項目を追加)
void __fastcall TForm2::Button1Click(TObject *Sender)
{
ShowMessage( SendMessage(SealIn , CB_GETCURSEL , 0 , 0) );
}
てか、ほんとこれくらいのプログラムしか出来てない;;
>>244 試しでその二つや0以外が返ってきそうなものをやってみましたけど、
結果変わらずです
>>245 >SealIn
上の(SealInに項目を追加)が気になる
これってコンボボックスの名前か?
まさかだけど
ShowMessage( SendMessage(SealIn->Handle , CB_GETCURSEL , 0 , 0) );
ってことないよね?
あと、SendMessage()直後にGetLastError()を
248 :
228 :2007/02/23(金) 19:07:48
SealInがコンボボックスの名前です SealIn->Items->Add(text); で、項目を追加してます。 それ以外の処理はまだないです。 GetLastErrorを追加しましたが、エラーコード返ってきませんでした
>>248 ならSealInはハンドルじゃない
ShowMessage( SendMessage(SealIn , CB_GETCURSEL , 0 , 0) );
SealInの部分を SealIn->Handle にする
ShowMessage( SendMessage(SealIn->Handle , CB_GETCURSEL , 0 , 0) );
250 :
228 :2007/02/23(金) 19:11:20
>>249 うまくいきました。
ありがとうございます
TFormってことはVCLも使ってるだろうになんでわざわざそんなめんどくさいことを SealIn->ItemIndexじゃいかんのか
>>251 私も思ったけど、たぶん練習じゃないかなと思った
メッセージってどんな感じ?みたいな
私も昔やったことある
254 :
デフォルトの名無しさん :2007/02/23(金) 23:24:49
必要な場合だけ AllocConsole を使って動的にコンソールを割り当てた。 そんで GetStdHandle で標準入力のハンドルをもらった。 このとき、標準入力に入力があったことを WaitForMultipleObjects で 通知してもらうことってできる? 標準入力とともに他のハンドルのシグナル状態も検出したいのです。
255 :
デフォルトの名無しさん :2007/02/24(土) 00:41:46
シミュレーション作ってるんですが スクロールバーを動かしてる時に 処理が止まらないようにする方法はありますか?
マルチスレッドで描画と計算を分けるのは前提だよな。
>>255 >>256 氏が言っている様に、
シミュレーション側とGUI周り側を切り分けて、
プログラムをマルチスレッド化するべきかもね。
CreateThread関数、
WaitForSingleObject関数、WaitForMultipleObjects関数あたりを見てみ。
260 :
デフォルトの名無しさん :2007/02/24(土) 20:36:30
どなたか助けてください。
Windows アプリケーションを作成していて、
http://home.earthlink.net/~barnold2002/Acgnj/Csig0204.htm ここの方法でコンソールを割り当てて、その上で、
while (1) {
char buf[256];
fgets(buf, 200, stdin);
fputs(buf, stdout);
}
のようなコードを書いたんですが、
コンソールで高速にキーボード入力して Enter を押すと、
入力していない 'T' という文字が、コンソールの行の先頭に表示されるんです。
なぜこんなことになるのでしょうか?
char buf[0x100]; while(1){ fgets(buf,200,stdin); fputs(buf,stdout); }
262 :
デフォルトの名無しさん :2007/02/24(土) 20:57:14
やってみたけど、変わらないですよ。
>>260 ふしぎだね。
四角形になるRFGTでRFGを同時押しすると
Tも押したことになってしまうタイプのキーボードとか。
んなこたーねーか
呪われておる
>>260 必ず’T’なのか?
>コンソールで高速に
知らず押しちゃってるってことない?
uhihigd(ここでEnter) Tuhihigd こんな感じになるってこと?
267 :
デフォルトの名無しさん :2007/02/24(土) 21:48:55
押してないよ。T がよく出るんだけど、さっきやったら ] も出てきた。 z x c v をがちゃがちゃとランダムに押しながら、 ときどき Enter を押すと、20回に1回ぐらいの割合で出てくる。
268 :
デフォルトの名無しさん :2007/02/24(土) 21:50:01
それはそのプログラムだけで発生するわけ?
キーボードってさ、 キーの数だけ配線が二本ずつあるのではなくて 一本は横一行で共有 もう一本は縦一列で共有 同時押しがあると見分けつかないから 昔のキーボードでは良く起きた。
272 :
260 :2007/02/24(土) 21:53:48
VC 2005 + SP1 を使っています。 ウィザードから普通のコンソール アプリケーションを作成して 同じようなプログラムを作成しても、このようなことは起きないんです。 Windows アプリケーションを作成して、動的にコンソールを作成すると このような現象が出てくるんです。 別の人のマシンでも再現したので、私のマシンの問題ではないと思う。 (両方のマシンとも Dell 製だが、機種は違う。)
ソース見てみたい
274 :
260 :2007/02/24(土) 22:19:59
>>273 いや
>>260 に書いたとおりなんですけど。。。
あのサイトのコードを使ってコンソールをセットアップして、
その後で fgets . fputs を繰り返すループを書くだけです。
じゃあWindowsかVCの不具合なのかもな
260を見て思ったんだが、FILE構造体同士の代入ってやっていいのか? freopen("con", "w", stdout);とか (またはconの代わりにCONOUT$など)では駄目か?
278 :
260 :2007/02/24(土) 22:50:59
直った!下記のコードでうまくいった!ありがとう! freopen("con", "r", stdin); freopen("con", "w", stdout); freopen("con", "w", stderr);
質問です gethostnameとgethostbynameを利用してローカルIPは取得できたのですが、 グローバルIPはAPIで取得できるのでしょうか?
[グローバルIP]がブロードバンドルータに付いているものを指すなら、 UPNPでとるとか、実際の通信相手からpeernameを戻してもらうしかない。
>>280 やっぱりAPIで楽はできないですかorz
ご助言ありがとうございました。
XPに限定してもいいならUPnPを操作するAPIがあったはず
⊥ ▲ │
Win32_PingStatusじゃ無理か?
>>270 実際には横一列、縦一列じゃなくてばらばらに設定されてる
1本回路が死んだら横1列、もしくは縦1列全滅だからな
それ防ぐため
らしい
プロテインだね!!
289 :
デフォルトの名無しさん :2007/02/25(日) 10:18:14
VC では open_osfhandle を呼び出すことで OS のファイルハンドルから ファイル記述子に変換することはできますが、 逆に、ファイル記述子から OS のファイルハンドルを取得するには どうしたらよいでしょうか。
_get_osfhandle
291 :
デフォルトの名無しさん :2007/02/25(日) 11:47:14
フォルダやファイルを、どのアプリケーションが開いているか確認する方法はないですか。
Process Explorerにそんな機能があったな。
ProcessExplorerそんな機能ないだろ 単にモジュール列挙じゃない?
Unlockerにはそういう機能がある。
FindメニューのFindHanlde or Dll ってそういうものだと思ていたが。
FileMon じゃねーの?
Handleは?
c:\windows\system32\openfiles.exeは?
OH.EXEは?
301 :
デフォルトの名無しさん :2007/02/25(日) 15:58:29
あれ、WindowsXPなのに、openfiles.exeがない!
302 :
デフォルトの名無しさん :2007/02/25(日) 15:59:12
なんだプロだけかよ…
うんにゃ、サーバにもありんす
regmon.exe どっかにないの?
Process Monitorでレジストリの監視もできるだろ と言いたいところだがLog Bootの機能がなくなってる。 Vistaで起動時のレジストリアクセスを調べるにはどうしたらいいんだ
バイナリデータ(AA00CCDD0Aとか)を文字に変換かけるAPIとかってありますか?
wsprintf
308 :
306 :2007/02/25(日) 21:46:41
wsprintfでできるんだっけ? 補足するとバイナリファイルを16進表記で表示させるプログラムを作りたいんだが。 バイナリで読み込んだものをwsprintfA(..."%X"...);でやるとおかしくなった気がします。 何かの間違いかもしれないからもう一度試してきます。
309 :
306 :2007/02/25(日) 21:49:34
やはりAA00CCDD0Aというバイナリがあったとして wsprintfでやるとAAまでしか取得できません。 0x00に反応してると思われ
>>309 ソースを晒すべし
0x00 は多分関係無い 言語にもよるだろうけど
いや、1byte毎ぐるぐる回しながら、%Xで変換、という話だと思うが
312 :
306 :2007/02/25(日) 21:54:16
>>311 あー、なるほどそういうことか。
試してみます。
>>305 regmon.exe あったぁ〜
MSに買収されてたとは知らんかった
サンクスです
314 :
306 :2007/02/25(日) 23:14:59
できましたが AA0001とかだとA01としかならないです
%02X
317 :
306 :2007/02/25(日) 23:24:15
>>315 それは既に試していて
もう一度やりましたがやっぱりダメでした。
A0000とかなっちゃいます
319 :
306 :2007/02/25(日) 23:30:25
>wsprintf(&PackData.lpPack[i], TEXT("%X"), buff[i]); これが原因。buff[i]はいいけど、lpPack[i]は1ループで2進むことがあるから。
buffへコピーする必要は無いだろ。 せいぜいBYTE* packet = lpPacket;で十分。
>>319 for(i = 0; i < Size; i++)
{
wsprintf(&PackData.lpPack[i], TEXT("%X"), buff[i]);
}
↓
{
int j=0;
for(i = 0; i < Size; i++)
{
j+=wsprintf(&PackData.lpPack[j], TEXT("%X"), buff[i]);
}
}
for(i = 0; i < Size; i++) { wsprintf(&PackData.lpPack[i], TEXT("%X"), buff[i]); } ↓ { int j=0; for(i = 0; i < Size; i++) { j+=wsprintf(&PackData.lpPack[j], TEXT("%02X"), buff[i]); } }
324 :
306 :2007/02/25(日) 23:37:06
for(i = 0; i < Size; i++) { wsprintf(&PackData.lpPack[i], TEXT("%X"), buff[i]); } Sizeはパケットのサイズ buffにはパケットのデータをmemcpyしてます(デバッグ用) 上記の状態でやるとAA00020B00がA02B0になっちまいます
325 :
306 :2007/02/25(日) 23:38:32
>>320 あー、UNICODEベースで組んでるのが原因かなぁ
wsprintf(&PackData.lpPack[i], TEXT("%X"), buff[i]); ↓ wsprintf(&PackData.lpPack[i*2], TEXT("%02X"), buff[i]);
328 :
306 :2007/02/25(日) 23:45:04
>>327 それはむしろi * sizeof(TCHAR)でやるべきかと。
後やはりA02B0になっちまいやすorz
329 :
306 :2007/02/25(日) 23:46:08
多分BYTEが1バイトだからなのかなーと思うんですが
>324 VC++のウォッチ式ならコピーせずともどうにでもできる。 >325 PackData.lpPackの型がTCHARの配列やそれに類するものでなく、 charやunsigned charなどだったらwsprintfAかs(n)printfでも使いなさい。 >327 そこは2文字書き込むから2をかけてあるのであって、 sizeof (TCHAR)では全くお門違い。
331 :
306 :2007/02/25(日) 23:48:45
>>330 あー、そういうことなのか
>>325 についてはリストビューをUNICODE形式にしちまってるから
なんとかならないですかのう。Aに全てやり直すの酷だ・・
320の件は323なり327なりの方法で解決できる。 Unicodeは関係ない。
333 :
306 :2007/02/25(日) 23:58:40
全然違うソースを改変してビルドしてたんでまったく結果が同じという オナニーショーを演じていましたどうもすみません。
334 :
306 :2007/02/25(日) 23:59:17
(´・ω・`)
よく頑張ったお前は神だよ
もっとわかりやすいデータを食わせて何がおきてるのかさぐる、とか そもそも%02Xはどういう意味なのか、くらい調べようぜ
特定のアプリに対して キーボードのBackword/Forwardキーとかの特殊キーで WM_COMMANDが送られるのをブロックしたいのですが、 どうすればいいですか?
キーボードフック
339 :
337 :2007/02/26(月) 21:36:43
>WM_COMMAND すみませんWM_APPCOMMANDでした・・・orz SetWindowsHookExでフックをいろいろやってみましたができません・・・orz 最初、WH_KEYBOARDをやったらWM_KEYDOWNより前に送られてるのでダメ・・・ で、PostでなくSendされてるのでWH_GETMESSAGEではキャッチできず・・・ WH_CALLWNDPROCでは >The hook procedure can examine the message; it cannot modify it. となっていてブロックできず・・・
>>339 フックだけじゃダメだって。
ジャブやアッパーも織り交ぜないと。
LVM_DELETEITEMとかでアイテムを削除した後 アイテムを追加するとInsertItemは追加できるのにSetItemのほうは 追加できなくなりました。原因に心当たりのある方がいたら教えていただきたいのですが。
>>340 フックって意味分かってる?
あんなの出すんだったらジャブとかアッパーだしたら隙が出ちゃうよ?
>>341 SetItemは追加じゃないんだけど、、、まあそれは置いておいて、
SetItemに指定してるアイテム番号が違うのでは?
例えばInsertItemの戻り値がアイテム番号なので、それをSetItemに指定するとか。
CreateWindowで"BUTTON"をBS_OWNERDRAW指定して作った子ウインドウに WM_PAINTでビットマップをコピーして表示することはできました。 このWM_PAINTをWM_LBUTTONDOWNに変えるとビットマップが表示されません。 すみませんが、どうしてなのか教えてください。
>>343 それはないと思うんですが。
まず、LVM_DELTEITEMを送る前まではちゃんとSetItemできてて
LVM_DELTEITEMをSendした後から追加しようとするとできなくなってしまいます
BeginPaint/EndPaintはWM_PAINTの中でしか使えない。 またそれを解決しても、後のWM_PAINTで上書きされるということが起きそう。
>>344 BeginPaint の PAINTSTRUCT を見てみて
>>344 よくわかんないけど、WM_DRAWITEMを使うのは?
349 :
341 :2007/02/26(月) 22:37:51
解決しました。
後々の為に方法を書いておくんだ
352 :
341 :2007/02/26(月) 23:16:12
>>350 単純に消去した時のカウントがそのままでというか
項目数取得使っとけば良かったのに何で俺staticな変数で
インクリメントしてたんだろう・・・。
という話です
353 :
341 :2007/02/26(月) 23:41:12
ふとした疑問。 ListView_GetItemCountで取得した項目数をそのまま ListView_InsertItemを使って追加していった場合、 果たしてそれは正しいやり方なんだろうか・・・・。
>>339 フックでメッセージを消したいときは、メッセージをWM_NULLに
書き換えればいいんだよ。
>>353 意味が分からんが、ちょっと興味ある。
詳しく
テンプレのWIn32API入門の第11章の終了処理のプログラムを実行すると Proglam still running ? というエラーがでてビルドできません これはどういうエラーなんでしょう? 環境はWin98でBorlandの5.5です
357 :
339 :2007/02/27(火) 00:43:42
>>354 メッセージの変更は
WH_GETMESSAGEではできるみたいですが
WH_CALLWNDPROCではできないようです。
WH_GETMESSAGEではキャッチできませんでした・・・orz
>>356 コンパイル結果のと同じ名前のEXEが現在実行中。
>>356 ビルドの対象のプログラムがまだ実行中
win32apiの関数で画像の加算合成をするにはどうしたらいいですか?
gl何とか
>>360 DIBにすればピクセル単位で普通にCPUで読み書きできる。
自作ルーチンで演算 これがほんとの自作自演ナンチャッテ
【審議中】 ∧,,∧ ∧,,∧ ∧ (´・ω・) (・ω・`) ∧∧ ( ´・ω) U) ( つと ノ(ω・` ) | U ( ´・) (・` ) と ノ u-u (l ) ( ノu-u `u-u'. `u-u'
( ´д)……(´д`)……(д` )
そのまましばらくお待ちください
__ __ __
|よし| ΛΛ |よし| ΛΛ |よし| ΛΛ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
〃 ̄∩ ゚Д゚) 〃 ̄∩ ゚Д゚) 〃 ̄∩ ゚Д゚) <
>>364 全員一致で逝ってよし!
ヾ. ) ヾ. ) ヾ. ) \_____________
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
\ \
| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |
| 逝ってよし認定委員会 |
| |
\| |
370 :
デフォルトの名無しさん :2007/02/27(火) 13:40:46
ウィンドウクラスとウィンドウスタイル定数が全部載ってるサイト教えれ
マイクロソフトのサイト
BCCなんですが、GDI+のライブラリがないとjpgって表示できないんですか?
>>373 jpg解凍ルーチンを自分で書けばいいと思うよ
他の板ならともかく、ここで「解凍」って見るとすごくバカっぽいな。
>>374 だめなのか。。。('A`)メンドクセ
dクス
ライブラリ無いとどんな画像形式でも表示なんか無理だと思うんだが…
GDI+じゃなくても、OleLoadPictureあたり使えばイインジャネ?
IEコンポにやらせるとか。
>>373 自分でこっそり使うツール程度で単に表示させたいだけなら、
Susieプラグインでも使えばいいんじゃない。
BMP(DIB)さえ扱えるなら、.spiは結局DLLなので
静的ロードしてやれば自分で書くコードはほとんど無くて済むだろうし。
# 昔読んだプラグイン仕様の記憶から書いてるのでどっか間違ってるかも。
一例としてSusieプラグインを挙げたけど、
JPEGならフリーのライブラリがいくらでもあると思う。
# 思いついた確実に存在するJPEG読み込みのDLLがSusieプラグインだったので。
もし商用利用する場合はライブラリのライセンスを要確認のうえで。
むしろlibjpeg
UpdateLayerdWindowでblend.SourceConstantAlphaに255をセットした場合は成功して表示されるんですが、それ以下の数字を入れた場合Functionがエラーとなりエラーコードが87=パラメータが違います。となってしまいます。 Functionを呼ぶ前のスタイルとか何かに問題があるんでしょうか?
>>382 スレ違い...と言いたいが、
GDI+スレはないんかいw
Platform/Windows SDKにヘッダとライブラリがあるんだし、扱うとしたらここだろ。 その違いが把握できるなら.NET系のスレもありだとは思うが。
何ですれ違いなん?普通にUser32.dll のAPIじゃなかと?
gdiplus.dllだろ
GDI+スレとか無いからここでいいんじゃね? APIじゃないけど
>>373 jpg表示したいだけなら、OleLoadPictureでいいんじゃね?
前処理が面倒だが、jpgだけじゃなくBMP/GIF他も一緒に扱えるし。
やべー jpg なんて libjpeg 一択と思ってた png に libpng 使ってるんですが、これもひょっとしてメジャーじゃなかったり?
>>382 255 = 0xFF = 0b11111111で 、
実際はblend.SourceConstantAlphaをリングシフトして、
OS(ドライバ?)は最下位ビットをAND判定してるとか?
nパーセントの透過率 = ((0xFF * n) / 100)
>>382 ::GetDeviceCaps(hDC, SHADEBLENDCAPS)の結果は?
393 :
389 :2007/02/28(水) 00:13:00
>>390 表示だけでなく、生成や変換もやる場合は、libXXXでいいんじゃね?
Susieプラグインとかよりライセンス条件緩そうだし。
WindowsのAPI/DLLだけで済むならそのほうがいいと思うんでOleLoadPicture
を勧めた訳だが。
子プロセスの出力をパイプで受け取り、それをistreamで読み出すには どうしたら良いのでしょうか? スレ違いなら誘導お願いします。
パイプで受け取る方法はググればサンプルが見つかる。 istreamがC++のやつのことなら、Boost.Iostreamsを使うのが楽。
396 :
394 :2007/02/28(水) 08:18:45
>>395 ありがとうございます。おっしゃる通りistreamはC++のやつのことです。
これからググって調べてみる事にします。
397 :
デフォルトの名無しさん :2007/02/28(水) 14:18:14
他のアプリが呼び出した DeviceIoControl() の内容を横取り(もしくは覗き見)する方法はあるでしょうか?
アル
ラッパDLLは無理くさいからIAT書き換えればいいんじゃないのかな。 Advanced Windowsに物凄い詳しく書いてあるよ。
400 :
デフォルトの名無しさん :2007/03/01(木) 07:37:23
新規質問お願いします。 デバイスコンテキストに文字を書くAPIを探しています。 「A」と書いたときには「∀」と文字を上下反転させる事ができるAPIはないでしょうか? TextOut、DrawTextにはしてい方法が見つかりませんでした。 APIの組み合わせでもフォント設定でもいいので知っていたらお願いします。 後、文字の背景は透過しているので、「TextOut」→「StretchBlt」で張り付けた絵を反転するのは無しでお願いします
>>400 単純に回転ならCreateFont関数でnEscapementで角度指定だっけな?
垂直、水平はしらん
CreateFont
403 :
402 :2007/03/01(木) 08:16:36
かぶったすまん
>>400 g.TranslateTransformで反転表示させることも出来るよ(・∀・)イイ!!
そのほうが多分効率いいと思う。
画像のビューワみたいなものが作りたいのですが、サムネイルを表示する部分は そのようなコントロールがあるのでしょうか。それともウィンドウに直接(?)書いて マウスの座標などでクリックされた画像を判定したりしているのでしょうか。 開発環境は Visual C++ 2005 Express Edition です。
>>405 IExtractImageインターフェイスだっけな?
リストビューでよくね?
408 :
405 :2007/03/02(金) 08:41:49
>>406 ありがとうございます。
調べてみたのですが、サムネイルを生成するのに非常に便利そうで助かります。
この取得した画像を表示するコントロールなどがあるものかと悩んでいました。
>>407 リストビューの大きいアイコン表示を使うということでしょうか。
それとも(あまり詳しくはないですが)オーナードローというもので、描画する
のでしょうか。とりあえず試してみたいと思います。
ありがとうございました。
>>408 正しいかどうかは分からないが、俺はリストビューの大きいアイコンで画像サムネイルビューアを作ったことがある。
後は つ[イメージリスト]
お気に入りとか、履歴とかのシステム標準(?)のアイコンを取得する汎用的な やり方はありますか? 今はExtractIconEx()でshell32.dllからインデックス直値で取ってますが... OSが変わるたびに変えないといけないし('A`)
あ、SHGetSpecialFolderLocation()→SHGetFileInfo() でいけそうですが 他に簡単な方法があれば。
画像編集ソフトなどのアンチエイリアスをかけたペンをつくるため Ellipseの範囲内を(線も)1ピクセルずつ操作したいのですが、 何か良い方法はありませんか?
具体的にどのレベルの話をしてるんだい? 「DIBでやるのが普通」って答えを求めてるのか、 それとも「普通にやったんじゃ遅いから高速化する 方策はないか」てな話なのか。
>>413 一応読み込んだピクセルビットにXY軸指定すれば
ピクセルを修正できる関数は作ったんですよ。
それをSetDIBitsToDeviceで表示するという感じで。
だからリージョンかラスタオペレーションか何かで
いじればできないかな・・・って
>>414 1.グラデーション分のペン作成(単色のペンで)
2.ペンのストロークをサンプリング
3.2のストロークに対し、1のペン描画を反映。グラデーション分のビットマップを作成。
4.グラデーション別に平均化処理し、ORる
だめか?
サウンド音量固定の件で質問した者ですが、 おかげ様でできました! でAPIの質問ではないのですが、 いきがかり上聞かせて頂きます。 まずければ他へ行きます。 ボリューム再設定アプリを実行するタイミングとして 1. Windows起動音が鳴るより前 2. Windows終了音が鳴る前 としたいのですが、うまくできません。 (ボリュームが上がっててビックリする事が多いので(^^;) スタートアップに登録したら1の場合、 いつも鳴ってる途中で実行されます。 2の場合やりかたがわかりません。 Windows XP HOMEなのですが・・・
エクスプローラやIEのアドレスバーの様にReBarにコンボボックス、ボタンを順に配置したいです。 ツールバーにコンボボックス(セパレータの上に配置)を入れてをバンドに入れる方法を見つけたのですが、 このコンボボックスはリサイズできないのでしょうか? 厳密には、セパレータの幅変更になりますけど。 また、目的のアドレスバーをスパイしてみると、ひとつのバンドにコンボボックスとツールバーを入れているようでした。 それを行うメッセージなりAPIがあるんでしょうか。
1つのバンドは1つのウィンドウしか占有できないから、 適当な子ウィンドウをバンドに置いて、その子としてコンボボックスなりツールバーなり置けばいい。
>>416 うちのPC音でないから起動音のタイミングはわからないけど
サービスにすればスタートアップよりはやい
2は一番安直なのが常駐させてWindows終了時のメッセージ(忘れた
を捕捉する方法かな
サービスにしても常駐になるし
vectorとかに行けば終了時の処理を登録できるものぐらいあると思うからそれ使うのも楽かもね
>>416 1・HKLM\Software\Microsoft\Windows\CurrentVersion\Runはどうだい
2・Windowsはシャットダウンする手前に全トップレベルウィンドウに対して
WM_QUERYENDSESSIONを投げるからそれを受け取って処理してみたらどうだい。
ちなみにWM_QUERYENDSESSIONに対してTRUEを返せばシャットダウンを許容、
FALSEを返せばシャットダウンを禁止(シャットダウン自体が中止される)する。
一つでもウィンドウがFALSEを返せばシャットダウンは中断される。
終了時に保存等の処理をしたいならWM_QUERYENDSESSIONよりも、 WM_ENDSESSIONだと思うけど。
423 :
デフォルトの名無しさん :2007/03/03(土) 18:26:48
WNDCLASSとWNDCLASSEX CreateWindowとCreateWidnowEx どこがどう違うのか教えてください。
指定できるのが増えてる
425 :
デフォルトの名無しさん :2007/03/03(土) 19:19:06
なるほど、だからExですか。なんつってww
>>423 WNDCLASSEXの方はcbSize,hIconSmメンバが追加されている。
cbSizeが追加されたことにより、
構造体の拡張も視野に入っているかもね。
>>196-198 ,200-204を参照
あと、hIconSmはスモールアイコンを指す。
メンバはWNDCLASS構造体に重複部分があるから、
RegisterClass関数は内部で、RegisterClassEx関数を呼んでいるかも。
427 :
デフォルトの名無しさん :2007/03/03(土) 20:05:30
GetWriteWatch って、SDK に Windows NT/2000:対応していません って書いてありますが、本当は使えるんですか?
情報ありがとう。そうか、対応していないんだね。残念だなー。
∧∧ ヽ(・ω・)/ ズコー \(.\ ノ 、ハ,,、  ̄  ̄
>>422 WM_ENDSESSIONだとタイムアウトで強制的に打ち切られるから
保存しようとしているデータの性質によっては怖くて使えない
質問です。XP、VS2005 で Win32 アプリを作成しています。 ピクチャコントロールにスクロールバーをつけたのですが、うまく動作しません。 LONG_PTR style; style = GetWindowLongPtr(hWnd, GWL_STYLE); SetWindowLongPtr(hWnd, GWL_STYLE, style | WS_VSCROLL | WS_HSCROLL); SCROLLINFO info; info.cbSize = sizeof(LPSCROLLINFO); info.fMask = SIF_RANGE | SIF_PAGE; info.nMin = 0; info.nMax = 9; info.nPage = 3; SetScrollInfo(hWnd, SB_HORZ, &info, TRUE); hWnd はピクチャコントロールのハンドルです。 SetScrollInfo は正常に動作し、期待通りのスクロールバーが表示されるのですが、それだけで、 まるで無効になっているかのようにマウスでつかむこともできず、WM_VSCROLL も WM_HSCROLL も来ません。 (Spy++ でも確認しました。) 原因が全くつかめません、何か手がかりはないでしょうか…。
>>432 ピクチャコントロールの親でメッセージ受けようとしてないか?
>>432 誤:info.cbSize = sizeof(LPSCROLLINFO);
正:info.cbSize = sizeof(SCROLLINFO);
>SetScrollInfo は正常に動作
エラー返してないかい?
435 :
デフォルトの名無しさん :2007/03/03(土) 23:02:12
XPって C:\Documents and Settings\"ユーザ名" のフォルダ選択して、 右クリック → 共有とセキュリティ → 共有(タブ) で表示させたウインドウで、 □このフォルダをプライベートにする のON/OFFができますよね? このON/OFF操作で行われる処理をコマンドラインで 自動的にやる方法知りませんか?(例えばWIM32APIとか) cacls.exe だとできないみたいだし、 いろいろ他の方法当たったけど、見つからんです。。
>>434 >LPSCROLLINFO
うわぁぁぁぁ
エラー返してましたorz ありがとうございます!
>>435 SetNamedSecurityInfo()
WindowsMobile向けの関数一覧って無いですかね。使えるのと使えないのとあってよくわからんです。
Windowsサービスを登録するAPIってないですか
CreateService
Win64って特に意識しなくてもアドレス幅が64bitになるの? intとかvoidとか64bitで、mallocで4GB以上の連続した 領域が確保されるの? 単なる興味本位な質問ですが、良かったら教えて。
Win64はLLP64
互換性を考えて int は 32bit だったはず
Win32 longlong→64bit、long→32bit、int→32bit だったのが Win64 long→64bit、int→32bit になったんじゃなかったっけ? longlongはどうなったか覚えてないけど
>442-444 ありがとう LLP64でググったらよく分かった 64bit環境でも色々有るんだねUNIX系とクロス開発は大変そう 俺は関係ないけど。
どうして適当なこと言う奴が後を絶たないのか
.NETとかjavaみたいに分厚いフレームワークじゃないからなぁ うっとうしいっちゃ鬱陶しいな
>>446 MISRA-C,SECとか見てるけど、
移植性ねーっていうけど、C言語自体はそれほど閉鎖的じゃない。
視野が狭いPGが多いだけであって・・・
446のようなバカが多くて困る。
451 :
446 :2007/03/04(日) 21:50:43
そろそろカチンときそうです。
まったくだ。 色んな環境を熟知していて 頭のいいやつが細かいことにも様々な工夫を凝らせば C言語は移植性が高いんだよ。
ifdefとtypedefの嵐で万事解決です
ifndefってなんて読むの? イフンデフ?
タスクマネージャに表示されるような個々のプロセスのCPU使用率や メモリ使用量を取得したいが、そんな関数あります?
はい
>449 C言語はそれほど閉鎖的じゃないけど プログラマーはかなり閉鎖的だね
ありがと。Pdh系API使ってやります。
というかあらゆる処理系依存に精通していて 常に気を使うなんてやってられないだろ。 ガンガンに処理系やWin32APIに依存しちゃえよ。
460 :
デフォルトの名無しさん :2007/03/05(月) 00:23:19
HANDLEにクラスとかのポインタを結び付けれるAPIはありますか? HWNDに対してのSetPropみたいなAPIを探してます
>>460 ハッシュテーブルにもっとけばいいだろ。
そんなのAPIに頼ることか?
>>461 HWNDに対してのSetPropの存在意義を256文字以内で説明せよ
>>461 SetProp の存在意義を否定してないか?w
いずれにしても残念ながらHANDLEに対するSetPropのようなものは存在しない。 自前で連想配列でも持っておくしかない。 第一HANDLEと言ってもカーネルハンドルからそうでないものまでいろいろあるし。
多分無い どうせハンドルの類の整数値は一意なんだから適当に mapみたいなデータ構造作っちゃえばいい
>>460 ちょっと調べただけなのだがSetTokenInformationがそれっぽい引数の取り方をしてなくもないとおもわれ
SetThreadTokenも要チェックや!!
ウィンドウのサイズが変更されたとき、決まった縦横比で固定されるようにするには どうすればよいでしょうか?
計算する
470 :
468 :2007/03/05(月) 03:28:21
>>469 もちろんそうなんですが、WM_SIZEで変更後のサイズを受け取り、それを基に
SetWindowPosで設定すると、その設定によって再びWM_SIZEが呼び出され続けて
どんどん小さくなる、といった現象が起こります・・・。
WM_POSCHANGING
>>470 想像して笑ってしまった。面白いことをやってるな
そもそも同じ比率になったのにルーチン呼び続けてる仕様が間違ってるんじゃ枚か
萌えるウィンドウだな
恥ずかしくて段々小さくなるウィンドウ
>>470 そっからは自分で頑張れ。
これを自力で解決できんようなら、プログラミングなんて他人にやらせとけ。
>>470 クライアント領域のサイズとウィンドウサイズ混同してないか?
あと計算はWM_GETMINMAXINFOとかWM_SIZINGでやれ
479 :
468 :2007/03/05(月) 11:23:46
できました! ありがとうございました!
そういう微笑ましいバグってなんだか面白い。
タスクバー上で動く時計を作っていたのですが、 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でウィンドウを画面外に作成した時 などにちゃんとタスクバー上で動作しないのですがなぜでしょうか?
最小化したり画面の外へ追いやったりしたら、 ウィンドウの中を描画する必要が無いからWM_PAINTは呼ばれない。
>>482 即レスありがとうございます!><
てっきり描画の必要が無くても自分でInvalidateRectで送れば呼ばれるのかと思ってましたorz
484 :
デフォルトの名無しさん :2007/03/05(月) 17:15:10
拡張スタイルの WS_EX_LEFTSCROLLBAR についての質問です 同スタイルが動作する環境かを知りたいのです。MSDNで同スタイルは 「ヘブライ語やアラビア語などの読みの方向をサポートしている言語をシェル言語としているシステムで有効です。他の言語では、このスタイルは無視されます。」 と書かれていました 私の環境では同スタイルを定義すると動作するので GetSystemMetrics関数でSM_MIDEASTENABLEDの引数を指定し戻り値がTRUEになると思っていたのですがFALSEでした このことからヘブライ語やアラビア語をサポートしているシステムかどうかが取得出来ないので動作する環境かが判断出来ません 又、「他の言語では、このスタイルは無視されます」と書かれているので 動作不可環境では拡張スタイルに定義されていても動作しないようになっているのでしょうか それとも拡張スタイルから同スタイルが削除されるのでしょうか 後者ならば拡張スタイルの同スタイルの有無を確認したらいいだけなのでサポート云々の話ではなくて簡単なのですが 私の環境では同スタイルが動作しているので確認も取れません 誰か詳しい方宜しくお願いします
メモ帳で、 ユダヤに対する冒涜かアラーに対する冒涜を記述して、 OSが再起動したら対応している。
486 :
デフォルトの名無しさん :2007/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
>>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 :2007/03/05(月) 19:53:36
>>487 4800くらいで失敗してしまいます。
ちなみに、アイコンを一個取り出すから
最後の引数に1と書いていたのですが、
0にしてみても普通にアイコンハンドルが取得できました。
ここを0とするとどうなるのでしょうか?
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
ExtractIconEx の宣言と DestroyIcon の宣言はどーなってるん? # DestroyIconの引数が byRef になってて、iconハンドルへのポインタ渡してるんじゃねーの?
それなら最初のDestoyIconでエラーになるんじゃね?
シングルスレッドのGUIアプリでGetOpenFileName()を呼び出したところ、 ダイアログの処理用と思われるスレッドが幾つか生成されました。 OpenFileのダイアログを閉じてメインウィンドウに戻ったあと、 メインウィンドウの×を押してWM_DESTROYを発生させ、 WindowProcのWM_DESTROYでPostQuitMessage(0)を呼びました。 メッセージループは正常に終了し、 自動的にExitThreadが呼ばれてスレッドが終了したところまではデバッガで確認できました。 しかし、ダイアログの処理用と思われるスレッドが残っています。 残ってしまう原因にお心当たりある方はいらっしゃいませんか。
493 :
486 :2007/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で書いてみたら問題なく動いているのでマシンのせいではなさそうです。
>>492 複数回GetOpenFileNameを呼ぶと、
同じスレッドで処理されているのかな?
流用利用って事で
(前回開いたパス情報等の保持として・・)
・・・内部でCOMを呼んでたりして。
>>492 たぶん正常な動作 ms謹製のnotepadでもスレッドが残る
>>494-496 ありがとうございました。
素敵すぎる仕様のようで、諦めて従います・・・・・・
498 :
494 :2007/03/05(月) 22:10:03
今、メモ帳アタッチしてみたけど、 スレッドは流用してないみたいだなぁ。
>>493 >ByRef phiconLarge As Long, _
なのに
>lngRet = ExtractIconEx(App.Path & "\test.ico", 0, 0, lngIconHandle(0), 1)
と呼び出してるが、
(BASIC? の仕様次第だけど)リテラルに対する参照渡しはどうなんだろ?
→参照されてる
→一時オブジェクトを作り値代入し、その一時オブジェクトへのポインタを渡す
という動作なら、ラージicon のハンドルが漏れてる
>>486 失敗したとき、GetLastError()の値は?
501 :
500 :2007/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 :2007/03/05(月) 22:54:42
>>501 VBにはヌルポ用に vbNull っつーのが存在してる記憶があるが、
そいつの呼び出し側が ByRef 用なのかどうか記憶あいまい。
As Any で 呼び出し時に byval 0 のような明示記法は初見
# っつーても俺は VB 素人に近いのでわからにゃいw
>>495 APIの質問ではなくスレ違いで申し訳ないんですが、お教えください。
残っているスレッドをどのようにして知ることができるのでしょうか?
現在、以下のようなトラブルで悩んでおります。
発生条件がまだ絞り込めてないのですが、Vistaでexplorerからディレクトリを削除するときに
「他のプロセスで使用中のため削除できません」(みたいな意味の)エラーで削除できない場合が
あります。そのディレクトリは自分のプログラムでOpenFileDialogでファイルを開いたディレクトリ
なのですが、タスクマネージャのプロセスタブで見る限りプログラムは終了しています。
スレッドだけが(問題のディレクトリをカレントにして)いつまでも残っているなんてことがあるのか
疑問なんですが、残っているスレッドが確認できればこれが確認できるかと。
よろしくお願いいたします。
>>499 の心配は
>>489 で払拭されてると思われ
>>501 As AnyだとRefかValかを関数引渡し時にByValを指定すればポインタか値かを決められる。ByVal 0& でヌルポインタとなるはず
>>503 API的な回答じゃなくていいのならProcessExplorerでさっくり見れる
>スレッド
vistaは判らないけど、それ以前のOSのことを考えれば
スレッドは所詮プロセスの枠の中の存在だから独立することはない
506 :
500 :2007/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 :2007/03/05(月) 23:14:36
>>505 ありがとうございます。
>スレッドは所詮プロセスの枠の中の存在だから独立することはない
のはずですよね・・・・・・・
>>503 OpenFileDialogでファイル名を取ってきたあと、
何もしない場合でもその症状?
それとも、特定の処理(ファイル読み込みなど)後で、
その症状?
切り離して考えてみ?
510 :
486 :2007/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)
でもうまく動きました。
どうもありがとうございました。
512 :
503 :2007/03/05(月) 23:37:33
すみません、HANDLEと64bit OSの関係で質問させてください。 HANDLEでCreateEvent()の返戻値を格納しているソースを見ていたのですが、関数の受け渡しの途中でHANDLE32に型が変わっていることに気付きました。 これ、Vista 64bit環境でも無事に動くんでしょうか? ・Vista 64bitでHANDLE32とHANDLEのサイズは同じかどうか ・64bit環境ではHANDLE→HANDLE32への受け渡しは32bitぶん消えてしまう? という点、どなたかご存じないでしょうか?実際には動いているっぽいのですが、いまいち確証がないのです。 (XPとVistaの64bit環境で同じかどうかも不明です・・・)
32bitアプリとして動かすならたぶん問題ない WoWとかいうのが全部面倒みてくれる
>>515 ありがとうございます。WoWでうまくエミュレートしてくれるんですね。
逆に言うと、64bitアプリ(見ていたのはdllでした)として動いているのであれば、問題が発生しそうだといえますね。
上のほうにMFCを利用したフルスクリーン描画方法がありますが、MFCは使わず、 Win32apiだけでフルスクリーン(クライアント領域をディスプレイ全体にする?)には どうすればよいでしょうか?
>>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 :2007/03/06(火) 05:20:38
>>518 うおー!
ありがとうございます!
GetDesktopWindow() が肝ですね!
個人的には、MonitorFromWindow->GetMonitorInfoを推奨したい。
>>520 だね。メインディスプレイでしかフルスクリーンにできないアプリって嫌い。
2台もモニター買う金も置くスペースもねーんだよバーカバーカ
モニタ4台でマルモニしてますが何か?
>>522 高望みしなけりゃどうにかなるもんだぞ。
マルチモニターとか利点がわからない
>>525 フルスクリーンアプリケーションのデバグには良いと思うけど、私には使い道がない。
片側にアップスキャンコンバーターとビデオ繋いでテレビ見ながらいろいろ出来る
>>525-526 作業机の面積が広いに越したことはないだろ?
マルチディスプレイもそんな感じ。
マルチディスプレイは便利になるっていうよりは快適になるって感じ。
>>492 初期化時にCoInitialize()、終了時にCoUninitialize() 呼んでみたらどうかな?
どうもGetOpenFileName()がCOMを使っているらしいぞ。
530 :
デフォルトの名無しさん :2007/03/06(火) 13:08:26
529 場所誤ると、ハングらないか?
531 :
517 :2007/03/06(火) 13:57:10
フルスクリーンにする前のウィンドウの位置と大きさを控えておき、フルスクリーンからその
サイズにSetWindowPosで直すと、クライアント領域だけのウィンドウになってしまい
にっちもさっちもいかなくなってしまいます・・・。
どうすれば通常のウィンドウに復帰できるでしょうか?
>>520 参考にします。
533 :
517 :2007/03/06(火) 14:13:46
Windows Media Player 10 を使っているのですが、 10用のSDKってもう無くなってるみたいなんですが、 9用のSDKでも大丈夫でしょうか? 11用は落とせるようにはなっていないみたいですが・・・
COMはSTAのときCoInitializeで初期化したスレッドでメッセージをディスパッチしてやらないとハングするんだっけ
とあるスレッドでGetMessageしたメッセージを、他のスレッドで Dispatch するのはCOMに限らずダメ。
>>415 亀レスすみません。ありがとうございます。
贅沢言ってすみません。
538 :
503 :2007/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:\でもカレントにしてダミーのコンソールプログラムを動かしとくかなあ(涙)
>>538 私見だけど;
GUIアプリではカレントディレクトリを常に当たり障りのないトコに設定しとくべき。
OpenFileDialog 等、カレントディレクトリが移動されそうな処理の後には再設定も行う。
これを怠ると「なぜこのフォルダが消せない!」ということが頻発するから。
540 :
503 :2007/03/06(火) 18:01:19
>>539 コメントありがとうございます。
Prog2がコンソール(CUI)アプリといところが味噌でして・・・・
(これを書くと関係者が見てたら身元がバレそうだが)
実は上記のProg2は(組み込みマイコン用のクロス)コンパイラであり、処理するファイルは
ソースファイルなんです。
#include 等を適切に処理するために、カレントをそれなりの場所にして起動する必要があります。
542 :
503 :2007/03/06(火) 18:33:45
なんだかよくわからないけど Prog2のカレントディレクトリをC:\とかにして起動して 起動後にカレントディレクトリ変えるんじゃだめなのか? 全然見当違いなこと言ってたらすまん
なるほど。 バッチファイルを挟むという手はあるな。 ・・・俺は馬鹿か
試してないけど、conime.exeを先に起動しとくとかは?
それが541の解決法
>>540 CreateProcessって子プロセスのカレントディレクトリをパラメータで指定できたから
親のカレントディレクトリを移動する必要はないんじゃない?
>>545 それが
>>541
>>503 CreateProcessでProg2を起動しているんだったら
CREATE_NO_WINDOWフラグを入れるのは?
あとは、終了時にWM_CLOSEをconime.exeに投げたり
conime.exeをkillする手もある。
550 :
503 :2007/03/06(火) 20:45:07
>>543-549 コメントありがとうございます。
(直接APIの事でないのに、こんなに盛り上がっていいのか・・・・)
Prog2は他社製のため手を入れられませんが、
>>544 の書かれているように
間にバッチなりコンソールアプリなりを挟んでそこでC:\→目的のディレクトリ
を行うのはいい方法ですね。
>>538 の最後に書いたのも、
>>541 も
>>544 もconime.exeを予め問題の無いディレクトリで
起動しとくという点では同じ考えで、あとはどれが一番美しいかですね。検討してみます。
>>547 CreateProcessでの子プロセスのカレント指定は既に使用しています。
(conime.exeが影響されるのは子プロセスのカレント)
親のカレントもファイルを選択した時点で同じディレクトリに移動させていますが、
逆に親が動いている間はそのディレクトリを消されたくないので、(消極的な方法ではあり
ますが)そのようにしています。
>>548 >
http://support.microsoft.com/kb/899153/ja もっと大爆笑!
>>549 >CREATE_NO_WINDOWフラグを入れるのは?
で、conime.exeが起動されなければ一番よさそうですね。試してみます。
>あとは、終了時にWM_CLOSEをconime.exeに投げたり
>conime.exeをkillする手もある。
実際にProcessExplorerからconime.exeをKillしてみると(当然のことながら)ディレクトリ
を削除できるようになりました。ただ前にも書いたように一つのconime.exeが全ての
コンソールアプリで使いまわされているようなので、この時に他のコンソールアプリが
動いている可能性を考えると、この手は使えません。
551 :
503 :2007/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 :2007/03/06(火) 22:27:06
余談だが、VisualStudio6のIDEでビルドを行った時もconime.exeが起動され、IDE終了後も残る。 VistaにVS6入れる人なんてほとんどいないと思うが、プロジェクトのディレクトリが 削除できなくなるんだろうなあ。
DETACHED_PROCESSでもコンソールウィンドウは表示されなくなるが、 CREATE_NO_WINDOWとは何が違うのだろう。(conimeについては未確認。)
Vista に 6.0 入れてるよ俺… 明日試してみるか orz
デュアルブートしてるXPにインストールしたVC6のコンパイラだけ借りてる
コンパイラを使っている方のOSは何
557 :
503 :2007/03/07(水) 13:36:06
Vista環境で、CREATE_NO_WINDOWによりconime.exeが起動されなくなり、ディレクトリが消せなく
なる問題が解決することを確認できました。
また、
>>538 の状況やCREATE_NO_WINDOWでの対策が有効なことは、Vista-x64のWOW64
環境下でも同じであることを確認しました。
万事解決。皆様に感謝。
>>552 がデマだったらまずいんで自分でも確認してみたら、やはりVista環境でログイン後の最初に
VS6-IDEからビルドを行ったプロジェクトのディレクトリは削除できなくなりました。
ポップアップメニューで、特定の項目についてのみ、クリックしてもポップアップが閉じない (メッセージは送信する)ようにするにはどうすればよいでしょうか?
>>558 よくある感じだと [OK] [APPLY] [CANCEL] の [APPLY] ってこと?
560 :
558 :2007/03/07(水) 17:27:10
>>560 メインウインドウに PostMessage するのはダメ?
562 :
558 :2007/03/07(水) 17:58:15
>>561 それは具体的にはどういうことでしょうか??
「MFS_CHECKED になりえるメニューアイテムがあって、開きっぱなしのままトグル動作したい」 POPUP しなおす / POPUPメニューを止めて、ダイアログで実装 すきなのえらべ
564 :
558 :2007/03/07(水) 18:17:16
>>563 やはりその二つですか〜。
ありがとうございました!
CreateProcessのCREATE_NO_WINDOWフラグって VC7でないと使えない? MSDNの2000年版にすらそのフラグは存在してないんだが。
自分で定義すりゃ何ででも使える
以前は非公開だったってだけだな
そっか 逆にOSは2000以上限定ですかね?
9xだって動くんだい
>>565 なるべく新しいPlatform SDKを入れてみろ
VC6なら、ほどほどに新しいもの(2003febだったか)を 入手する必要があるぞ(w
>>565 VC6 SP6でもちゃんとwinbase.hで定義されてるし、VC6用最終のMSDN Oct.2001には載ってる。
Win9xも対象にしたいならDETACHED_PROCESSでも使え。
(CREATE_NO_WINDOWと何が違うのかは知らんが。)
リダイレクタ作った時、CREATE_NO_WINDOWを指定したら、 コンソール窓が開かなくなったが・・ 憶測だけど。
質問があります。 とあるファイルパスが、 ショートファイルネーム形式か、 ロングファイルネーム形式かを判定する関数ってありますか? あれば、関数名を教えていただきたいです。 もしなければ、皆様はどのようにして判定しているのでしょうか? (~を検索?)
>>574 GetFullPathName
GetShortPathName
576 :
574 :2007/03/08(木) 11:58:35
>>575 この2種の組み合わせで検討してみます。
ありがとうございます。
タイマーの調子が悪いんですが SetTimerとKillTimerを繰り返していたら処理落ちするとかありますか?
Windowsは知らんのだけど、これってタイムアウト前に再度SetTimer()したらどうなるんだ? なんとなく、一度目のタイムアウトで二度目のタイマーまでKillしてしまうような気がするのだが。 #つーか、毎回毎回KillTimer()しないといけないもんなのか?
581 :
579 :2007/03/08(木) 18:25:10
>>580 じゃあKillするに相応しいメッセージはなんなんだろう。
そもそも何を持って処理落ちしてると判断したんだ
あと、SetTimer時の戻り値を保存しておいてそれを使ってKillして その変数をタイマーの有無に使えば2重に作ったり消したりは防げないか
SetTimerとKillTimerでタイミングを制御していること自体が「処理落ち」の原因だと思うけど。
585 :
579 :2007/03/08(木) 18:40:03
根本から間違ってたわけですか。 タイマーってかなりメモリ使いそうだからいちいちKillしてた。 そこに原因があったのかもしれません。 ありがとうございます。
Userメッセージ使ってもいいしな。 しかし、InvalidateRect使っててUpdateWindowしてないからな気もするな
>>580 タイムアウトまでに再度SetTimerしたら
そのタイマが既存のタイマに取って代わる。
その場合既存のタイマのタイムアウトが経過してもメッセージは流れない。
>>585 SetTimerは確かにユーザーオブジェクトとしてはかなりリソースを使う方だし
そもそもコールバック使わない場合、WM_TIMER自体のメッセージ優先度が低いから
精度もかなり酷い(スレッドのメッセージ処理が空いた時にしか投げられない)。
ソース見てないから適当な事言うけどウェイタブルタイマに置き換える事は出来ないの?
589 :
579 :2007/03/08(木) 19:07:05
MouseMoveに詰め込みすぎたかもしれません。
60行近くあったんだけど、
消したら割りとスムース。
>>586 それも忘れてました
>>588 ウェルタ・・・難しそうだ。
>>588 SetTimerはコールバック使っても一緒だよ。
>>577 「調子が悪い」なんて抽象的に言われても分からん。
質問するときは、もっと詳しく書かないと駄目。
591 :
579 :2007/03/08(木) 19:18:17
ちょっとソース見てみたけど、WM_MOUSEMOVEでInvalidateRectしてるのが いけないんじゃない?
593 :
デフォルトの名無しさん :2007/03/08(木) 19:55:01
Windows Mobile 5.0向けのアプリケーションを作っています。 HTTPサーバ上にあるXMLを読み込みたいのですが、 XMLHTTPあたりを使えばできますか?
ソケット生成、データ受信、構文解析で出来る。
>>577 のソース見てみようと思ったら消してやがる・・・
>>593 これ使えばいいかなって思うのがあるならまずやってみれ
596 :
579 :2007/03/08(木) 20:09:11
>>592 それだ!THX!595悪いね。恥ずかしいから
じゃ、代わりに上げておくか。
598 :
579 :2007/03/08(木) 20:42:02
その流れ秋田
cmdから叩けばprintfでコンソールに値を出せて、 ダブルクリックで起動したらウインドウ無しで常駐できるアプリは作れますか? WinMainで作るとコンソール出せなくてダメで、 コンソールアプリとして作るとどうしてもウインドウがでちゃうの
AttachConsole?
たしかwinアプリでコンソールに出力するなら、AllocConsoleのあと、 freopenでstdoutを"$COUT"で開き直すんだったはず でも起動方法で分岐するとなると分からん
STARTUPINFOとか臭いな と調べもせずにいってみる あと親プロセスがコンソールか否かを調べるとか
605 :
デフォルトの名無しさん :2007/03/09(金) 06:11:21
ウィンドウクラスについて質問なのですが、 ローカルウィンドウクラスを登録する場合、 他のプロセスですでに登録されているウィンドウクラスの名前を使っても問題ないのですよね?
問題ない
>>599 パイプ作って、STARTUPINFOについないで、
CreateProcess
608 :
デフォルトの名無しさん :2007/03/09(金) 13:29:28
色々と調べた(実行、検索)のですがわからないので、どなたかお教え願います。 プラットフォーム:VB6 質問に関係するAPI名:SetMenuItemBitmaps 作業内容:メニューにアイコンを表示する アイコン表示そのものはうまくいっています。 しかし、アイコンのサイズが16x16のBitmapなのに対して メニューの各項目の表示幅が12程度しかないため、 Bitmapが全て表示されない(左上を基点として、半分程しか表示されていない)と いう状態に陥っています。 設定後、DrawMenuBarで更新してみましたがそのままでした。 質問は以下の通りです。 ・メニューの各項目の縦幅を任意に変更できるか?(ChangeMenu、ModifyMenuでは無理のようですね…) ・Bitmapのサイズに合わせて、メニューをうまく表示させる方法は? 以上、どなたかお教え願います。引き続きあれこれやっていくつもりなので、もし自己解決しましたら その時点ですぐにこちらに解決したことを報告いたします。
>>599 winアプリで作って、コンソールからは、
winアプリ|more
で使うしか方法はないんちゃうか
GetStdHandleで判定
そもそもダブルクリック起動かどうかなんて判定取れない
>>608 標準のWindowsの設定ではメニューの縦幅は16pxのアイコンがきっちり入るから
12pxってのは設定いじった結果なのか、よくわからないけど、
オーナードローでメニューをイチから描画するのが、
一番自由度は高くて、メニューの高さも幅もアイコンも全部自由に管理できる
なんか読点多くて 日本語でおk みたいな文になったな とりあえずいいたいことは オーナードローメニュー でググレば目的は達せられると思う、と
613 :
デフォルトの名無しさん :2007/03/09(金) 15:41:12
>>611-612 プログラマとしての適性なさそうです。
学生ならプログラマになるの止めましょう、もし、いまプログラマなら転職をすすめます。
614 :
608 :2007/03/09(金) 15:46:11
原因は別のような気がします。 SetMenuItemBitmaps のサンプルを幾つかダウンロードし(ソース付きのやつね) 実行してみたものの、3種類試しましたがいずれもアイコンが全て表示されません。 (13x13のアイコンなのに8x8サイズぐらいしか表示されない) WinXP SP2、VB6 SP5、それ以外に思いつくのは・・・IE7をインストールしたことでも 関係するのかなあ? VPC上での動作と比較してみます。
プログラマになりたいんですけどどうすればいいですか?
先ずは層化学会に入信しなさい、そうすれば道は開かれます。
>>613 マジか? 俺も創価行ってくるわ
>>608 には失礼した
SetMenuItemBitmapsはスモールアイコンじゃなくて
チェックマークイメージの代わりを指定するものだったみたいだな
619 :
608 :2007/03/09(金) 16:46:50
620 :
608 :2007/03/09(金) 16:48:02
しまった ttp にするのを忘れてた・・・後の祭りですが、すみません。
>>608 cx = GetSystemMetrics(SM_CXMENUCHECK)
cy = GetSystemMetrics(SM_CYMENUCHECK)
Debug.Print "cx = " & cx & vbTab & "cy = " & cy
上記コードを実行したらわかるけど、規定のサイズは11px。
622 :
608 :2007/03/09(金) 18:35:02
ガ━━━━━━(゚д゚;)━━━━━━ ン!!
>>621 さんありがとうございます。
16x16で配布しているサイト多いし、アプリから吸い出しても16x16が多いので
これが基本だと思い込んでた・・・
ふむう、仕方がない。アイコン全部自作すっか・・
基礎知識提供感謝です。
SetMenuItemBitmaps って Vistaだと16x16の32bitアイコン表示してくれるんだよね 微妙にうれしい
625 :
デフォルトの名無しさん :2007/03/10(土) 08:31:59
Windowsの右下に小さなアイコンが居ますよね? 幾つも居るんだけど使わない時は隠れていたり. アレってなんて言うんでしょうか? アレもアプリの一種だというのは判るのですがどうやって作るのでしょうか?
すまんAPIというか微妙なんだがブラシとかフォントとかリソースあるよね? 頻繁に使われるものをパフォーマンスのために一時的にキャッシュ(数秒使われなかったら削除など)してみようかと思うんだがこれは許されない行為なんでしょうか?
いつ削除するかはプログラマの自由だべ。 とはいえ、削除しようとするハンドルが利用されていたらダメだけども。
別にいいと思うよ。 俺もウィンドウを作ると同時にオブジェクトを作って、 ウィンドウを削除するまで保持しておくとかやるし。
>>628-629 あり。
プログラミングウィンドウズ本とかですぐに開放しろといってるのは、たまるとほかのアプリのリソースを圧迫するからって話で、適切に管理するならやって大丈夫ということでいいのかな。
>>630 > プログラミングウィンドウズ
Windows 3.1時代から改訂を繰り返してるから当時のリソース制限を前提に書いてる
ロジックを複雑にしてリソースを可能なかぎり早く解放するより、多少無駄なリソースを持ってもロジックを単純にするほうが、 今日ではメリットが大きいと思われ。
検討違いのレスがあるな
漢字間違いのレスがあるな
ぬるぽのレスが無いな
ウインドウのDCをゲットして、スクリーンショットを撮るプログラムを書いてますが、 隠れてたり最小化してるウインドウは不可能ですよね?
> ですよね? やってみれ
>>627 CreateFontでフォントを毎回作成するのと、最初に一度だけ作って使いまわすのを
比較したことがあるけど、毎回作ったときのオーバーヘッドはPentium3でも
0.1ms程度だったから、パフォーマンスのためにキャッシュってのは、
あまり効果がないよ。
5とか10usみたいなミジンコみたいな小さい時間ならわかるけど、 100usって結構大きくね?
わずかな時間でもそれを何回も呼ぶとかによって トータルで速いとか遅いとか感じることが出来るかどうかだ。 微妙なら面倒なことやりたくないが やってみないとわからないんだよな。
おでの作ったアプリは起動時に全部読み込んで終了するまで放さないぜ
そういうキャッシュに類する行為は実際に動作させてボトルネックに なっていることがわかってから考慮すれば十分。
HWND から実行ファイル名を調べる API があれば教えて下さい
ありません
TeraPad の外部ツールは HWND から実行ファイル名を特定してるぞ
647 :
644 :2007/03/10(土) 17:39:22
無いのですか…残念 同一のツールでバージョン違いがいくつかあり、 今起動中のものがどのバージョンのものかを調べる方法が知りたかったのです (ツールにはバージョン表記がなく、見た目では判別できません) GetWindowThreadProcessId GetModuleFileName とか試してみたのですが、どうにもうまくいかなかったのでここで質問させてもらいました
もっとスマートな方法がありそうだけど GetWindowThreadProcessId + OpenProcess + GetModuleFileNameEx
GetModuleFileNameEx Windows 95/98:対応していません。
>>643 とりあえず今遅いんだよね。
キャッシュでやってみて結果報告するノシ
>>647 GetModuleFileNameは自プロセスのモジュールの情報しか得られません。
>>649 CreateToolhelp32Snapshot
652 :
644 :2007/03/10(土) 18:01:33
>>651 ありがとうございます
CreateToolhelp32Snapshot プロセス 列挙 でググったら
CreateToolhelp32Snapshot
+
Process32First
+
Process32Next
でいけそうです
ありがとうございました
655 :
625 :2007/03/10(土) 23:04:31
626さんありがとう ちなみにタスクトレイに並ぶアプリってスタートアップに入っていないのも居ますよね? アレってどっかのレジストリに登録されているんだろうと思っているのですが,あってますでしょうか? だとすると,それは何処になるのでしょうか?
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run を見てみると幸せになれるかもしれない あとたぶん他にもWindowsサービスで動いてるものもあるかと
HKLMだけでなくHLCUにも同じのがあったはず
え?タスクトレイにアイコンを表示したいんじゃないの? Shell_NotifyIcon ってことじゃないの。
659 :
デフォルトの名無しさん :2007/03/11(日) 00:30:50
ペゾルド上巻p.276のコードで意味の無さそうなコードに見える箇所があって case WM_CREATE: case WM_DISPLAYCHANGED: ・・・ cLinesMax = cyClientMax / cyChar ; pmsg = (PMSG) malloc (cLinesMax * sizeof (MSG)) ; cLines = 0 ; return 0 ; case WM_SIZE: cxClient = LOWORD (lParam) ; cyClient = HIWORD (lParam) ; // Calculate scrolling rectangle rectScroll.left = 0 ; rectScroll.right = cxClient ; rectScroll.top = cyChar ; rectScroll.bottom = cyChar * (cyClient / cyChar) - 1 ; return 0 ; のようにWM_SIZEが送られるときはWM_PAINTも送られるからInvalidateRectなどは要らないと思って書き直してみたのですが、 元のコードには何かの意図があったのですか?
>>659 ウィンドウを再描写させないようにリサイズすることは簡単なんじゃ?
> WM_SIZEが送られるときはWM_PAINTも送られる かどうかはクラススタイルに依存する。 ウィンドウ全体の再描画が必要かどうかは書こうとしているものに依存する
VB6+WinInetを使ってHTTPSを扱うプログラムを書いています。 InternetErrorDlgを使ってユーザに選択させたクライアント証明書を使い続けたいのですが、 作成したコードだとHttpSendRequestを行う度に選択画面が表示されてしまいます。 (一度選択したクライアント証明書を次のHttpSendRequestで使用してくれない) どなたか原因をご存じの方いませんか?
663 :
デフォルトの名無しさん :2007/03/11(日) 06:13:41
WM_MOUSEMOVE と WM_NCMOUSEMOVE が逆転して送られてくるのですが なぜだかわかりません(昨日まで正常だったのですが)。 理由がわかる方教えてください。
クライアント座標とスクリーン座標の違いがあるのに適当に処理していため、窓の位置を変えたらおかしくなった。 とエスパーしてみる。
WM_LBUTTONDOWN などはそのままクライアント座標なんですが。
666 :
663 :2007/03/11(日) 06:42:55
よくわかりませんが正常に戻りました。 m(__)m
>>657 あるね
スタートメニューで言う、All Usersとカレントユーザーの分けみたいなもんだね
668 :
デフォルトの名無しさん :2007/03/11(日) 11:45:16
類似曲検索プログラムを作ってくれーーーーーーーーーーーー なぜかない...... 音符か、波に変換して比較すればいいんだ 頼む
669 :
644 :2007/03/11(日) 11:47:29
短時間FFTでもどうぞ
671 :
デフォルトの名無しさん :2007/03/11(日) 11:49:20
なんでもいいからMP3とWMAとwavを読み込めて にた曲を抽出するやつをつくってくれ---------------------
>>668 そにーがConnectPlayerで実装済みですが( ´Д`)なにか??
マジで造ったら数千万円レベルだろ
674 :
デフォルトの名無しさん :2007/03/11(日) 11:54:00
>>672 実装済みじゃなくて、ここにexeを貼り付けてクレーーーーーーーー
それ使って類似曲を抽出したい
そんぐらいぐぐれ
もはやありきたりの技術じゃないか。
678 :
デフォルトの名無しさん :2007/03/11(日) 11:58:58
ありきたりなら、ツールのリンクを貼り付けてクレーーーー 出てこないよ
スレ違いに貼るリンクは無い
スレ違いじゃない。 かといって板違いでもない。 そう、気違いだ。
681 :
デフォルトの名無しさん :2007/03/11(日) 13:03:50
スレッドIDからプロセスIDをしるAPIはありますか?
直接はない 環境が許すならOpenThread->GetProcessIdOfThreadが一番楽
ハンドルからならGetProcessIdOfThreadってのがある
684 :
681 :2007/03/11(日) 13:45:56
最近できたAPIっぽいですね ありがとうございます
Requirements Client Requires Windows Vista. Server Requires Windows Server "Longhorn" or Windows Server 2003 嫌がらせ以外には使えねえな
エクスプローラでマウスの真ん中ボタンを押したら 新しいウインドウで開く って実現できますかね? レジストリ登録だけで右クリック⇒新しいウインドウ はできるんだけぢ
>>686 出来るだろうけど、正攻法じゃなさそうだし俺は方法を知らない
できたら便利なんだけどなぁ DLLインジェクションでエクスプローラに寄生するとか そういう難しいことしないとダメなのかな
>>684 Vista以前でどうにかしたかったらToolhelp32かPSAPIで列挙して自分で探す
msdn2またおもくなちゃってる msdn2かわいいよmsdn2
なんでwebブラウザに拘るんだろう>msdn online バカバカしい
webのmsdnってIEベース以外のブラウザだと表示がgdgdになるからイヤ
そりゃ自社のサイトなんだから自社製品以外では見れないように嫌がらせするのが当然だろ
深い階層に行くほど、左のフレームの表示にCPU食いまくって糞重い
>>692 最近はわりと改善されてる。
一時のスタイルシート切らないと表示すらされないとかメニューがことごとく文字化けとか
まったく話にならないレベルと比べると
696 :
デフォルトの名無しさん :2007/03/11(日) 19:49:14
>>693 単純にコストの問題だ馬鹿。
ひとつ対応ブラウザ増やすだけで、どんだけ工数が増えると思ってんだよ。
0.1%位
逆だ馬鹿、わざわざ手間をかけてIE以外では全く読めないようにしてあるんだ 普通に書いたらせいぜいレイアウトが多少変わるくらいでとりあえず読めてしまうだろ
>>697 それは何時もどこかで独禁法で争ってるMSですから^^;
>>695 久々に行ってみたら確かに良くなってた
結局ローカルのほうが軽快なんだけどね
>>699 そうじゃないんだよ、馬鹿。
HTMLってちょっとしたことで致命的に非互換なページができるんだよ。
運良くその「ちょっとしたこと」を踏まなきゃそこそこマシなページになるんだが、
あんなごちゃごちゃしたサイトにそれを望むのは酷だ。
てか、おまえ、Web系の仕事したことない素人だろ。
そういう事を楽にする技術のひとつがASP.NETだった気がするんだが
>>702 楽になる=コストがゼロになる・・・じゃないぞ。
こんぐらい殺伐としたやりとりがあると ああWin32APIスレだなぁって思う。
>>701 たとえば致命的に非互換名ページをみせてみ?
確かに、非標準の MSIE 独自機能のようなちょっとしたことを踏んでしまうかどうかは 運不運の問題であって、避けようがない災難だから仕方ないな 事実、世の中にあるほぼ全てのウェブページは IE 以外では全く読めないしな Web系の仕事したことあるプロが言うんだから間違いない
Web系の仕事した事ないけど俺のサイトは殆どのブラウザでみれるな
>>705 致命的という言い過ぎかもしれんが、わんくまとか
Safariでみるとかなり酷いことになるぞ。
>世の中にあるほぼ全てのウェブページは IE 以外では全く読めないしな いったいいつの時代の話だ
"全く"を除けば同意
まぁ待てよ マカーかもしらんぜ?
マカーがWin32 API 質問スレッドとか読んでるのか
>>713 マカーっていうか、WinとMacを両方持っているヤツなんて別に珍しくないだろ。
俺も、この書き込みはMacからしてるし。
珍しいわw
>>714 自分の感覚即ち世の大勢とかいうような思考は慎んだ方がいいぜ
企業の備品ならともかく、個人でWinとMac両方そろえてるなんてごく一部
>>714 じゃないけど……
どちらが事実に近いかは別として(多分君が正しい)、
全く同じ反論が成立することについては自覚してる?
いや、Winユーザからしたらそりゃマイナーな存在に見えるかもしれんけど、 Winマシンも持ってるMacユーザは普通に居るだろ。
Macユーザー限定の話ならそりゃそこまで珍しくは無いだろうなぁ だがMacユーザー限定なんて言ってないしな
マイナーでも確実にいる
つまり井戸の蛙か
使い所を間違ってるな
今のMacはエミュ無しでWindowsが動くぞ。
724 :
659 :2007/03/11(日) 23:17:13
>>660-661 ウィンンドウ作成時、WM_CREATEに始まってそれからどんな順番でメッセージが送られるのか記憶が
曖昧だったので混乱しましたが、ありがとうございました。
おいおい、スレ違いもry
proxomitronみたいなのでMSDNのフィルタ作れ
言い出しっぺ頑張れ
どうしてもローカルに保存する必要がある場合は わざわざそれ専用のDLプログラム作ったりするけど MSDNはローカルに持ってるからな サイトの構成わかってるんだし直リンページ作っとけば済むと思うけど
そのうちMSDN3がしゃしゃり出てきて、また一つ一つURLを直さないといけない
730 :
デフォルトの名無しさん :2007/03/12(月) 15:49:18
ちょっと質問。 プログラムの追加と削除に表示されるアイコンてどこに保存されてるの?
HDD
ここはやっぱりURNだろ 俺はしらんが
表示用アイコンの項目で指定された場所にあるはず
普通はインストールしてあるプログラム
735 :
デフォルトの名無しさん :2007/03/13(火) 02:58:51
プログラムのアイコン書き換えたらどこなのか簡単に分かると思うけど。
LocalLockしたローカルメモリオブジェクトをLocalUnlockせずにLocalFreeしても大丈夫?
今はLock、Unlockって機能してるの?
してない。 LocalLockは二重ポインタ逆参照してるだけだしLocalUnlockは何もしない。
740 :
デフォルトの名無しさん :2007/03/13(火) 09:07:39
派遣プログラマ、高卒、身長163cmです この先どうしたらいいですか?
なんかDVD-RAMドライブでエラーが起こると 勝手にドライバ設定がDMAからPIOになっちゃうみたいなんですけど、 これがいつもコソーリ起こるので 何か 「エラー出たのでPIOにしました」 みたいなメッセージとか出したいような気がするんですが、 何を監視すればいいですか?
744 :
743 :2007/03/13(火) 13:15:34
DVDだとSlaveDevice〜か。
745 :
742 :2007/03/13(火) 16:24:41
THX!
GDIよりDIBの方が描画速度が速いですか
それはアレだな。 車よりガソリンの方が走るのが速いですかと聞いてるようなもんだ。 まともな返事は返ってこないよ。
749 :
デフォルトの名無しさん :2007/03/13(火) 19:10:59
ウィンドウメッセージのメッセージIDを「WM_DESTROY」といった名称に変換するにはどうしたらいいですか?
.NETよりGDI+の方が(ry
>>749 っ #define
でも、複数人で開発する時にこれをしたら吊ってもらう
752 :
749 :2007/03/13(火) 19:17:50
>>751 そうじゃなくて、受け取ったメッセージを表示するプログラムなんですが
メッセージIDで表示しても、なんのメッセージかわからないんで文字列名称に変換したいんです。
>>749 grep "#define WM_" winuser.h | awk 'printf "{%s, \"%s\"}\n", $2, $2'
後は検索できるように構造体およびリスト作成
754 :
749 :2007/03/13(火) 19:26:38
>>753 結局は手作業で変換するしかないってことでしょうか?
結構誰でも思いつきそうな機能なのでそんなAPIないかな〜と思ったんですが
そういうAPIもあるけど教えない。言わない。書かない。
どうやら態度が気に入らないと言ってるらしいぞ
質問です。 タスクマネージャの様に各プロセスのメモリ使用量やGDIオブジェクトを知りたいのですが どうやれば良いんですか?
今から755のご機嫌をとるスレになります
>755のご機嫌を取るAPI教えてください
TerminateProcess
761 :
749 :2007/03/13(火) 20:01:37
自己解決しました。
>>755 にカチンときたので教えません。
バーカ!
>>753 文字列化演算子でいいんじゃね? スレ違いだけど
ファイルパスとして妥当であるかを調べるAPIってありませんか?
PathGetCharTypeでぐるぐる回す?
Vista時代になったらDirect3Dとかも覚えないと もうWindowsプログラマとして食べていけないんだろうか GDIは全部エミュレーションになって激遅らしいじゃん 既存のGUI業務アプリの全Direct3D化なんて言われたら 自殺するしかない
糞ビスタ
きっと適当なラッパーが登場して万事おk
CUIアプリしか作らない俺には縁のない話だぜ
>>766 それほど深刻じゃないみたいよ。
ヒマみて.NET Framework 3.0にでも手をだすたら?
WPFとXNAの相性が悪すぎるのがなぁ・・・
WinFXの話題があがったから、ここの住民に聞くけど。 Microsoft Expressionって、元はクリーチャハウスのアレなのか? こいつが、Flashキラー? どんな経緯なんだよ!!
パフォーマンスチューニングなんて飾りです 顧客には#ifdef切り替えてるだけなのが判らんのですよ
ごばく だぜ
776 :
デフォルトの名無しさん :2007/03/14(水) 00:20:27
低レベルな質問で申し訳ありませんが・・・ CreateWindowEx でウィンドウ表示をするとき、HINSTANCEで本物を渡すのをズボラして NULLを渡しても問題ないんでしょうか? HINSTANCEは、関数が要求するときに渡すためだけにある数合わせ程度の引数でしかない、 とそういう認識をしているのですが(本当はアプリを区別するためみたいだけど) 試しにCreateWindowExでNULLを入れてみたらウィンドウ自体はちゃんと出てしまったものですから デフォルト値としてゼロを与えるようなコードを書いちゃってもいいものかと悩んでしまいまして・・・
>>776 問題ありです
悩む暇があったら
HANDLE GetCurrentProcess(VOID)
を使って下さい
わかりました。ありがとうございます
え?なんでGetCurrentProcessなわけ?
hInstance Windows 95/98:ウィンドウに関連付けられたモジュールのインスタンスハンドルを指定します。 Windows NT/2000:このパラメータは無視されます。
俺はGetWindowLong派
むしろstatic HINSTANCE hInstanceとLPCREATESTRUCTでだなwwwwww
オレの場合、どっかのサンプルコードにあった GetModuleHandle 使ってるけど、これってまずい?
楽だからってプロセスハンドル渡すのはどうなのか
プロセスハンドルとインスタンスハンドルってまったく別アドレスに格納されてるんじゃ枚か?
int main(){ printf("%x\n", GetCurrentProcess()); printf("%x\n", GetModuleHandle(NULL)); } ffffffff 400000
>>777 は間違ってるよね?
GetModuleHandle に NULL 渡すのがいいよね?
LoadIcon で試してみた GetCurrentProcess() 失敗 GetModuleHandle(NULL) 成功 引数が無視される場合は関係ないが どっちにしても GetModuleHandle(NULL) にしておけば問題ないと思った
GetCurrentProcessとGetCurrentThreadが返すのは擬似ハンドルだよ。
そもそもいまごろ9xまでサポートしなければならないのか?
業務用アプリなら仕方がないのかもね 個人向けなら普通に切り捨てるけど、 そもそもサポートが打ち切られた9xが入ったPCを ネットに繋げてるだけでもはや公害だし
しばらく前に、中小企業のエンドユーザのとこに行ったら 9Xが現役で動いていて、自分がずーと前に携わったPGの ショートカット(その会社とは無関係な製品)がデスクトップ に張ってあって、涙が出そうになったことある。
>>794 会社の導入コスト/教育費...etcの償却やいろいろあるからねー
手間ではあるし。
>>785 それは問題ない。Win32のモジュールハンドルとインスタンスハンドルは等価。
普通はWinMainのあの引数にもGetModuleHandle(0)の戻り値が渡されている。
ってことは、わざわざグローバルとかに hInst って置かなくても 常に GetModuleHandle(NULL) 呼び出しとけばおk? まさかそんなとこが、クリティカルにパフォーマンス落とすこともないだろうし
DLLを作る場合に問題が出る。
あー全くその通りでした ありがとうございます
>>794 今年に入って、Win3.1上で動いてるAccessアプリのメンテをする羽目になったぞ。
データを持ち帰ろうとして、ファイルのコピーのやりかたを思い出せず、お客さんに教えてもらったぞ。
>>801 vm 上で動作してるんなら別だけど
Win3.1 のデータを持って帰るのって大変そう…
フロッピーだったりしてね
ファイルのコピーって紙のファイルだったのかーーー!!!
プログラムマネージャーはエクスプローラーみたいに見えて ランチャーでしかないからな ファイルマネージャーを起動しなくちゃw
DOS窓叩いた方が早いな
そしてlsと叩いてエラーが返ってくる
お前らいくらなんでもバカにしすぎだwww
Visual C++ 2005 Express Edition ダウソしたんですが、 templete.obj : error LNK2001: 外部シンボル "__imp__DefWindowProcW@16" は未解決です。 WinAPI使おうとするとエラーが出ます。何でですか?
Platform SDKかWindows SDK入れろ。 その上でリンカにuser32.libを読み込ませろ。
812 :
デフォルトの名無しさん :2007/03/15(木) 00:53:43
ブレークポイントでストップしたときにアクティブになるウィンドウは何かね。
814 :
◆ohD6m3l5jg :2007/03/15(木) 01:51:56
すみませんWindows板から誘導されてきました。 動的リンクの実装について答えられる方に質問です。 バカみたいな疑問で恐縮ですが、あるDLLが、同じDLL内にある関数(もちろんEXPORTED)を呼ぶ時 LoadLiblary + GetProcAddress を使ったとします(そんな必然性はない事は承知)。 こういうバカコードを実行したら、Windowsは内部的な動作としては、 指定のDLLは(呼び側自身であるわけで)既にロード済みだから、LoadLiblaryは何もせず、 ハンドルだけ返し、GetProcAddressは おとなしく目的の関数のポインタ返してくれるだけで、 ロードのオーバヘッドはかからないように実装されてるんでしょうか? 実際動かしてみたのですが、エラーにはなりませんでした。
>>814 その場合、LoadLibrary はそのDLLのリファレンスカウントをインクリメントする。
>>814 >LoadLiblaryは何もせず、ハンドルだけ返し
Yes。但し気をつけなきゃいけないのは同一プロセスに既にマッピングされてるDLLをLoadLibrary()しても
参照カウントは増えるのでLoadLibrary()した回数分だけFreeLibrary()しないといけない
>GetProcAddressは おとなしく目的の関数のポインタ返してくれるだけで
>ロードのオーバヘッドはかからないように実装されてるんでしょうか?
こっちはNo。GetProcAddressは自プロセスにマッピングされてるDLLのハンドルから
関数名(あるいは序数)に相当する関数のアドレスをDLLのエクスポートセクションから走査する。
だから単純に関数を呼び出すのとLoadLibrary()+GetProcAddress()を使ったのでは
オーバーヘッドに差が出る。と思う(実際やった事ないので絶対とは言えない)。
>>816 静的インポートしても
エクスポートセクションの走査がプロセスの起動時間に埋め込まれるだけでっしゃろ?
>>817 静的にDLLをインポートして、EXEからDLLの関数を呼び出す場合は
もちろん内部でLoadLibraryとGetProcAddress呼んでるけど
>>814 が聞きたいのはDLLから自身の関数をGetProcAddress経由で呼んだらって話だと思う。
GetProcAddress経由は
>>816 の通りだけどDLLから自身の関数を参照する時は
>>814 みたいな特殊な事しない限り普通に参照できるものだと思ってる(EXEが自身の関数を参照するのと同じ話)。
あれ、もしかして俺ひどい勘違いしてる?もう寝たほうがいいな。
> あるDLLが、同じDLL内にある関数(もちろんEXPORTED)を呼ぶ時 って確かに書いてるね ごめん見逃してた
814の場合もそうだが、既に読み込まれていることがわかっていて、 一時的にハンドルを使いたい(まだFreeLibraryされないことがわかっている)場合は、 GetModuleHandleが便利。 LoadLibraryだと参照カウントがインクリメントされるが、 GetModuleHandleなら参照カウントはインクリメントされない。
どうしてオブジェクト指向なwin32apiのプログラムがないですか
つ【.NET】
Win32API はオブジェクト指向だ。 オブジェクトはハンドルという形にはなっているけども
あの長ったらしいハンガリアン記法は何とかなりませんか
825を変化させるほうがよほど堅実的だな
環境:WinXP、VisualStudio.NET2005 スクロールバーについて質問です。 editControlHandle_ = CreateWindow(L"EDIT",L"" ,WS_CHILD|WS_VSCROLL|WS_VISIBLE|ES_AUTOVSCROLL|ES_MULTILINE|ES_READONLY ,0,0,640,480,WindowHandle(),0,ApplicationInstance(),NULL); こんな感じでエディットコントロールを作った後 SetWindowText(editControlHandle_, output.c_str()); でそこにテキストを転送しています。 新しいテキストほど下に下に追加されていく、という形にしているので スクロールバーは常にマックスの状態に保ち、常に一番下の行を表示したいと思っています。 SCROLLINFO si; ZeroMemory(&si,sizeof(SCROLLINFO)); si.cbSize = sizeof(SCROLLINFO); si.fMask = SIF_ALL; GetScrollInfo(editControlHandle_,SB_VERT,&si); si.nPos = si.nMax; SetScrollInfo(editControlHandle_,SB_VERT,&si,true); 試しにこのコードで実行してみたところ、スクロールバーは確かに一番下にいくんですが 肝心のエディットコントロールがそれに追随せず、ずっと一番上の行が表示されています。 どこを直せばいいでしょうか・・・
EM_SETSEL
ぐぐったり晩飯食べたりしながら悶々としてやっと終わりました
SendMessage(editControlHandle_, EM_SETSEL, MAKELONG(0xffff,0xffff)-1,MAKELONG(0xffff,0xffff));
SendMessage(editControlHandle_, EM_REPLACESEL, -1,(LPARAM)newLog.c_str());
SendMessage(editControlHandle_, EM_REPLACESEL, -1,(LPARAM)L"\r\n");
大半のコードを上の三行に書き換えてやっと解決。ヒントくれた
>>829 ありがとう
831 :
デフォルトの名無しさん :2007/03/16(金) 03:10:25
ウィンドウメッセージのパラメータについて質問です。 例えばWM_MOVEメッセージのLParamはシフト演算によってy座標が、 ビット演算によってx座標が取得できます。 なぜこのような演算でxやyの座標が取得できるのでしょうか。 シフト演算やビット演算そのものは分かるのですが、どうしてこのような演算でxやyの値が分かるのでしょうか。 とても初歩的な質問ですが、ご回答願えると幸いです。
下位16ビットにX座標、上位16ビットにY座標が入ってるから。 下位16ビットが1、それ以外が0をlParamとの論理積で下位16ビットのみを取り出し、 lParamを右に16ビットシフトすれば上位16ビットのみが取り出せる。
>>831 lparamは32ビットのデータ。
一つの変数に2つのデータ(xy座標)を入れる為に16ビットに区切ってデータを入れてる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| || |
|← y座標データ . →||← x座標データ →|
こんな感じ。
834 :
デフォルトの名無しさん :2007/03/16(金) 05:11:07
bit演算分かってたらその逆を考えるっていう自然な手順で結論できそうなものだが… まぁあれだ、慣れみたいなものが必要かもね
HIWORD(x) LOWORD(x) でええやん
GET_X_LPARAM()とGET_Y_LPARAM()を使わないと、 マイナスの値とか渡ってきたときが痛い目に遭う。
EDITコントロールやRICHEDITコントロールにペーストできる限界値ってありますか? OSはWindows XPです。
838 :
837 :2007/03/16(金) 07:53:56
メモ帳には長い文字列もペーストできるのに、 自前のダイアログのEDITやリッチエディットにはペーストできない・・・
>>838 エディットは上限を指定出来るじゃん。
CEdit::SetLimitText
ありがとう。 やらないか?
最大4MBまで
>>836 いや、ちゃんと動作分かってたら痛い目見ないからw
その2つのマクロも結局LOWORD&HIWORDですよと
メモ帳はエディットコントロールのメモリを直接いじってるから コントロールの上限こえても大丈夫ぽい
845 :
デフォルトの名無しさん :2007/03/16(金) 09:20:31
"c:\\test.txt"といった文字列を渡して 自前のアプリからExplorerと同じコンテキストメニュー(できれば1・2個メニューを追加して)を表示させる方法を教えてください。
>>845 エスパーすぎるわ。
GetSystemMenuとかの話?
IContextMenu2,3?
ウィンドウ内で右クリックしたとき、[Aを編集する] とか [Bを編集する] とか そういう項を含んだ右クリックメニューが出てくるようにしたいのではなかろうか。 俺、このエスパー検定準一級に受かったら結婚するんだ
エスパーエスパーって 普通に理解できる質問だと思うんだが・・・? 回答はできないが(゚Д゚)
ESPktkr
一行目と2行目の関連というか動作がわからないところがエスパー加減なんだと思う
cドライブルートの中のtest.txtのIShellFolderとITEMIDLISTからIContextMenuを取得 IContextMenu::QueryContextMenuでメニュー項目を新規に作成したメニューに追加 独自項目を追加後普通にメニュー表示 選ばれたのが独自項目ではなければIContextMenu::InvokeCommand じゃないの? 超能力がいるか?
>>852 それで何を説明した気になってるんだ?
てか誰もファイルの実体をどーのこーの何て書いてない
飽くまで"c:\\test,txt"という文字列だ
>>853 マジで言ってるの?
それはエスパー云々以前に「対話能力がない」ってレベルだと思うぞw
"c:\\test.txt"ではなく、"c:\\test,txt"であるところが重要。
>>855 フォルダか拡張子付いてないファイルだろ。それは重要ではない
質問者が、現時点でどのくらいできるのかわからない ↓ 説明メンドクセ
> COMがわかりません と読めた
>>830 OpenJane の一番下のログ( (・∀・)カンリョウ!! )のように、
Client高さを1行に絞りきることがあるなら
前置で CRLF し、末尾にはCRLF置かないほうが良いよ。
SendMessage(handle, EM_SETSEL, -1, -1);
if (GetWindowTextLenght(handle)) {
SendMessage(handle, EM_REPLACESEL, -1,(LPARAM)_T("\r\n"));
}
SendMessage(handle, EM_REPLACESEL, -1,(LPARAM)log-string);
開いたコンソールにメニューを追加したく、 AllocConsole(); hwConsole = GetConsoleWindow(); HMENU hmConsole = GetSystemMenu(hwConsole, FALSE); AppendMenu(hmConsole, MF_STRING, IDM_TEST, "Test"); hMsg = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)GetMessageProc, NULL, GetWindowThreadProcessId(hwConsole, NULL)); みたいなコードを書いてみたのですが、メニューの Test を選んでも、 さっぱり GetMessageProc にメッセージが来ません。 どこが間違っているのでしょうか?
>>843 んなこと言い出したらLOWORD&HIWORDだって結局はキャストじゃん
ウィンドウのサイズを変更するときに縦にしか変更できなくする方法ってどうやればいいですか?
>>862 AllocConsoleで作ったコンソールは、別プロセスの別スレッドなんじゃないの?
サブクラス化も駄目なはず。
ReadConsoleInputはイベントは取れてもIDM_TESTまでは拾えないはず。
ってことで、あとはDLL作って潜り込ますしかないんじゃない?
>>867 SetWinEventHookでイベント捕まえるしか手がないと思うんだがどうよ
MSAAの関数か
870 :
デフォルトの名無しさん :2007/03/17(土) 01:05:39
>>868 やってみました。
AllocConsole();
hwConsole = GetConsoleWindow();
idConsoleThread = GetWindowThreadProcessId(hwConsole, &idConsoleProcess),
hEventHook = SetWinEventHook(EVENT_SYSTEM_MENUSTART, EVENT_OBJECT_FOCUS,
NULL, WinEventProc, 0, idConsoleThread,
WINEVENT_OUTOFCONTEXT);
これだと WinEventProc にイベントが飛びません。
thread id 指定のかわりに process id を指定しても駄目でした。
両方とも 0 にしてグルーバルフックにすると動きますが、さすがにそれはどうかと……。
うーん、なんで thread id を指定すると駄目なんだろう。
>>871 idConsoleThread = GetWindowThreadProcessId(hwConsole, &idConsoleProcess),
最後の,は;だろうが、
どっちにしろAllocConsoleしたコンソールのスレッドIDは、この方法では取得できない
コンソールウィンドウって仮想マシンだったよな あれは結構別物だと思ってたんだけど、ただのウィンドウなの?
874 :
872 :2007/03/17(土) 02:04:36
>>871 さらに、コンソールの本当のスレッドは、idConsoleProcessの下にはない
だからSetWinEventHookでプロセスIDとしてidConsoleProcessを指定しても、
コンソールの本当のスレッドまでフックが届かない
コンソールの本当のスレッドIDを取得する方法は俺も知らん
Global HookしてプロセスIDでチェックするしかない気がするな
>>874 ありがとうございます。あとはイベントを捕まえればいいのですが、
EVENT_OBJECT_INVOKEDってVistaオンリー・・・
EVENT_OBJECT_FOCUSとかで地道に捕まえるしかないっぽいですね。
そのうえ取得できるのは定義したメニューのIDM_TESTじゃなくて、上からの順番だけ・・・
もう泣きそうです。
コンソールウィンドウってCSRP(csrss)の持ち物だったっけ?
>>875 だめだ、簡易編集オンになってて範囲指定中だと、
発生したイベントがブロッキングされてしまいました・・・
もう泣いてもいいですか。
>>876 だな、そのあたりからスレッドID探せるかもしれんな
こういう時こそデバッガの出番じゃね? 追ってけばそのうちわかる気がしね? じゃあ任せた。
スレッドID分かっても、大して意味ないよ。複数のコンソールが同一のスレッドで動くから。 イベント処理プロシジャの中でHWNDとか見てどこから飛んで来たのか判断する必要は同じ。 しかしMSAAって日本語の資料少ないな。
Jane Doe Styleのスレッド一覧を表示するようなウィンドウってどうやって作るんですか?
ソース公開されてなかったか?
883 :
yyy :2007/03/17(土) 16:58:39
このクマクマに「スレタイを読め」と言って通じるだろうか
886 :
デフォルトの名無しさん :2007/03/17(土) 17:21:55
>>884 たぶん「API」という言葉にしか目が行っていないのだろう
もしかするAPIという言葉が理解できてないのかも知れない
和んだ
わんだ?
早大レイプ部の和んださんって今何やってるの?
かずんだ?
>>883 あれはな、よく聞けよ?
APIじゃなくてamazon web service。 わかったか?
amazon web serviceかAWSで検索してこい。
WindowsSDKとMFCの違いを教えてください。
898 :
897 :2007/03/18(日) 00:56:29
VCで提供しているクラスライブラリを使わず開発するって事なのかな 以下それについての疑問 @MFCを使わず開発する上での利点 AMFCとSDKの開発効率はどちらが上か? B同じ技量のプログラマがそれぞれMFC、SDKで組んだ場合の実行速度に違いはあるのか? 以上3つの疑問点があります。
実際に自分でやってみて確認するのが一番。
ケースバイケースとしか言いようがない気が・・・ MFCはSDKを使い慣れた人のためのもの、というのは覚えておいたほうがいいと思う
場合によりけりだな。 軽く触る程度ならMFCで。今後使い回すつもりなら いずれどっちも学ぶ必要があるからお好きな方から。
俺は最近はSDKのが好きかもしれん。 心の迷いだろうから、WTLでも触ってフレームワークの奴隷に戻るつもりだが。
@MFC側はXerox Perkが論じたフレームワークが主モデルであり、 Windows SDK群の一握りしかラッパー化されていない。 利点については割愛。 A一般的なGUI操作が前提ならば、MFCベースが優勢。 しかし、@で述べたとおりMFCのクラス群だけではカバーできない部分もあり、 所々でSDKの関数を利用する。 B何の実行速度?MFCにはオーバーヘッドが大きいクラスが多々あるが?
904 :
897 :2007/03/18(日) 01:29:53
>>899-903 なるほど。
要するに幅広く応用するのであればSDKに精通していた方が有利なわけですね
>>904 もう一つ付け加えておくとSDKベースでの開発だとVC以外のコンパイラ(例えばBCC)
でも通るMFCはVCコンパイラじゃないと無理
警告やクエッションといったシステムのアイコンを取得したいのですが、 LoadIconだと32x32しかとれないですよね。 16x16を取る方法はないのでしょうか。
LoadImage
>>908 LoadImageでOEMイメージを取得するということですか?
下記のようにしてみましたが、
「指定されたリソースの種類がイメージファイルに見つかりません。」と取得できませんでした。
どこか間違っています?
HANDLE h =
::LoadImage(NULL, MAKEINTRESOURCE(OIC_WARNING), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE);
LR_SHARDを付けたらいけました、すみません。 けどアイコンは縮小されたような汚いのしか取れなかったです。。 HANDLE h = ::LoadImage(NULL, MAKEINTRESOURCE(OIC_WARNING), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARD);
> 縮小されたような LR_DEFAULTSIZEを指定したらそりゃ32x32に縮小されるだろ > 汚いのしか LR_CREATEDIBSECTION付けろ つーかMSDN嫁
>>911 IMAGE_ICONを指定した場合はLR_CREATEDIBSECTIONなんて関係ないが・・・。
お前さんもMSDN嫁。
肝心のMSDNへのリンクがない件について
ネタなら笑えるが社会人になってマジでやるやつがいる件
まあ「ちゃんと読んでます」って応える人間が多いこと多いこと・・・
MSDN読んでます。 910はサイズにGetSystemMetrics(SM_CXSMICON)を指定してLR_DEFAULTSIZEを付けていました。 LR_CREATEDIBSECTIONつけてLR_DEFAULTSIZE外しても、 サイズ0でLR_DEFAULTSIZEでも同じでした。 プログラムのアイコンとかだと綺麗に出るんですが、 警告とかはギザギザで縮小したような?感じになっています。
警告のアイコンってそもそも16x16が存在しないんじゃね?
いまどき作った人が他界したようなMFCを使うなんざきちがい沙汰ですが。
>>919 イベントビューアとかで使っているので聞いてみたのですが、ないのかもしれませんね。
諦めて適当なのを組み込んで済ませます。お世話になりました。
MFCのソースはapiの使い方のサンプル集として使える。 MFCをまったく使わない場合でも
924 :
デフォルトの名無しさん :2007/03/18(日) 15:51:11
みんな、Vistaの新APIどう使ってる? vc2005eeとplatformSDKをダウンロードしたんだけど、 VistaのAPIとかヘッダーファイルに定義されてないやん・・・。 platformSDKはwindowsSDKに変わったとかどっかで聞いたんだけど、 こっちをインストールしないといけないわけ?
>>924 そういうこと。
全てLoadLibaryで明示的リンクをする、
ドキュメントはオンラインのMSDNライブラリを見るにしても、
構造体や定数の定義なんかはSDKのヘッダが見れないと不便だろ。
Windows SDKはPlatform SDKの後継だから、
Platform SDKをインストールせず初めからWindows SDKを入れて構わなかったのに。
Windowd SDKだと.NET Framework 3.0 SDKが統合されてる関係か Windows 2000がサポートされなくなった罠
> Windows 2000がサポートされなくなった Win2kで動作しなくなるということ?
今のPlatformSDKだって、前のバージョンのOSであるNT4では完全には動作しないような・・・ 違ったっけ
SDKが動くもなにもSDKは動く物じゃないだろうが
インストールに弾かれるのか?
なんで実行環境と開発環境が分けて考えられないんだ?
ターゲットとしてWin2kがサポートされなくなったってこと。 実際にはWinXPあたりをターゲットに選んで注意深く組めば動くだろうけど
うーんと・・・.NETクライアントが .NETフレームワークのバージョン情報を取得する方法というのは どのようなものなのでしょうか? 予想1: レジストリ 予想2: 特定のDLLのバージョン取得関数 予想3: Microsoft.NET\Framework内のフォルダの名前 スレ違いで怒られたら申し訳ございません。
発想が逆 クライアントの側がバージョンを指定するんだよ スレ違いだからこれ以上のコメントがあったら.NETのスレでよろしく
935 :
933 :2007/03/18(日) 23:14:08
申し訳ございませんでした。 .NETスレで何も無かったのでマルチしてしまいました。 どうもありがとうございました。
936 :
デフォルトの名無しさん :2007/03/19(月) 04:04:37
【ネガティブ派遣根性チェック】 3つ以上、思い当たる点があればアナタの性格はひん曲がっており、ネガティブ負け組人生を歩んでいます。 □派遣先の人事権のある社員の意見はたとえ間違っていてもマンセーする □派遣先から「いつまでもここで仕事してくださいね(安い金でw)」と言われて嬉しい □自社で仕事なんてできるわけがない □派遣労働の問題点の話題が出ると感情剥き出しにして反論する □派遣労働の問題を指摘する人は嫌いだ □派遣先には仕事だけでなくプライベートについてもグイグイ引っ張って欲しい □奢ってくれる派遣先正社員を尊敬する □自分の月額金額を知らないのは当然だ、単金を聞いてはいけない □派遣先正社員より自分の生涯収入が低いのは当然だ □派遣先に尻尾を振り、いつまでも派遣を続けることが大切だ
937 :
デフォルトの名無しさん :2007/03/19(月) 17:19:12
VC2005,MFCでデフォルトのままUnicodeベースでビルドをしているのですが、 WritePrivateProfileString()で文字列を書き出すと、 INIファイルの中身がUnicodeになっていません。 Unicode専用の文字を入れると??になっています。 MSDNの記述ではWritePrivateProfileStringW()が呼ばれるはずなんですけど、 なにか設定が足りないのでしょうか?
WritePrivateProfileStringWなどはマルチバイト文字列と変換して読み書きする仕様だったはず。 A版で書いてW版で読んだりなんてことができるようにと聞いた覚えがある。
939 :
デフォルトの名無しさん :2007/03/19(月) 17:25:38
>>938 ということは、Unicode専用文字はINIファイルには記録できないということなのでしょうか?
エディットボックスで入力される文字をINIファイルで扱いたいのですが。
Unicodeでないとダメな理由があるの?
逆にWritePrivateProfileStringWでないとダメな理由があるの? 自分で読み書きすればいいだけ。
942 :
デフォルトの名無しさん :2007/03/19(月) 17:45:20
ダイアログで入力された情報をINIファイルに記録しておきたいんですが、 Unicodeアプリである以上、Unicode文字が入力されることもあるので、 それらの入力をINIファイルに保存できないのは痛いなと思いまして。 アプリ内で参照するファイル名とかにUnicodeを使われていたら、 それらのファイル名情報もINIファイルでは保存できないということ…?
WritePrivateProfileStructを使えばいいじゃないか。
>>938 のような動きをするということは.INIはデフォルトのANSIコードセットを使うというルールになってるんだろう。
どうしてもANSIコードセットに変換できないUNICODE文字を使いたいなら、
HEX文字列に変換して書き出すとか工夫がいりそうだね。
INIは古いレジストリ使えやゴラー
普通のアプリでレジストリ使うな、ApplicationSetting使えゴラー(いまここ)
ユーザーは振り回されて大変じゃのう。
レジストリはまだ推奨事項だろ。レジストリに書けないような大きな連中を どこに書くかって話でねーの。
違います。
デフォルトはwin.ini使う仕様だからそこにUnicode書かれたら困るし iniそのものが過去の互換性のためにあるんだろ
Application Settingsなんか.NETしか使えネーじゃん。 それとも何か、アンマネージだと「普通のアプリ」じゃネーとか言うのかこのスレで(w
>Application Settingsなんか.NETしか使えネーじゃん。 ( ゚Д゚)・・・
>Application Settingsなんか.NETしか使えネーじゃん。 ( ゚ω゚)・・・
何? RegOpenKeyEx RegQueryValueEx くらいのステップでApplication Settingsにさわれる Win32APIがあるってーの? まさかIXMLDOMを叩くなんて話じゃねーよな?
UTF-7で書きなさい。
アプリの設定なんてデータ交換に使うわけでもないんだから 好きなフォーマットにしる
954 :
デフォルトの名無しさん :2007/03/19(月) 20:55:19
つまり、Unicode対応アプリケーションでは INIファイルを使うなということになるんですかね。 でも、VC2005はデフォルトでUnicode設定になってるのに、 INIファイルにUnicode文字を書き込めないという書き込みが全然出てこないですね。 これらの組み合わせって、そこまで使われていないものなのでしょうか。
エクスプローラやコモンダイアログ(ファイル開くなど)で現在参照してるディレクトリを 変更させることってできますか?
>WritePrivateProfileString >注意 この関数は、16 ビット Windows ベースのアプリケーションとの互換性を保つ目的でのみ提供されています。 >Win32 ベースのアプリケーションでは、初期化情報をレジストリに格納してください。 MSDNにこう記述があるにもかかわらず、これだけいつまでも使われ続けているAPIも珍しい。 アプリやフォーム間でのデータの受け渡しまでこれ使ってる糞プログラムのメンテをやらされてるから欝だ。
まぁ実際のINIファイルの文字コードがどうなってるかは別として GetPrivateProfile〜系APIにもちゃんとUNICODE版があるわけだが
>>954 出来ないとか駄目だとか言う前に工夫をしてみるのも大事だと思うが。
APIがUnicode版だろうと、INIファイルの文字コードはANSI(MS-Kanji)固定だぜ。
URLエンコードとかBASE64とかISHとか好きな符号化方式で変換して格納すれば済むと思うが。
あ、ANSIの何が悪い!
APIの問題ではなく、ファイル仕様の問題、みたいですネ
962 :
デフォルトの名無しさん :2007/03/19(月) 21:40:53
Unicodeがらみの話で wprintfやwcoutを使ってコンソールに文字を出力すると、 結局ANSIコードに変換してしまうので、途中にUnicodeにしかない文字が入っていると、 その文字以降何も出力されなくなる。 WriteConsoleW以外にUnicode特有の文字をコンソールに出力する手段はないのかな?
>wcout localeは?ってWIN32APIじゃないな
>>962 無い。
でもBoost.Iostreamsで、ReadConsoleWを呼ぶストリームバッファを作って
wcoutの代わりにするのはいけると思う。
INIファイルをunicodeのBOM付きで予め作成しておくとよいかも? そうか、↓みたいにUTF-7 [.ShellClassInfo] IconFile=%USERPROFILE%\デスクトップ\FAQ\FAQ\faq.ico IconIndex=0 [.ShellClassInfo.A] IconFile=%USERPROFILE%\デスクトップ\FAQ\FAQ\faq.ico [.ShellClassInfo.W] IconFile=+ACU-USERPROFILE+ACUAXDDHMLkwrzDIMMMw1wBc-FAQ+AFw-FAQ+AFw-faq.ico
やっぱりシステムの根っこに書き込みを行うのは抵抗あるんだよなあ ディレクトリごと削除するだけでアンインストールが完全に終わるINIの方が好き
レジストリなんて設定ファイルに毛の生えたようなのが固まってるだけだよ。たぶん
自分でXMLパーサ書いてそれに記録させてる。 その程度作るのは大した手間じゃないし。
>>962 スレ違いだから詳しくはよそで聞いて欲しいが、VC8はロケール関連にバグがある。
>>964 うむやはりWriteConsoleWしかないですか、iostreamを書くのは俺の力量じゃ無理そうで
WriteConsoleラップした自家製printfでやっときます。
>>963 >>969 ローケルやVC2005のバグの件は了解しています。
これにかかるとUNICODE特有の文字だけでなく2バイト文字が全然でなくなりますから。
そろそろカチンときそうです。
ゲームプログラムで質問です。 StrechBltで2倍に拡大して描画するのと画像サイズを2倍にしてそのまま表示するのとではどちらのほうが描画が早いですか
やってみれ
>>973 こんなところでいつ着くともしれないレスを待つより、自分でやってみた方が
早いと思うよ。
>>972 98SEで試してみた所、UnicodeのINIファイルにANSIで追記された。
NT系でしか働かないのだろうな、その機能は。
Meだけ対応とかだったら嫌だな。
>>956 INIほどじゃないがGetVersion()もよく使う。
9x/NT系の判別をする場合、戻り値の最上位ビットを見ればすむから。
GetVersionEx()はその目的にはちょっとめんどくさい。
978 :
デフォルトの名無しさん :2007/03/20(火) 07:04:34
VC++についてるsignal.hにはなんでSIGKILLがないの? signalで9番に関数登録しようとしただけでエラーになるし。
?どっちにしろSIGKILLはキャッチできないじゃん。
981 :
954 :2007/03/20(火) 09:31:36
>>972 なるほどたしかにあらかじめエディタでUnicode形式でファイルを作成し、
それに対してWriteProfileしてみたところ、Unicodeのまま書き込めました。
>>976 のおっしゃる情報によると、NT系しか動かないようなので、
厳密にやろうとするとまた考えないといけないのでしょうけど、
今回のものは2000以降限定と言ってしまっても問題無いので、
そうなるとこれでも大丈夫ですよね。
みなさんありがとうございました。
コントロールを作っていて困ったことがあったので質問させて下さい。 WH_GETMESSAGEフックを使って親ウィンドウのメッセージを盗みたいと思ってます。 コントロールはクラス化していて、GetMsgProcでインスタンスへのポインタを使うために、 グローバルなCAtlMapを使って、dwThreadIdとthisを関連づけて保持しています。 またSetWindowsHookExの戻り値もクラスのメンバとして保持してます。 そしてGetMsgProcでは、 MSG *msg = (MSG*)lParam; CControl *pThis = g_hookMap[GetWindowThreadProcessId(msg->hwnd, NULL)]; このようにポインタを取得して、メッセージによって処理したり、CallNextHookExを呼び出したりしています。 ここで問題がありまして、msg->hwndにNULLが渡されることがあります。 (ちょっと調べた感じだとPostThreadMessageで渡されたメッセージでしょうか) このときはpThisを使ってフックプロシージャのハンドルを取得できないため、 CallNextHookExを呼び出すことができないので、仕方なくreturn 0;で処理を中断しています。 msg->hwndがNULLでもちゃんとフックプロシージャのハンドルを取得できる もっと上手いやり方がありましたらお教え下さい。
親ウィンドウをサブクラスかでは駄目なのか?
984 :
982 :2007/03/20(火) 21:10:27
>>983 サブクラス化も試してみました。
具体的にはWM_CLOSEを取得して確認ダイアログを出したいのですが、他のメッセージは取得できるのに
なぜかWM_CLOSEは取得できないまま終了してしまいました。
そこでフックを試してみたら上手く取得できたので、フックでやろうとしているのですが。。
GetMessageフックはフックを受け取るスレッドのコンテキストで動くから GetCurrentThreadId()でいいんじゃネーノ
> フックを受け取る もとい メッセージを受け取る
987 :
982 :2007/03/20(火) 22:44:15
>>985 ,986
おー!できるようになりました。ちゃんといろんなAPIを知っておかないとダメですね。
ありがとうございました!!
次すれまだぁぁあんあん
つか何度見ても2がおっかしー。 新しいのにはもうないけど。
/  ̄ ̄ '´ ̄ ̄ヽ、 ノ/. /二二二ヽヽ \ <V/, '/ 人 | ヽハ夊 、 | 〃 {_{`ヽ Vヽノリ| l >" i| ハ小l● ● レ|、 | | |│ l⊃ rー- ⊂⊃|ノ |│ /⌒ヽ.| .ヘ ヽ ノ jレ/⌒i ! \ /:::レ l>,、 __, イァ/ /ノ . /:::::/ / ヘ:::|三/::{ヘ、__∧ `ヽ< ヾ:∨:::/ヾ:::彡
_ /〜ヽ (。・-・)< うめてくだちゃい ゚し-J゚
梅
_ /〜ヽ (。・?・) ゚し-J゚
996 :
996 :2007/03/21(水) 19:45:04
自己解決しました。
>>996 にカチンときたので教えません。
バーカ!
どう見てもオナニープレイです 本当にお疲れ様でした
998 :
994 :2007/03/21(水) 19:56:26
ごめんなさい。 これぐらいしかできないのです・・・
999 :
994 :2007/03/21(水) 20:00:49
評判が悪ければ取り下げますです。
/ ⌒ヽ / \ ,.-‐''⌒ヽ ,.=、 ヽー、 ,〃/∠彡ニ\ (.fゃ) | j / ミ彡三ヘ`=´ | | / ミ彡三∧ j ./ ト ャ''" ミ彡三∧. // 」i _;''_, ミ彡'ニミヘ、 〃 リ ´ ̄ リ´ f'`ij }/「i| ヽ- '´/ソ'川|| ヽ一 「彡'川ll.||| T _ / ´ j||.川|| ` ̄了、 i! 川.川| _」. \ | j| 川|ト、 _/ ̄ \ \ '_/./川 `  ̄ `  ̄ ´ ネゴトワ・ネティエ[Negtva Netie] (ルーマニア.1935〜54)
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。