Win32API質問箱 Build29

このエントリーをはてなブックマークに追加
749デフォルトの名無しさん
Windows98やMEでCreateWindowExを使うとバグが出て
ウィンドウを2つ3つ作ったところでAPが落ちるらしい。
まあ素直にダイアログ作っとけってこった。
750デフォルトの名無しさん:2005/03/26(土) 22:09:14
すなおに 9x は捨てろってこった。
751デフォルトの名無しさん:2005/03/26(土) 22:15:37
>>749
詳細キボン
752デフォルトの名無しさん:2005/03/26(土) 22:17:26
そうだな、リソースなんて概念に縛られてるようじゃ今時やってられん
753デフォルトの名無しさん:2005/03/26(土) 22:26:20
>>751
どうしてもそれが必要になった事があってAPを
2000とXPでテストして客先に、提出したのよ。
(一応98とかは、サポート外だった)
そんでもって客の都合で、たまたまAPを98で動かしてみたら
落ちたって言うから、調べてみたらそいつが原因だったってわけ。
754デフォルトの名無しさん:2005/03/26(土) 22:39:40
>>753
CreateWindowExなんて良く使うAPIでバグがあるんならもっと話題になってもいいようなもんだが
ググっても見つからんし、信用できんな。
755デフォルトの名無しさん:2005/03/26(土) 22:59:07
>>753
そんな話は初めてだし普通にEx使って何の問題も出たことないよ。
別のところに問題あったのが偶然致命傷にならずに動いてて
最終的にExの部分で発現しただけでは?
756デフォルトの名無しさん:2005/03/26(土) 23:00:17
2000系では落ちないけど9x系では落ちる……。
十中八九、>749のアプリケーションのバグだな。

だから俺はMeが手放せない。些細なバグでも落ちてくれる。
757デフォルトの名無しさん:2005/03/26(土) 23:07:00
CreateWindowはCreateWindowExを呼び出すマクロだった気が
758デフォルトの名無しさん:2005/03/26(土) 23:10:27
マクロになってるね。
759デフォルトの名無しさん:2005/03/26(土) 23:19:46
>>723
EDITSTREAM の構造体の callback に ReadFile(), WriteFile() を普通は
書いていると思いますが、例えが、WriteFile() の代わりに、格納先のメモリ
に MoveMemory() して、メモリのポインタをそのバイト進めるという処理を
続ければ、メモリに書き出した内容が置かれます。(GlobalReAlloc() すれば
どんどん書けます)
rtf の仕様は、ヘルプで出てくるのを見た憶えがあります。
また、MSword があれば、拡張子を .rtf にして書き出せば、どんな風に出て
来るかわかるでしょう。同じ内容を .txt でも書き出せば、対比できます。
文字を着色するだけなら、色指定と文字の格納の方法だけわかれば、txt->rtf
は簡単なので、私はCのソースは、txt で読んで、rtf に変換して、画面へ
送りこんでいます。文字列が英字だけなら文字列はそのまま rtf に置かれます。
760720:2005/03/26(土) 23:42:11
>>693, >>721
(続き)
アイコン・データの所在を例示すると、一般的なものは、Shell32.dll に多くあります。
今、win98 で見たら、大小 342 個(RT_ICON ベース)ありました。
RT_GROUPE_ICON が ico ファイルに対応していて、この中に要素のアイコンを示す index
があり、RT_ICON を参照するようになっています。
.bmp ファイルのアイコンは、ペイントにあり、MSword のは MSword, Excel のは
Excel にあります。以下同様。
で、.exe, .dll の中を見るには resource editor があれば容易だと思いますが、
VC++ のサンプルの PeFile にアクセス方法が載っています。MSN には、今や PeFile
はないようですが。
.ico ファイルに復元する個数が少ないなら、個々のアイコンの DIB には、
相対アドレスを参照する値はないので、バイナリ・エディタで、hex を切り出して、
自分で hex 編集して、バイナリに戻せば、.ico ファイルにできないことはないで
しょう。
(しかし、決まりきったアイコンを使うだけなら、ExtractIconEx(),
ExtractAssociatedIcon() などの API を使うのが、早道です。)
761デフォルトの名無しさん:2005/03/27(日) 00:13:50
>>745
SetLastError(0xffffffff);
CreateWindowEx(〜);
GetLastError();とすると失敗するときはffffffff、成功するときには57が常に表示されます。
(その0x57をFomatMessageに通すと「パラメータが正しくありません。」となります)

ちなみにCreateWindowExに渡すインスタンスハンドルをEXEのものからDLLのモジュールハンドルに変えたらこれでも成功しました。
ただ、これだったらDLL内でGetModuleHandle(NULL);する方にします。
DLL内のクラスにはDLLのインスタンスハンドルを指定しろとMSDNには書いてあるのが気がかりですが。
762720:2005/03/27(日) 00:32:03
>>760
忘れたので。
Shell32.dll は Windows フォルダにあるままでは、使用中で読めないことが
あるので、コピーを作って、開きます。
763デフォルトの名無しさん:2005/03/27(日) 00:32:03
嫌ならwindows使うな
764デフォルトの名無しさん:2005/03/27(日) 00:32:18
>>761
C Magazineの2004年12月号 125ページをみるべし
765デフォルトの名無しさん:2005/03/27(日) 00:37:05
>>761
ウィンドウクラスは、インスタンスハンドルとクラス名で特定される
ということを知ってるか?
766デフォルトの名無しさん:2005/03/27(日) 02:34:27
>761
CreateWindowEx()をいつ呼んでいるのかが気になるのだが…
767デフォルトの名無しさん:2005/03/27(日) 03:52:07
>>761
RegisterClassに渡すインスタンスは、プロシージャのアドレスを解決するためのものだから
DLLにプロシージャを書いてるならDLLのインスタンスハンドルを渡すべし。

CreateWindowは実際に動いているプログラムのインスタンスを渡すべし。
Win32のコントロールとかDLLに入っててもCreateWindowにはプログラムのインスタンスを
渡してるでしょ、それと同じ。
要するにGetModuleHandle(NULL)だなー。
768デフォルトの名無しさん:2005/03/27(日) 06:53:59
漏れの古いプロジェクト見るとWinNT/2000/XP系用と
Win98/Me系用でReleaseが分かれていた。
あたりまえといえばそうなんだが、確かソースは同じで
コンパイルオプションかリンクオプションか何か変えないと
Win98/Me系でCreateWindowExがまともに動かんかったと記憶してる。
769デフォルトの名無しさん:2005/03/27(日) 07:09:41
>>768
自分の管理してるソースだろがw
知らない間に妖精さんが書いたとか言うなよ。

CreateWindowExそのものじゃなくて、顧問コントロールを使うときの
マクロ切り替えだったんじゃないの?
今、思いつくだけでもバルーンチップ。
770デフォルトの名無しさん:2005/03/27(日) 08:54:02
>>767
> RegisterClassに渡すインスタンスは、プロシージャのアドレスを解決するためのものだから
> DLLにプロシージャを書いてるならDLLのインスタンスハンドルを渡すべし。

コレマジっすか?
771デフォルトの名無しさん:2005/03/27(日) 09:45:48
>>770
ウソ。サブクラスするときにはインスタンスハンドルを渡さないだろ。

EXEとDLL、あるいは複数のDLLが同一のクラス名でRegisterWindow()
したときに(一般にそれらの作り手は別であるので、名前が被る可能性は
十分にある)、CreateWindow()で目的のクラスを確実に指定するには、
クラス名だけでなくインスタンス固有の値も一緒に指定する必要がある。
逆にいうと、インスタンスハンドルにはクラスを特定するための意味しかない。
実際、インスタンスとして無効な値を渡しても動くしな。
772デフォルトの名無しさん:2005/03/27(日) 10:07:17
>>771
NT系ならCreateWindowのインスタンスハンドルは無視すると書いてある。
773デフォルトの名無しさん:2005/03/27(日) 11:50:15
>>769
いや、妖精ではないが、何年も前のものなのでもう忘れた。
昨日の自分は明日の他人だ。
774デフォルトの名無しさん:2005/03/27(日) 12:48:38
DLLをロード/アンロード/ロードしたりすると、
インスタンスハンドル変わる時があるから、
偶発的なバグになって苦労するよ
775デフォルトの名無しさん:2005/03/27(日) 12:52:58
>>772
どこに?
776デフォルトの名無しさん:2005/03/27(日) 12:56:24
人に聞く前にMSDNぐらい見ようぜ。
777デフォルトの名無しさん:2005/03/27(日) 13:48:47
>>776
すまん、古いのを見てた。
MSDNもわざわざ間違いを追記することないのにな。
778デフォルトの名無しさん:2005/03/27(日) 13:50:57
MSDN見る前に人に聞こうぜ。そのほうが早いよ。
779デフォルトの名無しさん:2005/03/27(日) 14:39:39
人に聞くまえにMSDN見ようぜ。そのほうが早いよ。
780714:2005/03/27(日) 14:42:48
>>759
thx.
コールバック関数にくるのはReadFile特注のデータじゃないのね。少しわかってきた。

RTF先頭の
{\rtf1\ansi\ansicpg932\deff0\deflang1033\deflangfe1041{\fonttbl{\f0\fswiss\fprq2\fcharset0 Tahoma;}}
とかいうヘッダみたいなのはそのまま使えばいいものなのかな?
781714:2005/03/27(日) 15:41:07
http://www.users.gr.jp/ml/archive/viewer.aspx?name=vb&no=1848
↑ここに書いてあることって正しいよね?日本語はエスケープしたほうがいいと思うけど
782デフォルトの名無しさん:2005/03/27(日) 15:44:25
コンソールアプリでタイマを使いたい場合は、どの関数を用いればいいのでしょうか。
ある処理を一定の間隔で繰り返すようなプログラムを作りたいのですが・・・
783デフォルトの名無しさん:2005/03/27(日) 15:51:53
>>773
今日はどっち?
784デフォルトの名無しさん:2005/03/27(日) 15:54:21
>>782
コンソールアプリでって言うのはメッセージループもなし?だとしたら
タイマは使えないよ、WM_TIMERを処理できないわけだから。
785デフォルトの名無しさん:2005/03/27(日) 15:55:08
SetTimerでHWNDにNULLを指定してlpTimerFuncに特定のコールバック関数を指定したら
ウィンドウやWM_TIMERの受け皿がなくてもできるかもしれない。
と思ったけどMSDNに「WM_TIMER メッセージを処理する代わりに TimerProc 関数を使う場合も、呼び出し側スレッド内でメッセージをディスパッチ(転送)する必要があります。」
って書いてあるから多分無理。。。
786デフォルトの名無しさん:2005/03/27(日) 16:00:08
マルチメディアタイマなら使えるんじゃない?
787デフォルトの名無しさん:2005/03/27(日) 16:20:33
>>786
ありがとうございます。
これってコンソールから割と簡単に使えるものなんでしょうか。
Windowsのプログラミングにあまり詳しくないもので・・・
あまり実用例がないものならGUIに乗っけてつくろうかなと思います。
788デフォルトの名無しさん:2005/03/27(日) 16:47:47
GUIアプリとしてスケルトンを作って、AllocConsoleでコンソールを開き、メインウィンドウを
不可視にしたうえでWM_TIMERを受け取るとか。
789デフォルトの名無しさん:2005/03/27(日) 17:04:39
別に
while(1){
func();
Sleep(1);
}
みたいにすれば良いと思うが。
790デフォルトの名無しさん:2005/03/27(日) 17:09:37
>>788
なんか複雑そうですが、
timeGetTime()というのがコンソールから使えそうなので、これにしようと思います。
あとついでなのですが、コンソールではSleep関数は使えるのでしょうか。
コンソールってWindows上ではスレッドで動いてるのかな?
どうもWindowsは単純プログラマではわからんことが多い・・・
791デフォルトの名無しさん:2005/03/27(日) 17:11:52
>>790
スレッドで動いてるって何だろう…何も特別なことをしなければ
シングルスレッドで動いてるよ。もちろんマルチスレッドにも出来る。
コンソールアプリだろうとGUIアプリだろうと同じ。
792デフォルトの名無しさん:2005/03/27(日) 17:11:53
>>789
それも使う予定ですが、どうしても相対時間を測りたい部分があるので。
793デフォルトの名無しさん:2005/03/27(日) 17:23:45
>>791
シングルスレッドというのは、windowsの他のプログラム(例えばWORDとか)と
基本的に同じってことでしょうか。
Windowsにしろ処理の流れは一本だから、どっかで無限ループなどに陥ったら
全体がとまってしまうのではないかと心配なんですけど。
794デフォルトの名無しさん:2005/03/27(日) 17:26:56
マルチプロセス
795デフォルトの名無しさん:2005/03/27(日) 17:28:19
MSWORDはマルチスレッドだが
796デフォルトの名無しさん:2005/03/27(日) 17:40:12
DLLのプログラミングで自分自身のパスを知るにはどうしたら良いですか?
797デフォルトの名無しさん:2005/03/27(日) 17:48:32
>>796
DllMain() に渡されるインスタンス ハンドルを、
GetModuleFileName() に指定する。
798デフォルトの名無しさん:2005/03/27(日) 17:51:15
>>796
DllMainに渡されるモジュールハンドルをGetModuleFileNameでいいんじゃね?
DllMainって自分で書く機会ってあんまりないよね。
799798:2005/03/27(日) 17:51:56
>>797
ケコーン
800796:2005/03/27(日) 18:01:28
>>797-799
謝謝
801759:2005/03/27(日) 18:36:01
>>780-781
何年も前にやったので、細部はよく憶えていないけど、いいみたい。
漢字(shift-JIS)は、自分は下記の format で、1バイト目、2バイト目を書き出している。
"\\\'%02x\\\'%02x"  // 結果は、\'xx\'yy という形なる。

細かいことですが、unicode の漢字で、第1バイトと第2バイトとか逆転しているケースとか
あるようだけど、対応してません。(ソースを見たら、コメントに書いてあった)
802デフォルトの名無しさん:2005/03/27(日) 19:19:46
HRESULTとLRESULTの違いってなんですか?
803デフォルトの名無しさん:2005/03/27(日) 19:22:51
さあね
804デフォルトの名無しさん:2005/03/27(日) 19:35:21
>>802
http://msdn.microsoft.com/library/en-us/winprog/winprog/windows_data_types.asp
HRESULTはCOM関数・インターフェイスの戻り値に使われる使われるLONGからのtypedef
LRESULTはメッセージの戻り値に使われるLONG_PTRからのtypedef
805デフォルトの名無しさん:2005/03/27(日) 20:13:06
HRESULTはビットごとに意味があるよ
806714:2005/03/27(日) 20:19:49
>>801
日本語はそのエスケープであってるんだ。安心。
というわけでワードパッドで出力したファイルと照らし合わせて研究中。
いろいろありがとう。
807デフォルトの名無しさん:2005/03/27(日) 20:52:23
>804-805
レスありがとうございます
MSDNライブラリってこういうのも載ってるんですね
日本語のページ見難くて見つけられなかった;
808デフォルトの名無しさん:2005/03/27(日) 21:07:33
>>807
日本語のページが見づらいのと英語のページで見つけられないってのは別物だぞ
809デフォルトの名無しさん:2005/03/27(日) 23:22:34
俺だと日本語のページは見づらい以前に文字化けして読めない……。
どうしても英語のほうを読むしかない
810デフォルトの名無しさん:2005/03/28(月) 00:15:05
encode
811デフォルトの名無しさん:2005/03/28(月) 02:08:48
>>783
今日の自分は、
1)過去の自分が他人に見える
2)未来の自分からみると他人に見られる存在
っていう意味だろ?
812809:2005/03/28(月) 03:59:44
>>810
いや、エンコードは一通り試したつもりなんだ。
参考までに、他の人が正常に見れる場合の文字コードを教えてくれ
813デフォルトの名無しさん:2005/03/28(月) 08:05:20
ただのShift JISだがもしかしてIEでしか見れないようにしているとかの罠があるんじゃないか?
814デフォルトの名無しさん:2005/03/28(月) 09:25:03
便乗すると、漏れの場合は文字化けというか、左側のフレーム内が意味不明になります。
こんな感じ。これが普通?

□MSDN ?????
□????????
□???? ??? Embeaded ??
□.NET ??

米国サイトなら普通に読めるんだけどね。
815デフォルトの名無しさん:2005/03/28(月) 09:28:18
IEの言語設定は?
816814:2005/03/28(月) 09:45:59
日本語(自動設定)またはShift-JISです。
IEとFirefoxでエンコードをあれこれ試したけど、
右側部分はS-JISでないと文字化けするし、左側は設定に関係なく読めないみたいです。
817デフォルトの名無しさん:2005/03/28(月) 09:49:43
IEのバージョンは?
IE6ならWin98でも読めたがIE4だと化けるねー。
818814:2005/03/28(月) 09:58:48
OSはWin-XPで、IEは6.0.2900.2180.xpsp_sp2.rtm...なのにorz
米国サイトじゃないと出てこない情報もあるみたいだし、日本語版はあきらめました。
819デフォルトの名無しさん:2005/03/28(月) 10:12:41
自動選択のチェックを外して、Shift_JISにするとどうなる?
IEの自動設定はバグだらけなので、自社サイトも読めない可能性がある。
820デフォルトの名無しさん:2005/03/28(月) 10:12:51
「フォントキャッシュの破損」なんかじゃないよね?
821デフォルトの名無しさん:2005/03/28(月) 10:13:31
バグだらけという表現は適切ではないか。とにかく挙動はおかしい。
822デフォルトの名無しさん:2005/03/28(月) 10:15:54
再インスコ
823デフォルトの名無しさん:2005/03/28(月) 10:19:30
自分の作ってたプログラムで、CreateWindow の hinstance を指定する部分で、NULL を
指定していたことに今日気付きました。けど、普通に動いていました。
もし、NULL にしていたままだとして、どんなバグが出ると予想できますか?
よろしければ、ご教授ください。
824デフォルトの名無しさん:2005/03/28(月) 10:39:41
hInstanceの部分は2000/XPでは無視されたはず。
9xで不具合が出るかも知れんけど具体的には知らん。
825デフォルトの名無しさん:2005/03/28(月) 10:49:11
なるほど、確かに自分は Windows2000 を使っております。
はじめて知りました。ありがとうございました!
826デフォルトの名無しさん:2005/03/28(月) 11:35:07
リッチエディットにC++のstd::stringに入っているRTFを読ませようとして
コールバック関数を組もうとしたんだけど、
具体的にどうしたらいいのかわからない(テキストの末尾に来たときの*pcbの処理とか、string.substr()とか)
んで、誰かわかる人いない?
827デフォルトの名無しさん:2005/03/28(月) 11:36:39
いる
828デフォルトの名無しさん:2005/03/28(月) 11:38:42
>>814
俺も。
Firefoxで見られない。
829デフォルトの名無しさん:2005/03/28(月) 17:29:57
bmpファイルの特定の範囲を読みこむ関数ってありますか?
LoadImageで読みこんだイメージの特定の範囲をコピーでもいいんですが
830デフォルトの名無しさん:2005/03/28(月) 18:21:17
複写の BitBlt(), 表示の SetDIBitsToDevice(), StretchBIBits() には
部分の指定が可能だが、読むときに一発てのはないんじゃない?
bitmap data のところを、ま、1行ずつ読んで、対象外のところは読み飛ばす
とか出来るが。
831デフォルトの名無しさん:2005/03/28(月) 18:28:25
>>829
ない。
832829:2005/03/28(月) 19:07:23
あいうえお
かきくけこ

↑こういうBMPファイルから「あ」とか「く」を取り出して表示したかったんですが
こういうのはどうやってるんですか?
833デフォルトの名無しさん:2005/03/28(月) 19:16:32
LoadImageしたHBITMAPをCompatibleDCにSelectDCして、
BitBltすれば解決とかそう言う話?
834デフォルトの名無しさん:2005/03/28(月) 19:21:20
>>832
メモリデバイスコンテキストはわかりますか?
835デフォルトの名無しさん:2005/03/28(月) 19:25:27
BMPファイルなんて単純な形式だから、
ファイルフォーマット調べて書き出せばいいんでない?
2時間もあれは出来ると思うけど。
836デフォルトの名無しさん:2005/03/28(月) 20:09:24
>>833をやった方がはやい
837デフォルトの名無しさん:2005/03/28(月) 21:14:27
質問です。DeleteObject(NULL)は安全ですか?
838デフォルトの名無しさん:2005/03/28(月) 21:26:11
>>837

ヘルプ見ると

戻り値
 関数が正常に終了した場合は、 TRUEを返します。
 指定されたハンドルが有効でない場合や現在デバイス コンテキストに選択されている場合は、 FALSEを返します。

とあるが、はて
839デフォルトの名無しさん:2005/03/28(月) 21:27:32
>>837
ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/devcons_1vsk.asp

NULLについて書かれてないし、MFCのソース見てもNULLチェックしてるから
やらないほうが無難だと思う。
840デフォルトの名無しさん:2005/03/28(月) 21:30:17
GetFileSizeで4Gバイト以上のファイルサイズを取得したいのですが、
なぜか下位DWORDが1バイト多く返ってきます。
この場合、どこが問題なのか教えてください。
841840:2005/03/28(月) 21:40:24
なんか、WinXPProSP2でファイルのプロパティを見ても1バイト多いです……
842デフォルトの名無しさん:2005/03/28(月) 21:43:51
>834
CreateCompatibleDCでメモリに描画したりはなんとかできます

あい
かき

というBMPファイルを読みこんでBitBltで描画しようとすると
「き」だけ描画することはできるんですが


き  とか  「かき」 見たいになって 「あ、い、か」だけ描画することが出来ません;

BitBlt(コピー先のデバイス、コピー先で描画したい座標X、同上Y、コピー先の幅、コピー先の高さ、コピー元のデバイス、
       コピー元のx?、コピー元のy?、オプション)までは理解しているんですが?の部分がよくわかりません
x、yで点を指定してそこからコピー元の画像をコピーするみたいなんですが
これで「あ、い、か」は抽出できますか?
読みづらくてすみません;
843840:2005/03/28(月) 21:47:05
すみません、プログラム以前のイージーミスでした。忘れてください。
844デフォルトの名無しさん:2005/03/28(月) 21:48:42
何でわざわざコピー元座標引数を無視するんだよ。
845デフォルトの名無しさん:2005/03/28(月) 21:59:14
「あ」 の左上座標と縦横サイズがわかれば「あ」だけコピーできるでしょ
846デフォルトの名無しさん:2005/03/28(月) 22:00:33
コピー元の座標引数って上記のコピー元のx?、コピー元のy?
以外にあるんですか?
847デフォルトの名無しさん:2005/03/28(月) 22:04:02
複数回BitBltを実行するという発想がないような予感
848デフォルトの名無しさん:2005/03/28(月) 22:06:08
FAQでしょうが教えてください。

今までFreeBSDやCygwinでプログラムを作ってきたのですが
Windows NativeのGUIアプリケーションを作りたくなったので
(TkをインストールしてとかJavaをインストールしてとかは説明がめんどい)
Win32APIを入門しようかと思いました。

んで、
http://wisdom.sakura.ne.jp/system/winapi/win32/index.html
を読んでいるのですが
http://wisdom.sakura.ne.jp/system/winapi/win32/win2.html
の目的プログラムの作成でWin32 Applicationを選ぶとあるのですが
うちのVisualC++.Netにはありません。
Win32プロジェクトを選ぶといろいろ記述されたファイルが作成されてしまいます。

できるだけ素の状態からはじめたいのですがどのようにすればよいでしょうか ?

もっと言うとMeadowやxyzzyでソースを書いて、gccでコンパイルみたいな感じで
使いたいです。

ぐぐったのですがいい検索キーワードが思いつきません。
教えてください。
849デフォルトの名無しさん:2005/03/28(月) 22:08:30
>>848
Meadowやxyzzyでソースを書いて、clでコンパイルすれば解決。
850デフォルトの名無しさん:2005/03/28(月) 22:23:11
>>848
「空のプロジェクト」って選んでる?
851デフォルトの名無しさん:2005/03/28(月) 22:28:31
>>848
何がやりたいのかいまいちよくわかりませんが。
VisualC++6.0とVisualC++.Netでは最初の選択画面が少し違うからそのせいで戸惑っているのかな?と思います。

メニューの
[ファイル] -> [新規作成] -> [プロジェクト]を選択
作るプロジェクトを択するダイアログがでるのでその左側から
[VisualC++ プロジェクト]のフォルダを開くと
Win32コンソールプロジェクト
Win32プロジェクト
がでるのでWin32プロジェクト選んで後は適当に。

IDE使いたくないならnmake.exeってのがあるので適当にMakefile書いてガンガレ
852デフォルトの名無しさん:2005/03/28(月) 22:30:56
>847
あーそういう発想は無かったです;
だめだ私orz
853851:2005/03/28(月) 22:31:40
ああ、
>>851
でWin32プロジェクト 選んだ後さらにダイアログが出る。
その左側の[アプリケーションの設定]っての選ぶと初期設定みたいのが選べるので
[空のプロジェクト]とかにチェックつけるとIDE用のプロジェクトやらソリューションだけの状態で
ソースは一切無しの状態になるっぽ
854デフォルトの名無しさん:2005/03/28(月) 22:48:20
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで
855848:2005/03/28(月) 22:55:06
みなさんありがとうございます。
空のプロジェクトを作ることが出来ました。

ですが、windows.hをインクルードするWinMainを使うサンプルが
コンパイルできません。


とりあえずIDE ? の作ってくれる雛型を土台にいろいろいじっていこうと思います。

重ね重ねありがとうございました。
856デフォルトの名無しさん:2005/03/28(月) 23:19:46
>>855
main()を使うようにコンパイルされてるんじゃない?
ならばコンパイラの設定や引数で指定してみれ。
857デフォルトの名無しさん:2005/03/29(火) 00:00:12
>>824
無視されないって言ってんべ。
858デフォルトの名無しさん:2005/03/29(火) 00:35:04
LoadIcon関数は将来サポートされなくなる可能性があるので
LoadImage関数を使うほうがいいと「猫」に書いてあったのですが本当ですか?
859デフォルトの名無しさん:2005/03/29(火) 00:38:31
>>858
MSDNを見ろ
860デフォルトの名無しさん:2005/03/29(火) 00:43:44
>>859
ゴメン
861デフォルトの名無しさん:2005/03/29(火) 02:03:44
ディスプレイが32bitカラーモードのときに
32bitアイコンに含まれる16色や256色のアイコンを選んで
描画する方法を知りませんか?
862デフォルトの名無しさん:2005/03/29(火) 02:17:59
知ってます
863デフォルトの名無しさん:2005/03/29(火) 02:22:27
>>861
僕はそのやり方を知らないけど、質問する時は念のために、
「もし知っているならそのやり方を教えてください」も追加した方がいい。
864861:2005/03/29(火) 02:40:48
>>863
いえ、私は皆さんが方法を知っているかどうかを知りたかったのです。
865861:2005/03/29(火) 03:04:47
864は偽者です。
>>863
忠告ありがとうございます。

866デフォルトの名無しさん:2005/03/29(火) 03:27:38
>>865
それで終わりかいっ!
実現方法は聞かないのかよw
867デフォルトの名無しさん:2005/03/29(火) 03:28:44
ごめん、wと!は逆の方がしっくりくるので脳内変換よろ
868861:2005/03/29(火) 03:57:21
>>866
いや揚げ足を取られやすい質問の仕方だっただけで
こちらの意図は伝わってると思ったので…

ちなみに32bitアイコンのリソースを直接読みこんで
つまりアイコンファイルのフォーマットを解析して
ビットマップ情報から表示みたいな方法ではなく
もっとスマートな描画方法があるのなら教えてほしいのです。
869デフォルトの名無しさん:2005/03/29(火) 04:05:33
870デフォルトの名無しさん:2005/03/29(火) 07:49:08
>>868
explorer のような tree view でファイルを表示するのを、自分もやっていて
最近知ったのですが、tree view に付ける ImageList の生成のときに 16x16 に
するか、32x32 にするか、指定できますね。32x32 にすると tree view の行の
高さは高くなります。color depth も指定できます。
普通は、4 bit color のを使うか、8 bit color のを使うかは、モニタの指定に
従い、判別されるようです。該当するものがないときは、近いものが選ばれたり、
他のものから生成されるようです(ぼやけた絵になりますが)。
HICON を作るときや DrawIconEx() でも、サイズは指定しますが、depth は書く
必要がないのは、OS に任せろと言っているのか、サイズとdepthは、略リンクして
いるので、それに従うということではないかと想像しています。
古い MSDN サンプルに aniEdit, imagedit というのがあり、これ以降、新しい
資料がなさそうなので、ご覧になるといいかと思います。
871デフォルトの名無しさん:2005/03/29(火) 13:33:15
DefaltGateway,DNSServerを取得できる関数ってないですか?
IPアドレスとサブネットマスク、MACアドレスなどは取得できる関数はあったのですが。
872デフォルトの名無しさん:2005/03/29(火) 14:43:31
Win32_NetworkAdapterConfigurationクラスにあったような・・・
873デフォルトの名無しさん:2005/03/29(火) 17:55:07
>>871
GetAdaptersInfo
874861:2005/03/29(火) 18:43:12
>>870
貴重なサンプルについて教えて頂いてありがとうございます。
仰る通り、何ビットのアイコンをロードするかはOSが判断しているようです。
MSDN で LookupIconIdFromDirectory の解説を見ると、
LoadIcon も LoadImage も現在の表示デバイスに合ったものを検索するとあります。

で、調べていて気がついたのですが、LoadImage のオプションで LR_VGACOLOR フラグを立てれば
16色に指定することだけはできるようです。でもその他の色数は指定できません。
結局、リソースから直接読み出す方法を試していたところ、以外と簡単にできてしまいました。
FindResource, LoadResource, LockResource, CreateIconFromResourceEx を使用する方法で
>>722 のリンク先に完全なサンプルがあります。
875デフォルトの名無しさん:2005/03/29(火) 22:31:38
DrawTextは、char型のポインタを指定しますが、
wchar_t(ワイド文字)に対応した文字列描画関数はありますか?

無いとしたら、ワイド文字をマルチバイト文字へ変換させてから描画しないといけないのでしょうか?

よろしくお願いいたします。
876デフォルトの名無しさん:2005/03/29(火) 22:37:40
>>875
MSDNより。

int DrawText(
HDC hDC, // handle to DC
LPCTSTR lpString, // text to draw
int nCount, // text length
LPRECT lpRect, // formatting dimensions
UINT uFormat // text-drawing options
);

LPCTSTR だが…?
877875:2005/03/29(火) 22:43:19
>>876

「error C2664: 'DrawTextA' : 2 番目の引数を 'wchar_t *' から 'LPCSTR' に変換できません。」
LPCSTRとなってしまいます。

ソースコードでは、
::DrawText(m_hDC,pString,length,pRect,uFormat);
とDrawTextと指定してるんですが。。。
DrawTextA?
878デフォルトの名無しさん:2005/03/29(火) 22:48:26
#define UNICODE もしくは #define _UNICODE
直接wchar_t版使いたいなら、DrawTextWを呼べ。
879デフォルトの名無しさん:2005/03/30(水) 01:55:03
すみませんお聞きしたいのですが
HBITMAPを開放するのでDeleteObjectを読んでたのですが
MSDNによると

戻り値
・指定したハンドルが有効でない場合、またはデバイスコンテキストでそのオブジェクトが選択されている場合は、0 が返ります。

解説
・デバイスコンテキストで選択されている描画オブジェクト(ペンまたはブラシ)は削除しないでください。

とありますが、SelectObjectで選択されていても0以外の値を返すのですがHBITMAPの場合問題無いのでしょうか?
880デフォルトの名無しさん:2005/03/30(水) 02:11:57
普通は使い終わったらSelectObjectで選択解除してからDeleteObjectする
おそらくWindowsプログラミングの常識じゃないか?
SelectObjectしたまんま開放なんてありえない。
881デフォルトの名無しさん:2005/03/30(水) 02:27:33
>>877

// winuser.h

int DrawTextA(HDC hDC, LPCSTR lpString, int nCount, LPRECT lpRect, UINT uFormat);

int DrawTextW(HDC hDC, LPCWSTR lpString, int nCount, LPRECT lpRect, UINT uFormat);

#ifdef UNICODE
#define DrawText DrawTextW
#else
#define DrawText DrawTextA
#endif
882デフォルトの名無しさん:2005/03/30(水) 05:29:10
DDBビットマップの、透過表示に使う、マスク画像の作り方についての質問です。
今は、GetPixelで色を調べながら、SetPixelで描画みたいにしているのですが、
BitBltのラスタオペレーションの組み合わせで、うまい事出来ないでしょうか。
出来るなら、やり方を教えてください。
883デフォルトの名無しさん:2005/03/30(水) 09:09:58
プロセス間で、共有メモリを使ってBSTR型の文字列をやり取りする方法ないでしょうか?
文字列のサイズを気にせずにプロセス間で受け渡ししたいのですが・・・
やり方まで教えていただけると嬉しいです
884デフォルトの名無しさん:2005/03/30(水) 11:42:25
>>883
「やり取り」というものの詳細がいまひとつわからんが
メモリマップトファイルとかは調べた?
885デフォルトの名無しさん:2005/03/30(水) 12:02:57
886デフォルトの名無しさん:2005/03/30(水) 12:48:21
>>883
ウィンドウ間ならWM_COPYDATAで楽に出来る。
887デフォルトの名無しさん:2005/03/30(水) 13:01:06
>>883
ひょっとしたらWM_SETTEXTだけでOKだったりして
888デフォルトの名無しさん:2005/03/30(水) 13:06:51
888 そう鴨
889882:2005/03/30(水) 13:55:39
>>885
出来ました。ありがとうございました。
890883:2005/03/30(水) 14:31:56
>>884
すみません。
もうちょっと詳しく状況書かないといけませんでしたね。。
「やり取り」というのは、共有メモリを使って他プロセスにBSTR型の文字列を渡したり受け取ったりしたい、という意味です。
今まで、CreateFileMappingとMapViewOfFile使ってchar*で文字列の受け渡ししてました。
これをBSTRでやりたい・・という魂胆です
とりあえず、BSTRのポインタだけ渡すのは明らかにダメだったので、実体全部を・・などと考えているんですが・・
ここでのプロセスで動かしてるのは両方コンソールアプリ型のWin32サービスです。

いい方法ないでしょうか。。

>>886
>>887
即レスありがとうございます。説明不足でした。
コンソール型のWin32サービスなので、ウィンドウメッセージは×なのです。
すみません。
891デフォルトの名無しさん:2005/03/30(水) 14:39:07
BSTRサーバーでも作れば?
892デフォルトの名無しさん:2005/03/30(水) 15:11:08
>>890
えーと、FileMappingではいけない理由は?
893デフォルトの名無しさん:2005/03/30(水) 15:13:25
#include "stdafx.h"
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
static char* moji;
// TODO: この位置にコードを記述してください。
for(int i=0; i<10; i++)
{
wsprintf(moji,"ループ%d回目です。",i+1);
MessageBox(NULL,mojip,"ループ",MB_OK);
}

return 0;
}

wsprintfを使用してループ回数を毎度表示するプログラムを組みたいのですが、コンパイルは通るもののこれを実行するとエラーで終了させられてしまいます。
char配列にすれば問題なく作動するのですがstatic char*で動かすにはどうすればよいのでしょうか。
894893:2005/03/30(水) 15:14:55
書き忘れました、static char*にかぎらずchar*のように配列ではなくポインタを使用したいのです。
よろしくおねがいします。
895デフォルトの名無しさん:2005/03/30(水) 15:15:14
>>893
メモリを確保しろ

というか、Cの基礎をやり直して来い
896デフォルトの名無しさん:2005/03/30(水) 15:16:17
×:MessageBox(NULL,mojip,"ループ",MB_OK);
○:MessageBox(NULL,moji,"ループ",MB_OK);
です。何度もスミマセン。
897デフォルトの名無しさん:2005/03/30(水) 16:16:51
>>893
たぶん君の頭だとVB使ったほうがいいよ。
898デフォルトの名無しさん:2005/03/30(水) 16:23:19
>>894
ポインタがなにも指してないからダメですよ

static char* moji = "ほげほげ";

とかやるとか、ちゃんと実体のあるものを指すようにしましょう
899デフォルトの名無しさん:2005/03/30(水) 16:28:51
>>898
説明できないなら出てくるなよ
900デフォルトの名無しさん:2005/03/30(水) 16:31:47
ポインタとか話すのは素人、値とか参照、名前といえれば高級言語の
エキスパートといえる
901デフォルトの名無しさん:2005/03/30(水) 16:34:34
LPSTRやらHANDLEやら、Win32で定義されてるのは沢山あると思うんですが、
それの内容一覧とかありませんか?
902デフォルトの名無しさん:2005/03/30(水) 16:35:47
>>901
PlatformSDKのヘッダーファイル
903デフォルトの名無しさん:2005/03/30(水) 16:38:34
>>902
どうもありがとうございました。。
904デフォルトの名無しさん:2005/03/30(水) 16:40:51
>>902
すいません、PlatformSDKのヘッダーファイルってwinbase.hとかですか?
905デフォルトの名無しさん:2005/03/30(水) 16:42:10
>>904
正解
906デフォルトの名無しさん:2005/03/30(水) 16:43:10
907デフォルトの名無しさん:2005/03/30(水) 16:50:45
>>893
char* moji;

moji = (char*)malloc(256);
:
wsprintf(moji,"ループ%d回目です。",i+1);
MessageBox(NULL, moji ,"ループ",MB_OK);
:
free(moji);

908890:2005/03/30(水) 17:04:26
883です。
>>891
BSTRサーバ!!
なるほど。確かにこれなら・・。
こういう選択肢もあるんですね!
共有メモリに固執するあまり、考えてもいませんでした。
選択肢の1つとして、検討してみます。
ありがとうございます!

>>892
すみません、FileMappingにこだわる理由、書いてませんでしたね。。
依頼主からの要望なんです。
「なんとか共有メモリ使ってBSTRを渡すようにできないか」、と。

できない理由はいろいろ試してみていくつか挙がってきてるのですが、
それを解決する方法がどこかにあるんじゃないか・・と。
909デフォルトの名無しさん:2005/03/30(水) 17:08:54
すみません質問させてください。
シフトを5回連続で押した際に発生する固定キー機能の
ダイアログを出ないようにしたいために以下のようなコードを書いたのですが
動作時に、「無効になったはずです。」のメッセージは出せるのですが
その後にシフトを5回連続で押すと、やっぱりダイアログがでてしまいます。
これで良さそうな気がするのですが、何か見落としでもあるのでしょうか?
何かありましたら、宜しくお願いします。
910909:2005/03/30(水) 17:11:42
STICKYKEYS StickKeys;

//STICKKEYS 構造体の初期化
StickKeys.cbSize= sizeof(STICKYKEYS);
StickKeys.dwFlags= 0;

//固定キー機能の値を取得するユーザプロファイル更新のために SPIF_UPDATEINIFILE を指定
if(SystemParametersInfo(SPI_GETSTICKYKEYS,sizeof(STICKYKEYS),&StickKeys,SPIF_UPDATEINIFILE) != 0)
{ }
else{ /*失敗*/ return FALSE;}

//現在5回シフトで、固定キーダイアログ発生が有効
if(StickKeys.dwFlags & SKF_HOTKEYACTIVE)
{  MessageBox(NULL,"なので、でないようにしたいです。","",MB_OK);
  StickKeys.dwFlags &= !SKF_HOTKEYACTIVE;

if(StickKeys.dwFlags & SKF_HOTKEYACTIVE)
{}
else
{ MessageBox(NULL,"5回シフト押下でダイアログがでないようになったはず。","",MB_OK);}
}
911デフォルトの名無しさん:2005/03/30(水) 17:19:04
ネタか?
912909:2005/03/30(水) 17:22:03
>>911
すみません本気で書いてるつもりっす…。
何故そんなこと言われるのかも解らん状態です。><
913デフォルトの名無しさん:2005/03/30(水) 17:24:47
>>912
911のような奴を相手にしないこと
この板にふさわしくないバカはほっとけ
914デフォルトの名無しさん:2005/03/30(水) 17:30:54
つうか、ネタだろ、longhornのネタかw
915デフォルトの名無しさん:2005/03/30(水) 17:31:44
SPI_SET*の存在についてよく考えて見ろ。
916デフォルトの名無しさん:2005/03/30(水) 17:49:35
つーか、BSTRならCOMだろ。OutProcなCOMなら、マーシャリングは
共有メモリなんでねーのか。
917909:2005/03/30(水) 18:30:16
>>915
うおーーーーーーーーーーーーー!!俺馬鹿だ(爆
有難うございます。

なんで皆がネタかと言ってたか解りました。
お騒がせしてすみませんでした。

918デフォルトの名無しさん:2005/03/30(水) 18:45:37
>>906
ありがとうございます!まさにそれです!
919デフォルトの名無しさん:2005/03/30(水) 20:31:03
>>908
char型に変換して渡す。
受け側でBSTRに戻す。
920デフォルトの名無しさん:2005/03/30(水) 20:33:31
>>919
charにしなくてもwchar_tで渡せばいいじゃん。
921デフォルトの名無しさん:2005/03/30(水) 20:55:06
こんばんわ

char mb[]="@niftyでインターネット Version 5.00について";
wchar_t wc[100000];


mbstowcs(wc,mb,100000);
を使いワイド文字に変換したのですが、
次のように文字化けがおきます。
何に問題があるのでしょうか?

"@nifty?A?C???^?[?l?b?g Version 5.00?E?A?¢?A";
922デフォルトの名無しさん:2005/03/30(水) 21:03:19
>>921
変換してどこに出力したんだ。
923デフォルトの名無しさん:2005/03/30(水) 21:04:28
cのライブラリ関数の質問はスレ違い。たぶんlocale関連の問題。

mbstowcsに拘らずにマルチバイト文字列からワイド文字列への変換がしたいだけなら、
Win32API のMultiByteToWideCharでちゃんとコードページを指定してやればOK。
924デフォルトの名無しさん:2005/03/30(水) 21:06:43
setlocale
925デフォルトの名無しさん:2005/03/30(水) 21:41:53
>>898
文字列リテラルは書き換え出来ない(C/C++の規格では)
926デフォルトの名無しさん:2005/03/30(水) 23:18:27
マスクされたビットマップ画像を扱いたいのですが、
猫でも〜のMaskBltだと95/98じゃ動作しないようなので
95/98でも使えるマスク画像はできないか
(特定の色を透過色として透かす方法などがあれば)
教えてください。お願いします。
927デフォルトの名無しさん:2005/03/30(水) 23:41:37
928デフォルトの名無しさん:2005/03/31(木) 00:01:07
GDI+使う手もあるけどね。
あれは95じゃ駄目か?
929デフォルトの名無しさん:2005/03/31(木) 00:15:57
DirectDraw使う手もあるナ
930デフォルトの名無しさん:2005/03/31(木) 01:07:18
OS再起動時にあるファイルの削除をしたいのですが、
何のAPIを使えば良いですか?
931デフォルトの名無しさん:2005/03/31(木) 01:23:01
>>930
MoveFileEx
932デフォルトの名無しさん:2005/03/31(木) 01:55:57
>>926
新しいの買いなよPC
貧乏なの?
933デフォルトの名無しさん:2005/03/31(木) 01:56:58
>>932
だから、バカはこのスレに来るなよ
934デフォルトの名無しさん:2005/03/31(木) 01:59:57
WinAPIで発生するエラーの処理はどの程度行えばよいのでしょうか。
ほとんどの関数が何らかの形で(NULLであったり定数であったり)
エラーを返すと思うのですが、やはり全てを考慮すべきなのでしょうか。
それとも、他の方のソースとの比較や経験則から、
エラーがほとんど発生しないような部分は割り切ってしまったほうが
いいですか?

自分は学生です。
仕事などで使うような重要なプログラムを作っているわけではありません。
頻繁に使用する部分を、自分なりに使いやすいようにまとめている最中です。
935デフォルトの名無しさん:2005/03/31(木) 02:06:47
ListViewで アイコン一覧とコメント(名称) のリストを作成したく

LV_ITEM item;
item.mask= LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;


という感じでリストビューを表示したのはよいのですが、
項目が増えると、右にスクロール(水平スクロールバーが表示される)してしまいます。

下に項目が増えていく(垂直スクロールバーのみが表示される)ように設定するには
どうすればよいのでしょうか。教えてください

936デフォルトの名無しさん:2005/03/31(木) 02:12:02
>>933
だから、バカはこのスレに来るなよ
937デフォルトの名無しさん:2005/03/31(木) 02:15:23
また厨房か
バカとか使うからすぐ分かるよな
明日から学校いけ
938504:2005/03/31(木) 05:29:55
超亀レス失礼します。

>>530
それは尤もなのですが・・・・・

>>534
コンソールを操作するAPIがちゃんとあるんですね。
貴重なアドバイスをどうもありがとう御座いましたm(_ _)m

>>537
Linuxのlessのソースを見たらコンソールを操作する関数があったのですが、
include ファイルも環境依存のものだったので、結局あまり参考になりませんでしたorz
939デフォルトの名無しさん:2005/03/31(木) 05:31:24
UNIXのソースなんか読んでも参考にならんよ
940デフォルトの名無しさん:2005/03/31(木) 08:13:14
>>934
さー?人それぞれケースバイケースだけど。
エラーは一応全部orほとんどハンドリングしておいて、大した
エラー時処理は入れないぐらいでいいんじゃない?
メッセージボックス出すとか。
デバッグに役立てる意味で。
941デフォルトの名無しさん:2005/03/31(木) 08:34:49
横レスですが、>>908 のBSTRサーバって何ぞや?
ぐぐったけどわからなかった。誰か教えてん。
942908:2005/03/31(木) 08:55:45
>>919
>>920
ありがとうございます。
やっぱり、FileMappingではそれしかなさそうですね。
BSTRをWCHARとDWORDに分解して、受け側で再構築させてみます。
まぁ、BSTRで渡す意味あるのってツッこまれたら、それまで、ですが。。

>>941
BSTRを受け渡しするだけのCOMサーバのことと理解してます。(誤解だったりして)
この場合、アウトプロセスになるのかな・・
この辺、自分もそんなに詳しくないので。。
これなら出来そうだ・・っていうイメージぐらいしか分かりませんが^^;;
943デフォルトの名無しさん:2005/03/31(木) 09:15:50
BUTTON のフォントサイズはどうやって変更するんですか?
944デフォルトの名無しさん:2005/03/31(木) 10:58:03
>>942
DLLに共有セクションを持たせることもできるな
945942:2005/03/31(木) 13:05:25
>>916
遅レスすみません。
ごもっともです。
確かに、アウトプロセスCOMなら、
共有メモリ使ってるのと似たような使い方考えられますね。
BSTR型とCOMを切り離して考えてたところが急所でした。。

>>944
なるほど!
COMまでいかなくても、DLLの共有セクションって手段もあるんですね。
共有メモリからDLL、COMという発想がでてきませんでした。

FileMappingでは限界と感じてるので、
DLLかCOMではどうか・・と、そっちの方向に振ってみる事にします。
アドバイスくれたみなさん、有難うございました!
946934:2005/03/31(木) 13:15:25
>>940
そうですね。
どうしても読みにくくなる部分以外は
とりあえずメッセージボックス入れるようにしていきます。
こだわりすぎで読みにくくなったりしたら元の木阿弥ですしね。
丁寧な回答ありがとうございました。
947デフォルトの名無しさん:2005/03/31(木) 16:13:52
>>938
じゃあ、PDCursesはどう?
http://pdcurses.sourceforge.net/
948デフォルトの名無しさん:2005/03/31(木) 20:47:34
DeleteDC( hmemdc )
DeleteObject( hobj )
とかって、オブジェクトを削除する前に、(メモリ)デバイスコンテキスト
から削除(解放)する必要があると学びました。
その手順を教えているサイトはあるのですが、それはなぜか説明されている
ところを見つけることが出来ません。 ご存知のかたいらっしゃいますか?
949デフォルトの名無しさん:2005/03/31(木) 20:52:49 BE:88200847-###
CClientDCを使うんだ!
950デフォルトの名無しさん:2005/03/31(木) 21:05:02
>>948
探せばすぐ見つかると思うが。
基本は、
hNew = CreateXXXX();
hOld = SelectObject(hdc,hNew);
/* ここで描画 */
SelectObject(hdc,hOld);
DeleteObject(hNew);
951デフォルトの名無しさん:2005/03/31(木) 21:07:28
ずれたこというな
952926:2005/03/31(木) 21:44:32
>927
既出スマソ。サンクス
953デフォルトの名無しさん:2005/03/31(木) 22:45:22
>>948
SelectObjectしたものをきちんと戻してあるなら破棄する順番に関係はない。
ただ、作成した順・逆順で破棄するなど規則性があった方がわかりやすい。
954デフォルトの名無しさん:2005/03/31(木) 23:33:04
メッセージループのデッドタイムを使って処理をしてるとき、
ウィンドウのキャプションバーをマウスで押下してると処理が止まるから
てっきり何かメッセージが連続で発生してるもんだと思ったら、
DispatchMessage()でループが止まってた…。
なのにWM_TIMERとかWM_MOVEとかでプロシジャはしっかり呼ばれてる。
なんで???わけわかんねーorz
955デフォルトの名無しさん:2005/03/31(木) 23:42:28
>>954
そういう一部のメッセージはメッセージループを通らず直接ウィンドウプロシージャへ送られる。

ちなみに自分からそういう風にメッセージを送りたければSendMessage()を使う。
PostMessage()だとメッセージループ経由になる。
956デフォルトの名無しさん:2005/03/31(木) 23:43:51
難しい話してるなぁ…僕はいつになったらこの人達みたいになれるんだろう
957デフォルトの名無しさん:2005/03/31(木) 23:45:06
>>956
めっちゃ簡単ですやん。
やればできる子ですやん。
958デフォルトの名無しさん:2005/03/31(木) 23:53:49
>>955
おお!そうかそういうことなのか…。
返答thxです。

いや、何か連続でメッセージが送られてるなら
そのメッセージ取得中は別に自前の処理関数呼べばいいかな
と思ってたんだけどそれだとどうやら無理っぽいっすね…。

なんとか処理止めずにいけないものでしょうか…(´・ω・`)
959デフォルトの名無しさん:2005/03/31(木) 23:57:20
デッドタイム使うのやめてスレッド作ったらどう?
960958:2005/04/01(金) 00:06:01
時代はやはりマルチスレッドなのか…。
いまだに抵抗あるんですけど挑戦してみます!(`・ω・´) ノ
961デフォルトの名無しさん:皇紀2665/04/01(金) 01:52:14
質問です。
実行されているアプリの実行時のカレントディレクトリ(作業ディレクトリ)を知るには
どうすればいいでしょうか? 例えば

C:\program files\program\program.exe を D:\Work から実行した、または、

C:\program files\program\program.exe のショートカットを D:\Work作成して実行した

といったケースで、実行中のprgram.exeを特定し、そこから D:\Work を導き出すことは
出来ないでしょうか?

なお、GUIアプリを対象にするつもりなのでWindowハンドルを元にプログラムを特定する
つもりです。
962デフォルトの名無しさん:皇紀2665/04/01(金) 01:53:24
>>955
DefWindowProc内でメッセージループが回ってんじゃね?
MessageBoxみたいに。
963デフォルトの名無しさん:皇紀2665/04/01(金) 01:54:16
Longhornの発売がまた延期(2008年初頭)になるそうで。
これぞMicrosoftクオリティ。
964961:皇紀2665/04/01(金) 02:21:53
Processを特定できればSTARTUPINFOという型の情報を持っていてそれで判るみたいですね。
もう少し調べてみます。自己完結失礼。
965デフォルトの名無しさん:皇紀2665/04/01(金) 07:09:29
実行ファイルはGetModuleFileName使って、
作業ディレクトリGetCurrentDirectory使えば。
966デフォルトの名無しさん:皇紀2665/04/01(金) 11:36:06
Advanced WindowsのLastMsgBoxInfoサンプルを参考にして、ExitProcessをフックするプログラムを書いてみたんですが、
フックできるexeと出来ないexeがあります。

画像ビューアのirfanviewと、Windows2000/XPのCMD.exeはフック出来ませんでした。
あと、explorer.exeのCreateProcessもフックできませんでした。
どうしてなんでしょうか。
(フックできているかどうかは、OutputDebugStringで確認しています)

環境は、Windows2000 VC++6です。
967デフォルトの名無しさん:皇紀2665/04/01(金) 11:55:48
WHND m_whandle;
m_whandle = GetActiveWindow();
if(m_whandle==NULL)
AfxMessageBox("NULLっぽい",MB_ICONSTOP);

ってな感じで、アクティブなウィンドウのハンドルを取得しようとしてるんですが、そのプログラム(自分)以外のウィンドウをアクティブにするとNULLが返ってきます。
どなたかお助け願います。
968デフォルトの名無しさん:皇紀2665/04/01(金) 12:05:38
>>967
GetForegroundWindow
969デフォルトの名無しさん:皇紀2665/04/01(金) 12:42:55
>>968
GetActiveWindowをGetForegroundWindowに変えたところ、ダイアログが出なくなったのでうまく行くかと思ったのですが、GetWindowTextで確認するとやはり何も変わっていないようです。

char buf[100];
WHND m_whandle;
m_whandle = GetForegroundWindow();
if(m_whandle!=NULL){
GetWindowText(m_whandle, buf, 1000);
MessageBox(NULL, buf, "DoGetForegroundWindow", MB_ICONSTOP);
}
970デフォルトの名無しさん:皇紀2665/04/01(金) 12:51:22
突っ込んで良いのか・・・・?
>>char buf[100];
>>GetWindowText(m_whandle, buf, 1000);
971デフォルトの名無しさん:皇紀2665/04/01(金) 12:56:22
あと、WHNDってのも無い。
972デフォルトの名無しさん:皇紀2665/04/01(金) 12:59:24
その場で書き足したんでミスってました、すまんす。
ソースは1000とHWNDになってます。
973デフォルトの名無しさん:皇紀2665/04/01(金) 13:03:39
GetWindowText
指定されたウィンドウのタイトルバーのテキストをバッファへコピーします。指定されたウィンドウがコントロールの場合は、コントロールのテキストをコピーします。ただし、他のアプリケーションのコントロールのテキストを取得することはできません。

に気づいてしまいました。

他のアプリケーションは取得も無理ですか?具体的にはアクティブなウィンドウに張り付きたいのです。
974デフォルトの名無しさん:皇紀2665/04/01(金) 13:10:57
>>973
GetForegroundWindowがコントロールを返すことは多分滅多にないんじゃないかな。
975デフォルトの名無しさん:皇紀2665/04/01(金) 13:14:46
ホントだ・・・ダメダメじゃん、自分・・・orz
976デフォルトの名無しさん:皇紀2665/04/01(金) 13:55:52
>>966>>967は同じ人の質問?
977966:皇紀2665/04/01(金) 14:31:42
別人です。

APIフックで悩んでおります。
978デフォルトの名無しさん:皇紀2665/04/01(金) 14:41:20
次スレまだー?
979デフォルトの名無しさん:皇紀2665/04/01(金) 16:55:19
Net meeting SDKに関する質問は
ココでいいですか?
980デフォルトの名無しさん:皇紀2665/04/01(金) 17:59:53
新スレ。

Win32API質問箱 Build30
http://pc8.2ch.net/test/read.cgi/tech/1112345886/
981デフォルトの名無しさん:皇紀2665/04/01(金) 18:25:26
>>966
たぶんそのサンプルはIATしか変更してないからだね。
いくらロードされたモジュール毎にIATを変更して回っても、
直接ExitProcAddressに飛んでる場合には対応できない。
プロセスにロードされたExitProcAddress関数のコードそのものを
書き換えるのが確実。
タイミングが悪いと書き換え中に呼ばれたりするから
SuspendThreadかなんかで停止中に書き換える。

例えば、ExitProcAddressの頭を
jmp MyHook
みたいなコードに書き換えて、用が済んだら書き換えた箇所を元に戻して、
jmp ExitProcAddress
する。
982デフォルトの名無しさん:皇紀2665/04/01(金) 18:27:08
ExitProcAddressじゃなくてExitProcessだね。
983デフォルトの名無しさん:皇紀2665/04/01(金) 19:20:44
>>973
WM_GETTEXT
984デフォルトの名無しさん:皇紀2665/04/01(金) 19:39:44
GetWindowTextは他のアプリからでも取得できたんじゃなかったっけ。
Win3.1とかからの互換性のためとかいって、
対象ウインドウのメッセージループが回ってなくても大丈夫だとか
聞いたことがあったけど。
985デフォルトの名無しさん:皇紀2665/04/01(金) 19:41:07
>>984
その辺の話はAdvancedWindowsに載ってるね。
WM_COPYDATA関連の章で。
986デフォルトの名無しさん:int 2ch =05/04/01(金) 20:05:38
>>984
WM_GETTEXTを素で送るとWindowsがよろしくやってくれるんだが
GetWindowTextを使うとはねられる。
987デフォルトの名無しさん:int 2ch =05/04/01(金) 20:43:44
SendMessageとはやり方が違うのかもね>GetWindowText
988デフォルトの名無しさん:int 2ch =05/04/01(金) 20:53:31
ttp://www.microsoft.com/japan/msdn/library/ja/jpwinui/html/_win32_getwindowtext.asp

いや、わざわざチェックかましてるだけっぽ。
989デフォルトの名無しさん:int 2ch =05/04/01(金) 21:13:46
ReadFileは一文字ずつ読み込めるのでしょうか?
カンマで区切られたtxtデータを読み込んで
カンマまできたら、そこまでの文字を読み込みたいのですが、
どうすればいいでしょうか?
990デフォルトの名無しさん:int 2ch =05/04/01(金) 21:23:42
>>989
先ず日本語を勉強しろ。

>カンマで区切られたtxtデータを読み込んで
>カンマまできたら、そこまでの文字を読み込みたいのですが
読み込んだ後に読み込みたいって矛盾してるように読めるぞ。
991966:int 2ch =05/04/01(金) 21:38:11
>>981
なるほど。
回答ありがとうございました。
その方法でやってみます。
992デフォルトの名無しさん:int 2ch =05/04/01(金) 21:41:51
>>989
効率は悪いだろうけどSetFilePointerと組み合わせれば出来るかもね。
993デフォルトの名無しさん:int 2ch =05/04/01(金) 21:47:20
>>989
ファイルサイズがそこまで大きくなければ、メモリ上に一度全て
読み込んでしまえ。無駄に感じる気持ちは解る。はじめの頃は。
994デフォルトの名無しさん:int 2ch =05/04/01(金) 21:52:59
つーか、そういうときぐらい素直にC/C++の標準ライブラリとか使ってやれよ。
995989:int 2ch =05/04/01(金) 21:59:49
スマソ。正直学力が足りなかった
996デフォルトの名無しさん:int 2ch =05/04/01(金) 22:10:55
↓スレスト
997:int 2ch =05/04/01(金) 22:16:25
 
998デフォルトの名無しさん:int 2ch =05/04/01(金) 22:18:55 BE:12600522-###
999でスレスト

999デフォルトの名無しさん:int 2ch =05/04/01(金) 22:20:52
ならぬツイスト _/ ̄
1000デフォルトの名無しさん:int 2ch =05/04/01(金) 22:20:58
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。