Win32API質問箱 Build21

このエントリーをはてなブックマークに追加
スレ立てるまでもない、Win32APIについての質問はこちらへどうぞ。
ただし、最新スレくらいは質問する前に検索してくれ。というかしろ。

過去スレなどのリンクはたぶん>>2-5くらい
>>2-5
(ノ∀`)アチャー
>>1
おつ
6前991:04/07/22 02:24
>>前994
ありがとうございました。
しかし2のウィンドウシェードについてはできたのですが、ウィンドウを
移動不可にする方法についてもう少し詳しくお教え頂けないでしょうか。
WM_WINDOWPOSCHANGINGをアプリケーションが処理するならば
0を返すようにとPlatformSDKのドキュメントには書かれていたのですが

case WM_WiNDOWPOSCHANGING:
 return 0;

では移動してしまいました。
>>6
それ、処理してない。
8前991:04/07/22 02:32
すいません、とんでもない勘違いでした(汗
送られてくるWINDOWPOS* lParamに対して処理を加えてbreakですね。
申し訳ないです。
>>前スレ974
>WM_NCHITTESTかな?
できました!感謝

Q:
システムボタンをdisableやgrayedにして機能しなくしても、
これだとボタンの上でクリック(ドラッグ)すると、放すまで制御が
WINMAINに戻ってこないんですよね。
ボタンを押されてもMAINのコードが止まらないようにしたい。

A:
WM_NCHITTESTをトラップすればOK
10デフォルトの名無しさん:04/07/22 10:57
DrawEscape()って、使い道ある?
何のために使うの?
test test
12デフォルトの名無しさん:04/07/22 12:10
エディットボックスに入力されたキーのうち
特定のキーの入力を無効にしたいと思っています。

エディットボックスをサブクラス化して、WM_KEYDOWNで
例えば 'A' を捕まえた時に、0を返してみました。
しかし上手くいかず、エディットボックスにAがそのまま入力されてしまいます。

キー入力を無効化するには、どうすれば良いのでしょうか。
('A')
>>12
WM_CHAR
1512:04/07/22 12:45
>>13
書いたとき少し思いました。

>>14
やった、できました!
謎ですが、WM_KEYDOWNを殺しても、WM_CHARは発生してしまい、
そしてエディットボックス内部で処理されているのはWM_CHARということなのでしょうか。

いずれにせよレスありがとうございました。助かりました。
16デフォルトの名無しさん:04/07/22 16:24
windowsx.h
ってのは、標準と思っていいのですか?
GetStockBrush()とか、便利なんだけど。
むしろ使用を推奨されてた気がするが > windowsx.h
メッセージクラッカーとか。
デバッグビルドの時には何も起きないのに、リリースビルドにして
引数付きのDLLの関数を、GetProcAddressで呼び出して使うと
「問題が発生したため、XXX.exe を終了します。 ご不便をおかけして申し訳ありません。」
がでてエラーになります
どうしたらいいですか?
>>18
そういう場合、http://www.cmagazine.jp/src/kinjite/c/variable.html←このへんのどれかをやっちゃってる事が多い。
20デフォルトの名無しさん:04/07/22 19:00
ダイアログベースのプログラムの欠点って何ですか?
欠点がないならGUIが簡単に作れるから全部ダイアログベースで書いちゃえばいいと思うんですが。
>>19
そのページみてvolatileを付けまくってみたらできました
ありがとうございました
と思ったらデバッグビルドになっていて出来ていませんでした
>>20
そうですね。
その通りになさればよろしいと思いますよ。
ダイアログだって、ウィンドウの面倒な部分をかなりラッピングしただけなんだから本質的な違いは無いでしょ
>>20 そういう話はこっちでどうぞ
http://pc5.2ch.net/test/read.cgi/tech/1049790146/
>18 >19 >21 のやり取りを見て疑問に思ったんだけど、
Winだとスレッドやプロセスが切り替わってもレジスタの値は
保存して保護されるんじゃないの?
じゃないと全ての変数にvolatileつけなきゃならないと思うんだが。
>>26
そんなことは当然だがお前はナニを勘違いしてんだ?
>>26
スレッド・プロセスの切替時にレジスタの内容が保存される先は
元の変数のあった場所ではなく、全く無関係な場所。
>>28
レジスタ自体関係ねえよ
馬鹿に馬鹿な回答するなよ
3026:04/07/22 23:19
あぁ確かにかんちがいしてたわ、すまん
そもそも、なんでvolatileで解決しようと思ったんだろ…
SHGetFileInfo()のSHGFI_ICONLOCATIONフラグって正常に機能してます?
関数自体は成功してるみたいなんですけど、
szDisplayNameには何も格納されないし・・・。

この現象について知識をお持ちの方、教えて下さい。
>>31
スレッドでも使ってたんじゃないか。

volatile付いたせいでコードが変化しただけで、潜在バグは残ってると思うけどね、俺は。
いや、21と22は連続してると思うんで、潜在どころかこれっぽっちも解決していないと思われ。
バックグラウンドで動くホットキー型のランチャー作りたいんですけど、
普通にシステムトレイに常駐させるつつ、WM_KEYDOWNで入力を待つだけでいいんですか?
WM_KEYDOWN来ない
WM_KEYDOWNだけだと
ウィンドウがアクティブになってないとメッセージを届けてくれないから
別の方法を探すといいかも

これはオープンソースだから参考にしてみるといいかも
ttp://www.nakka.com/soft/nlaunch/
>>35
RegisterHotKey使えや。
39デフォルトの名無しさん:04/07/23 10:02
ウィンドウを最前面にしたくて、
SetForegroundWindow(Handle);
SetWindowPos(Handle, HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
してますが、
これらの処理中に他画面をクリックすると無効になってしまいます。
どうしたら良いでつか?
C のランタイムライブラリに記録されている関数を使うスレッドは、
CreateThread 関数と ExitThread 関数ではなく、
C のランタイム関数である beginthread 関数と endthread 関数を使うべきです。この方法に従わないと、
ExitThread 関数を呼び出したときにわずかなメモリリークが発生します。

C のランタイムライブラリはC++のランタイムライブラリも入りますか?
41デフォルトの名無しさん:04/07/23 10:06
                |
                |
                |
                |
     /V\        ,J
    /◎;;;,;,,,,ヽ
 _ ム::::(;;゚Д゚)::| ジー
ヽツ.(ノ::::::::::.:::::.:..|)
  ヾソ:::::::::::::::::.:ノ
   ` ー U'"U'
>>39
WM_CREATEの部分で

SetWindowPos (hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);

を入れてみ、できるから
>>39
素でワラタ

>SetForegroundWindow(Handle);
でアクティブにしてるのに
>SetWindowPos(Handle, HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
                                                        ↑
                                      アクティブにしないように設定してるとはな
>>43
あ、ホンとだ。SWP_NOACTIVATE消しますた(恥

でも何故か現象は同じでつ。
MSDN のサンプルにある、ntddcdrm.h を見たくて、
Windows NT DDK に含まれていそうなので、MS のサイトへ行ったのですが、
見つかりません。Windows NT DDK は、CD-ROM 購入なのでしょうか。
>>44
>これらの処理中に他画面をクリックすると無効になってしまいます。
>どうしたら良いでつか?

waht do you mean?
SetForegroundWindowが他のウインドーになるとフラッシュになる仕様に変わったのが原因だろ
40の質問もおねがいしますね
>>45
DDKスレにリンクがあるロシアサイトから全部落とせるよ
>>47
C++のランタイムライブラリとは何か、ということを考えれば、自ずと答えは出るだろう。
考えても分かりません
おしえてください
自己解決しました
>>51
何番か言えよ
自己解決しました。ありがとうございました。
勝手に解決しないでください
自己解脱しました。
ありがとうございました。
勝手に解脱しないでください
自己フェラしました。
ありがとうございました。
勝手にセルフェラしないでください
自己マンコしました.
ありがとうございました.
勝手にドリアンしないでください
テレビを昨日家族で見ていた。すると南国の果物特集が始まった。
「マンゴー」が写っていた。で、親父が「これってくさいやつだろ?」
と言った。俺は「それはマンコだろ!」と突っ込んだ。
すると母が「それはドリアンだよ」と一言だけ残し、台所へ去っていった。
6245:04/07/23 16:57
>>48
ロシアかどうか分からないままですが、nt4ddk.zip を落として来ました。
ありがとうございました。
中に、ntddcdrm.h があり、欲しい情報は得られましたが、プログラムは
次のエラーが出て、頓挫です。今後とも、よろしく。
流されてしまったのでもう一度お願いします_| ̄|○
C のランタイムライブラリに記録されている関数を使うスレッドは、
CreateThread 関数と ExitThread 関数ではなく、
C のランタイム関数である beginthread 関数と endthread 関数を使うべきです。この方法に従わないと、
ExitThread 関数を呼び出したときにわずかなメモリリークが発生します。

C のランタイムライブラリはC++のランタイムライブラリも入りますか?
うん
stringもstudio.hもiostreamも全部ランタイムCライブラリーなんですかー
C++なのにどうしてですか、理由を教えてください
>63
>C のランタイムライブラリはC++のランタイムライブラリも入りますか?
意味が解りません。とりあえず日本語の勉強をしてから出直してください。
言い方がまちがってました 分かりやすく説明するとC++ランタイムライブラリのiostreamを使って
CreateTHReadをコールしても僅かなメモリーリークは発生しませんか?
発生する
親ウィンドウでWM_MOUSEMOVEとWM_MOUSELEAVEを使って
ウィンドウの背景色を変えているのですが、子ウィンドウ上にマウス
ポインタが移動した場合もWM_MOUSELEAVEが発生してしまいます。
子ウィンドウ上に移動してもWM_MOUSELEAVEを発生させないよう
にするにはどうすればいいのでしょうか?

親ウィンドウ上にマウスがある→白背景
親ウィンドウからマウスが外れた→黒背景
親ウィンドウ上でかつ子ウィンドウ上にマウスがある→白背景
といったことがしたいのですが…。
子ウィンドウに入ると親ウィンドウの外にあるってなるん?

子ウィンドウのハンドルを取得してるんだし
マウスポインタが子ウィンドウの中にあればTRUEを返す関数とか作ってみたら?
子ウィンドウが右クリックされた時
親ウィンドウが子ウィンドウが右クリックされたと知るにはどうすればいいでしょうか?
子ウインドウが右クリックされたときに適当なメッセージを発するように
すればいいんじゃね。親はそのメッセージを捕まえる。
>>72
書き忘れてすみません
子ウィンドウはListViewですが
COMMONコントロールでは
右クリックが押されたなどの場合に親に何かメッセージを送ってくれるのでしょうか?

「〜の仕方を教えてください」系の質問ではなく
「〜はありますか?」系の質問ですみません。

もし何かメッセージがあるようならば、その名前を教えてください
メッセージはWM_NOTIFY。
CODEはNM_RCLICK。
>>74
出来ました
ありがとうございます
7669:04/07/23 21:57
>>70
親ウィンドウ→子ウィンドウに移動したときにどうもWM_MOUSELEAVE
が出てしまうようで、背景が白黒白黒と点滅してしまうのですよ。

> マウスポインタが子ウィンドウの中にあればTRUEを返す関数とか作ってみたら?
とりあえずこの方向で考えてみます…。
ありがとうございました。
>>63
軽く調べてみたらだんだ興味が出てきたので、いろいろ試してみた。

まず事実として、C/C++のランタイムは数種類存在する。MT=マルチスレッドな。
       StaticLink DynamicLink
C      libc.lib   msvcrt.lib
C(MT)   libcmt.lib   ↑
C++    libcp.lib   msvcprt.lib
C++(MT) libcpmt.lib  ↑

要するに、Cランタイムのlibc、C++ランタイムのlibcpがあり、
それぞれにMT対応の「mt」が存在する。msvc系は最初からMT対応なので2種しかない。
なので、「CのランタイムにはC++のランタイムは含まない」。

ただし、これは「C++ランタイムを使う場合に_beginthreadは不要」ということを意味しない。
というのは、C++ランタイムは内部的にCランタイムを使用しているためだ。
(libcp.libのみリンクしてみるれば一目瞭然。関係ないが、Cランタイムはkernel32.libを使用している)
そのため、「C++ランタイムを使用する場合も_beginthreadを使用するべきである」。

ただしこれは手元のVC++6の場合で、他のバージョンでどうなのかは不明だ。
少なくともVC++4.2以前はiostreamはlibcに含まれていたらしいので、環境依存なのは確かだが。
(なお、その古いバージョンのiostreamは、libci.libとしてVC++6にも残っている)
マニュアル持ってないのか?
一つのHWNDに対して
いくつまでHDCを使うことができるんですか?
限界とかありますか?
16bitの頃はあったらしいが
ちょっとスレ違いかもしれませんが、
NT系をシャットダウンさせようと思ったので、その方法について調べていました。


AdjustTokenPrivileges()の引数の、
TOKEN_PRIVILEGES構造体なんですが

#define ANYSIZE_ARRAY 1
/*略*/
typedef struct _TOKEN_PRIVILEGES {
DWORD PrivilegeCount;
LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY];
} TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;

こんな風にwinnt.hに書かれているんです。

このPrivilegesという配列をいくつ使用しても問題が無かったのですが、なぜでしょうか?
PrivilegeCount で指定された値に応じてその先のデータを読むってこと。
配列へのポインタはそれだけだと配列のサイズを渡せないでしょ。
それって、malloc( sizeof( TOKEN_PRIVILEGES) +
PrivilegeCount*sizeof( LUID_AND_ATTRIBUTES ) )とかで
確保する、Cのお約束パターンでないの?自動変数で確保
して、Privileges[2]=...とかやったら、データ破壊だよ。
>>83
MSDNのサンプルでも、Privileges[0]としてしか使っていませんでした。
8581:04/07/24 12:35
>>81 == >>84です。
>>84
Privileges[0]は、もともとTOKEN_PRIVILEGESに含まれてるでしょ。
87デフォルトの名無しさん:04/07/24 13:56
大量のあらかじめフルパスが分かっているファイルのサイズと最終書込日時の取得をしたいのですが、
for(int i=0; i<30000; ++i)
{
WIN32_FIND_DATA fd
HANDLE hf = FindFirstFile(filePath[i].c_str(), &fd);
//fdの中のデータを利用
FindClose(hf);
}
とやると30000ファイルで20秒くらいかかってしまいます。
FindFirstFileを使わずにCreateFile,GetFileSize,GetFileTimeを併用すると
更に1割ほど遅くなってしまうようです。

もっと速い方法は無いでしょうか?
しかし、こんな所でたずねるほうが馬鹿だね。だったら、MSに行け
GetFileAttributesEx だとどうだ?
GetFileAttributesEx使ってみたら?
9190:04/07/24 14:08
リロードすれば良かったorz
しかし、Win32APIもいいかげん。もちっと、プロセス、タスクレベルの仕事しっかりしろよ
>>92
(゚Д゚)ハァ?
Direct Input でキー入力とってるアプリに
実際にキーを押さないでキーを押したエミュレートするには
どうしたらいいんでしょうか?
keybd_eventでは駄目でした
>>89-90
FindFirstFile>(5%)>GetFileAttributesEx>(5%)>CreateFileの順でした。
うーん…
Backupオプション使ってディレクトリを開き、読み、自前で解析するとか。
>>87
マルチスレッドにしてみたら?
>>95
ファインドファーストファイル中に、ファイル作っているのはおもしろい、
99デフォルトの名無しさん:04/07/24 14:33
>>98
それどういう意味??
>>98
無知をさらした瞬間、と取ってよろしいか?
101デフォルトの名無しさん:04/07/24 14:45
98晒しage
ERROR_NOT_ENOUGH_QUOTAについて質問です

FormatMessageすると、
「このコマンドを実行するのに十分なクォータがありません」
と表示されます。

クォータ(QUOTA)とはどんな資源なんでしょうか?
>>103
このエラーの指すところのクォータの意味が知りたかったのですが・・・

グーグルで、このエラーを検索したところ
以下がヒットしました
ttp://www02.so-net.ne.jp/~handa/win32api/ProcessAndThread.html

クォータで一般的にヒットするディスク クォータとは、まるで関係ないように思えます。
>>104
ERROR_NOT_ENOUGH_QUOTAとは何か? とだけ聞かれれば、
何らかの資源不足だ、としか答え様がない。QUOTAは資源ではなく、資源の制限だからだ。
何が不足してるかは俺らにはわからん。お前が何をしてるのか知らんしな。

関係ないと断言するのは勝手だが、関係あるかないかは、お前さんが何をやってるか次第であって、
お前さんが何をしたいかどうかとは、それこそ全く関係がない。

つまり、お前の聞き方が悪い。
106102:04/07/24 16:50
順を追って、説明しますと
作成したアプリを実行中に、IEを立ち上げたところ、
IEがこのエラーを出したそうです。

作成したアプリが何らかの資源をリークしてるのか、
それとも、まるで関係ないのかさえ、糸口が掴めない状態です。

そこで、このエラーを発生しうる資源の不足あるいはAPIを調べ、
それらを扱っているコードをチェックしようと思ったのです。
資格も無い奴に原因教えるわけにいかんだろう。このすれ、馬鹿すぎ。
でも、一番の馬鹿は107だと、僕はそう思うよ。
プ、おまえの言ってることは、堂々とセキュリティー破りを聞いていることだろう
市ねよ。おまえを、訴えるかw
また変なのが湧いてきた
馬鹿には絶対教えないことが、セキュリティの向上につながります。
それが結局、お客様の利益を守ることになります。7
QUATAもわからない奴が未だにいるんだ。最悪だな。
外国に頼むのも仕方が無いかも。
やっべ俺も最悪
>>106
ふーん。がんばれよ。
>>102 が知りたいのはQUATAではなくてQUOTA
ログインできないから何でて聞かれても、おまえが馬鹿としか言いようが無い。
まあ、そんなもんだ
コンストラクタでBeginPaint()を行い、デストラクタでEndPaint()をするクラス
を作りました、このクラスをWM_PAINTメッセージを受けたときに定義し、再描画
を行っています、ウィンドウプロシージャ内でこのクラスを使ったときにはうま
く行くのですが、定義したオブジェクトを自作の再描画関数に渡すとうまく行き
ません、(コピーコンストラクタは定義しています)、、理由がわかりません、
どなたか助けてください。
ソース見せろ
すごい。へー、そんなことできるんかいなw、大馬鹿が増えた。
マニュアルよく嫁。
XWindowで勉強しろ
>>117
場合によって動くのなら、APIの問題ではなくクラス設計の問題。C++方面のスレで聞け。
>>117
BeginPaintの説明を穴があくまでよく嫁。
123デフォルトの名無しさん:04/07/24 21:09
また、自称上級者が調子こいてますな w
うん、馬鹿をからかうのが楽しいが、今回は、重症だな。こりゃ。
>>117
おまえプログラマ向いてないからやめろ。そのほうが日本のためになる。
文字列を検索するにはCあるいはC++ランタイムライブラリを使わないでやるには
自分で作るしかないのですか?
CあるいはC++ランタイムライブラリを使っていない、
他人が作った検索ルーチンを使う
127デフォルトの名無しさん:04/07/24 21:47
その程度ならその場で書けよ
それすらできんならプログラムングなんてとっとと辞めちまいな
128デフォルトの名無しさん:04/07/24 22:12
>>125

APIで検索汁
なんだ。無知を指摘されたやつが切れて暴走してるのか。
>>125
このスレでそんなこと聞いてどうするつもりだ?
未経験者可、時給700円とかの仕事をやっていて、仕事って簡単じゃなんて、
思っているのが、増えているんでないかと思う昨今。
>>131
難しい仕事ってどんなことするの?
とみながさんみたいな仕事
>>133
みーな?
いちろうだろう。
中将閣下だろ。
137デフォルトの名無しさん:04/07/25 00:09
プロセスハンドルからそのプロセスが起動された時の引数を知るにはどうしたら良いのでしょうか?
GetCommandLine()
139117:04/07/25 00:40
参照渡しにすることにより解決しました。
140デフォルトの名無しさん:04/07/25 00:42
>>138
現在のプロセスのコマンドラインしかとれないようです
考えろ
最終手段はフックでターゲットプロセスに入り込んで実行だーね
GetLastErrorのエラーコードからFormatMessageで文字列にすることについてですが
エラーコードによって%1のように文字列を埋め込むところがありますよね。(例えばERROR_WRONG_DISKとか)
この埋め込む文字列はファイル名だったりドライブ名だったりいろいろあるようですが
どんな文字列を渡したらいいのかは、エラーコード毎に調べてやるしかないんでしょうか?
そういう予めエラー種別が予測されるものは通常、エラーコードでswitchさせるなりして
それぞれエラー処理書くでしょ。それに付随させてエラーメッセージフォーマットもしてやれば良いだけ。
質問への答えとしては、yes
145143:04/07/25 01:38
>>144
そうなんですか…
APIでエラーが起きたらGetLastError()を例外クラスに突っ込んでthrowして
一箇所でまとめてフォーマット→メッセージ表示させようと思ってたのですが…
エラーコードでswitchさせても、予定外のコードがきたらとか考えると
自分でエラーメッセージ書いたほうがいいような気がしてきました。
エラーなんて気にすんな。
死ぬわけじゃなし。
147117:04/07/25 09:40
参照渡しを使わずにオブジェクトを関数に渡すことができるようにすることが
できました。
>>147 が日本語をまともに使えるようになることができるようにしたい。
>>148
スーパークラスかコンストラクタのデバッグが必要と思われ
SDKプログラミングでFlexGridみたいなActiveXコントロールを使ってみたいんですが
それに関する資料のあるサイトとかありませんか?
151デフォルトの名無しさん:04/07/25 11:38
ランタイムロードのDLLについて質問です。
DLL内部でnewやmallocを使って動的に確保したメモリ領域は、
呼び出し側がFreeLibrary()した時に自動的に解放されるんでしょうか。
それとも明示的な解放が必要ですか?
不必要
>>151
どういうことを言ってるんだ?普通メモリを割り当ててそのポインタを返す場合はポインタもらったほうが開放するもんだし、
DLL内部の関数でメモリ確保して内部で始末するようなのはそこで自己完結してるものだし。

154151:04/07/25 12:13
では、FreeLibraryを使っても、LoadLibraryする以前のメモリ使用量に戻らないときは、
どのような原因が考えられますか?
>>148
それは君の知識不足だろ
セマフォやクリティカルセクションとかのスレッド間でのアクセス管理オブジェクトを
使わなくても、DWORDまでの読み書きなら安全か?
グローバルフックをクラスにするときオブジェクトを何個作っても
DLLのグローバルフックが別々になるようにするにはどうしたらよいですか?
>>154
1.DLL内部のメモリ開放のし忘れ
2.メインプログラム内でのメモリ開放し忘れ
3.DLLの外と中でのメモリ割り当て/開放関数使用の不一致
4.君がタスクマネージャの見方を知らない

漏れは4が怪しいと思う。仮想メモリ使用量の表示は見たか?
AlwaysUnloadDLLっていうレジストリ値使っている人いるのかな。
>>156
1CPUなら平気だが2CPU以上の場合は駄目
だったような気がする。
>>160
2CPUでもアクセス管理してるから同一メモリアドレスに同時にアクセスはできなくない?
APIスレなんだから、Interlocked*を使う話じゃないのか?
1CPUでも安全な保証はないだろ。
>>156
処理によってはたまたま安全な場合もあるが、基本的には危険と思っておくべき。
なんか156みたいな質問って定期的に出てくるけど何なんだろうね?

>>156
よかったら、その疑問をもった経緯をおしえてくれないか?
>>165
毎回イベントやらクリティカルセクションやらを仕掛けるのが面倒だったんで、
CPUのバス長未満の読み書きなら安全かな?と。安全なら省けるなと思ったもので。
効率的にも仕掛けなくて済むなら、向上しそうですし。
C のランタイムライブラリに記録されている関数を使うスレッドは、
CreateThread 関数と ExitThread 関数ではなく、
C のランタイム関数である beginthread 関数と endthread 関数を使うべきです。この方法に従わないと、
ExitThread 関数を呼び出したときにわずかなメモリリークが発生します。

ウィンドーズのアプリケーションを作る場合
CランタイムライブラリのLIBC.LIB LIBCMT.LIB MSVCRT.LIB LIBCD.LIB LIBCMTD.LIB MSVCRTD.LIB
のどれかが絶対リンクされるということは、Cのランタイムライブラリに記録されている関数を使う事にはなりませんか?
>>167
>>77

どっかの宿題か?
>>167
VC++を使った場合はね
SHGetFileInfoで取得したアイコンは削除する必要がありますか?
それともシステムのアイコンハンドルだから削除してはいけないのでしょうか?
自己解決しますた。
>>171
結局どっちでしたか?
>>156
シングルプロセサでかつアライメントが適切 (例: DWORD なら 32bit 境界に整合している) なら、大丈夫。
ちなみに、Pentium プロセサなら 64bit まで大丈夫。

ただし、>>160 が言うようにマルチプロセサなら駄目。
その時は、LOCK プリフィックスとか XCHG 命令とかでバスをロックする必要がある。

>>161
例えば、inc 命令は、メモリからデータを読み込んで +1 してメモリに書き込むから、その間に他のプロセサが割り込んでしまうことがありえる。
割り込まれないようにするために、バスロック機能がついている。

>>163
保証がないわけではない、インテルのマニュアルを読むべし。

インテル・アーキテクチャ ソフトウェア・ディベロッパーズ・マニュアル
下巻:システム・プログラミング・ガイド
7.1. ロックされたアトミック操作

このマニュアルを読んでよくわからないなら、>>164 の言うように考えておくべし。⇒ >>156=>>166

>>166
上に書いたのは、あくまでも1命令内での話だから、C なんかで書く場合は気をつけてね。 
>>170
GetStockObjectで入手したハンドルを削除するかどうか考えれば解る。
答えは否
知ったかすみませんでした
>>173
とても詳しい説明をありがとうございました
178デフォルトの名無しさん:04/07/26 02:05
GetKeyboardStateってCreateThreadで作ったスレッド内で動作しないの?
キーボードの入力状態はスレッド別
共有したいならAttachThreadInputすればいいんじゃない
>>178
GetKeyboardStateの情報は、メッセージキューからメッセージを取得したときに更新されたような気がする。
つかMSDNに書いてあるじゃん。
フォルダの情報、例えばファイルが増えたとか減ったとかいうのが変更されたとき
リアルタイムでそれを知るにはどうすればいいでしょうか?
>>181
FindFirstChangeNotification
>>178
ありがとうございます。自由になりましたら早速試して見ます。
>>179
そのようなことが書いてあったので、とりあえずウインドウプロシージャで
GetKeyboardStateを使ってみると正常に動きました。
なので、別スレッド(メッセージを取得しないスレッド)では動作しないのかなと思ったわけです。
Windowsプログラムの初心者です。
標準Cとほとんど(全く?)同じ関数とか型とかありますよね?
strcmp()とlstrcmp()やintとINTみたいに。

Windowsの関数や型を使うと何かいいことがあるのでしょうか?
特に違いがないのであれば、慣れている方を使いたいのですが。

後、malloc()とかを使うとまずいんですかね?
コンパイラやWindowsのバージョンなどに依存しないコードがかけます。
TCHAR対応のとき、strlenは_tcslenとかになって鬱陶しい。
lstrlenはそのままなので安心、とか。
lstr〜はstr〜に比べて全然少ないので、一貫性をとるためにはCライブラリで統一せざるを得ないとか。
188デフォルトの名無しさん:04/07/27 00:46
>>184程度質問する奴に
コンパイラやWindowsのバージョンなどに依存しないコードがかけてなになる?
なになる?と訊かれても困っちゃいます。
なったーなったーなになった
当家の婿どのなになった
Windows2000でATAPIのDVD-Rにアクセスしたい。
が、DeviceIoControlを発行するところで、アクセスを拒否されてしまう。
http://support.microsoft.com/?kbid=241374
↑によると管理者特権を取れというのだが、どの特権を取ればいいのかわからない。
教えてエロい人。
>>191
アドミニストレータで実行すればいい。
193191:04/07/27 09:07
>>192
すでにAdministratorです。
じゃあほかのエラーでしょうか?
>>184
INTだけは他との一貫性のためだけにあるみたい。
MSDN読むとわかるけどLONGとSHORTは使うけど、UINTも使うけど、INTはどこにもでてこない。
いつも小文字のint。
Alt キーが離されたことを通知してもらうためのよい方法はないでしょうか。
例えば

Alt 押す / Alt 離す
と入力された場合は「Alt 離す」のところで WM_SYSKEYUP が送られてくるのですが、

Alt 押す / X 押す / X 離す / Alt 離す
と入力された場合、
「X 離す」のところで WM_SYSKEYUP が送られてきますが、
「Alt 離す」のところでは送られてきません。

後者の方の「Alt 離す」を知るにはどうすればよいでしょうか。

フック (WH_KEYBOARD_LL) を使えばできると思うのですが、9x 系では使えません。
何か他に方法がないでしょうか。
無理ならおとなしくフック使います。
196195:04/07/27 09:40
_no

後者の方の入力例ですが、
「Alt 離す」のところで WM_KEYUP が送られてくるので、これで判断できますね。
>>184
mallocの代わりにAPIのGlobalAlloc系を使えば、キャッシュへの退避をコントロールできる。
別にmalloc使っても問題はないし、ほかの人もいってるけどそのほうが環境に依存しない
ので、用途で使い分けるよろし。

Winと心中する覚悟があるなら可能な限りWin32APIで書くのもありかもね。
どうせWin32用に書いたアプリを移植するには物凄い苦痛が伴うんだから、別にいいじゃんHeapAllocで
>>184
ANSI 関数使わないと、その関係のライブラリがリンクされなかった気がする。
wsprintf() は sprintf() より機能が狭いなど制約はある。
細かい話だが、stdio.h を入れると、4098 のバッファが付いて来る。
今は問題にすることはなくなったが、フロッピーに入れたいがため、4K 程度
のサイズでも気にするときは、使わないとかしていたな。
なんせ、cp/m 上がりなもんで。
パフォーマンスあげようとして malloc の代わりに
GlobalAlloc や HeapAlloc を使うのは本末転倒。
小さいブロックを大量に確保/開放するときは
malloc/free の方が大抵早いよ。

GlobalAlloc や HeapAlloc を使うなら
自前でメモリマネージャを用意して
大きいブロックを確保した中から
小さいブロックを allocate しないと
APIのオーバーヘッドがでかいので性能上がらんよ。
ってかそこまでしたら malloc/free じゃん?(w

とマジレス。
malloc()/free()だってWindows上では・・・

void* malloc(size_t _size)
{
 return HeapAlloc(hHeap, HEAP_ZERO_MEMORY, _size);
}


ReactOSの例だけどね。
>>201
VC++.NET2003で、
mallocの中見ても最終的にはHeapAlloc呼んでる
>>201
バグみっけ。malloc()で確保されたメモリは0クリアされないから、HEAP_ZERO_MEMORYを指定するのはおかしい。
void* malloc(size_t _size)
{
 return HeapAlloc(hHeap, 0, _size);
}
が正しい実装のはず。誰かパッチ投げといて
HeapAlloc呼んでるのは確かだけどいつもHeapAlloc呼んでる訳じゃなくて、
自前で管理してるメモリブロックの空きが足りない時に呼んでるだけ。
>>203
別にゼロクリアしてもいいじゃん。
>>205
K&Rにも、manにもその他の文献(Web上)にも「初期化されていないメモリへのポインタを返す」とある以上、
それに従わない実装はまずいだろう。ゼロフィルを行わない事を前提にシビアなタイミングで動くプログラムが
あるかもしれないし。
>>206
ゼロクリアすることで動かなくなったら、それは間違いなく呼出し側の
バグだってば…

ちなみに、HeapAlloc() そのものはカーネルモードに入る必要はないの
でさほどオーバヘッドはないと思う。たまに VirtualAlloc() は呼ぶだ
ろうけど。

>>207
「ゼロで埋める時間ですらもったいない」ということでは?
>ゼロフィルを行わない事を前提にシビアなタイミングで動くプログラムが あるかもしれないし。
そんなコードは間違いなくWinじゃ動かないだろうな。
>>206
未定義の場合はそれがどうなっていても構わない。
ランダムなバイト列だろうが、
0でクリアされようがVC++のデバッグモードのように特定のビット列で初期化されようが、
"逝ってよし"でfillされようが問題無い。

同様に未定義の操作をした場合HDDが初期化されようが、PCが火を噴こうが構わない。
deadbeef!
>206
それは単に、メモリの内容は保証されない程度の意味だと思うのだが。
あとシビアなタイミングが必要なら、
mallocを使わずに自前でメモリを管理するべきだし。
つーかmallocはスレ違い
mallocか、HeapAllocかって話だからあながちスレ違いでもない
alloca最強
「初期化されていないメモリへのポインタを返す」という仕様だから
ゼロクリアするのはバグって、
凄いなおい。
ReactOSの方針からすると、Windowsと違う実装はバグ
問題は、WindowsがmallocからHeapAllocにどんな引数を渡してるか、だな
それはCRTの仕事でないの?
WindowsにmallocなんてAPIあるのか?
ん?MSVCRT内のmalloc実装の話をしてるんでしょ。
MinGWを使った場合も結局それが呼ばれるんだし。
LARGE_INTEGER同士で四則演算をするAPIってありませんか?
>>221
テケトーにマクロで書いとけ。
>>221
__int64 にキャストして普通の演算式を書いて、後はコンパイラに任せる。
>>221
メンバのQuadPartに対して演算しろ
mallocつかうとCreateThreadをつかった時にメモリーリーク起こすから使わないほうがいい
226デフォルトの名無しさん:04/07/27 21:17
>>__int64 にキャストして普通の演算式を書いて、後はコンパイラに任せる。

VC6.X の頃はこれで盛大にバグった結果が出てたから注意。
.Net 2003 では未確認。
心配なら単なる加減算でも llMulDiv とか使ったほうがいいよ。
ローカルフック使えばウインドプロシジャー使わなくてもどんなプログラムでもつくれますよね?
228184:04/07/27 22:09
みなさん、レスありがとうございます。


>>185
つまり、特に困らないのであればANSI Cで問題ないということでしょうか?

malloc()についてはみなさん使用されているのでしょうか?
オーバーヘッドが少なくてむしろ早いなんて意見もありますが、>>225みたいな
意見もありますし。。
_beginthread使えばいいじゃn
>>225
CreateThreadなんか使うなよ
>>230
なんかまずいの?
232200:04/07/28 01:35
>>231
CRTを一つも使わんというなら使ってもいいが
libc*.lib とか msvcrt*.lib とかリンクするなら
CreatThread は使わんのが身のため。

_beginthread 系が面倒見てくれる。
っていうかお前ら VS.NET とかの crt\src 見てないの?
ここはVS等の特定の開発プラットフォームを対象とした環境依存スレではありません。
「とか」
どのコンパイラにもたいていランタイムのソースくらいついてるだろ
BC++にはないけどな
C++Builderにはついてるよ(Pro以上)
CreateThread で作成したスレッドの中で処理が完結していて、かつ
そのスレッドで CRT を一切使用していなければ、
_beginthread 系 API を使う必要もないと思うのだけれども、間違っている?
>>237
そもそもマルチスレッドだよね?
>>237
そうだけど
静的インスタンスのコンストラクタ・デストラクタなどもCRTがらみなので要注意
>ランタイムライブラリに記録されている関数を使うスレッドは

記録されているクラスはいいけど関数を使ってはいけないのではないのですか?
ところでNEWはつかってもメモリーリークおきませんか?
>>239
ローカルインスタンスのコンストラクタ・デストラクタはOK?
225が言ってるのは、スレッド使うならマルチスレッド用のライブラリを使えということ。
同じスレッドでfree()するか、プロセス終了までfree()しなければ良いという考え方もある。
夏来ぬと目にはさやかに見えねども厨のレスにぞ驚かれぬる
244200:04/07/28 17:17
>>242
っていうか CreateThread 使うと
マルチスレッド用のライブラリの malloc を使おうが使わなおうが
メモリリークのもとなんだがなー。
原理の分かってない奴はゴタク並べてないで素直に_beginthread使えっての。
議論・討論したきゃ↓へ行け。いくらでも相手してやる。
http://pc5.2ch.net/test/read.cgi/tech/1049790146/
 ↑
あそこは初心者しか居ないよ。
MFCかSDKかとか、ダイアログベースかクライアント領域に描くかとか、
そういう議論ばっかw
>244-245
CreateThread()でメモリがリークするとお悩みの皆さんは、
他のリソースもがんがん洩らして、さぞお困りでしょう。

スレッドの状態はメッセージで把握しましょう。
ハンドルはちゃんと閉じましょう。
リンクすべきライブラリはマニュアルで確認しましょう。
CreateThreadを使おうと考えてる香具師は逆に何で_beginthreadがいやなんだ?
だいたい_beginthreadexならCreateThreadとほぼ同じ動作をしてくれるやん。
>>246
まるでここなら玄人がいるかのようだな
>>248
小文字やアンダースコアで始まる関数呼ぶと死んじゃうやつがいるんだよ。
TLS使われるのが嫌とか?
errno なんか使わないし、なんとか一つ API だけで許してもらえまいか、
というようなことでは。
msvcrt.lib や libcmt.lib をリンクせずに
全て自前でやってるなら許す。
やった。そのときはCreateThread使った。
作成したワーカスレッドでは CoTaskMemAlloc で頑張るので、許しては貰えまいか。
ランタイムライブラリ使わないのが俺のポリシー。
システムコール直叩き最高。
APIをランタイムライブラリだと勘違いしてる馬鹿がいるスレはここですか?
ランタイムライブラリを呼び出すインターフェイスと考えて差し支えなかろう
CreateThread()は、マルチスレド用ライブラリとシングルスレド用ライブラリの両方に入ってますか?
>>259
どちらにも入っていません。
なんかどうでもいい話になっているな
あたぼうよ
CreateDesktopとは何の為にあるんでしょうか?
どのように使うのか教えてください
>>264
両方見ましたが
どういう風に使うのか書いてる物を探すのが困難なので訊きました。
一つの関数内でささっと終わらせるサンプルばかりで
関数をまたがって処理するサンプルがありません。
なので、どういう風な事をどういう風にするかサンプルだけでもください
おい、お前。死ねよ
Shell32.dll内の-31751番目の文字列らしき物を取得しようと思い
 hModule = LoadLibrary("C:\\Windows\\system32\\Shell32.dll");
とやり
 LoadString (hModule, -31751, Buffer, 64);
とやったのですが
何も返ってきません

このShell32.dllの-31751番目はどうやって得たかと云うと
レジストリをinfotextと検索して(既定)がマイ コンピュータのinfotextに入ってる数字です。
どうしたらこの文字列らしきものを取得できますか?
>>267
hModuleはちゃんと有効な値を示しているのか?
っていうかロードタイムリンクしてあるからNULLが帰ってるんじゃないのか?
>>267
NT系だとdllのパスが違うが大丈夫か?
LoadLibrary, LoadStringの戻り値確認はしたんだろうな?
>>268-269
LoadLibraryはhModuleに格納してるので
if (NULL == hModule)〜と確認してましたが
LoadStringは確認してませんでした。

今やってみたら、LoadStringの戻り値もNULLでした
>>270
Shell32.dll 開いてみたけど、そんな ID の文字列無いよ・・・?
>>271
文字列じゃないみたいですね…
レジストリの名前がinfotextだったから文字列かと思ったんですが違うようですね。
失礼しました
つうか、
> このShell32.dllの-31751番目はどうやって得たかと云うと
> レジストリをinfotextと検索して(既定)がマイ コンピュータのinfotextに入ってる数字です。
> どうしたらこの文字列らしきものを取得できますか?
ここの意味がまったくわからん。
LoadString以前の問題じゃないのか?
CreateDialogで4つ目の引数にはダイアログボックスプロシージャへのポインタですよね?
LRESULT CALLBACK DlgProc(HWND , UINT , WPARAM , LPARAM );
こう宣言してるものだと、
CreateDialog(hInst,MAKEINTRESOURCE(IDD_DIALOG1),0,DlgProc);
こういう感じで呼び出せばよいのですよね?

error C2664: 'CreateDialogParamA' : 4 番目の引数を 'long (struct HWND__ *,unsigned int,unsigned int,long)' から
'int (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,long)' に変換できません。 (新しい機能 ; ヘルプを参照)
スコープ内でこの名前を持つ関数でターゲット型に一致するものはありません。

と、エラーが出てしまいます。どうすればよいのですか?
ダイアログの場合は
LRESULTでなくてBOOLです。

宣言の部分を
LRESULT CALLBACK DlgProc(HWND , UINT , WPARAM , LPARAM );

BOOL CALLBACK DlgProc(HWND , UINT , WPARAM , LPARAM );
と直してみてください
自己解決しました
>>275
だめでした。
というか、サンプル落としてきて、それはコンパイルできるのに、
それ真似て一から作るとエラーがでるんです。
落としてきたサンプルはwin工作部屋のダイアログベースアプリのとこです。
>>277
プロトタイプの方を実際に関数の方の両方の宣言を変更してみた?
もしやと思って、拡張子cppだったのをcにしたら動きました。
というか、これじゃ解決になってないですよね…。
なってる。
書き込んで気づいたんですが、型変換ですね。
探したら(DLGPROC)というのがありました。
282デフォルトの名無しさん:04/07/29 22:28
Windowsの電源を切るにはどうしたらいいですか?
普通にやるとPCの電源まで切れてしまいます。
ログオフってこと?
原理の分かってない奴はゴタク並べてないで素直に(DLGPROC)使えっての。
議論・討論したきゃ↓へ行け。いくらでも相手してやる。
http://pc5.2ch.net/test/read.cgi/tech/1049790146/
まずはWindowsに電源サブシステムを実装しろ
>>282
Windowsの電源OFF と PCの電源OFF
何がどう違のか、どうしたいのかを述べてくれ。
>PCの電源を切らずにWindowsの電源を切る
while(true{
 GetDC((HWND)1);
}
Windows 3.1までのDOSだけ状態へ戻るとかを想像した。
>>282
SetSystemPowerState
>>288
解読キボン
昔はWindowsを終了してDOSに降りるコマンドがあったんだよ
A:\>win
ウインドウを作成した後でオーナーを変更する事は出来ますか?
ふぁっきゅー
>>293
SetWindowLong(GWL_HWNDPARENT)で一応できることはできるが
MSDNにはするなと書かれているのでどうなっても知らん
296デフォルトの名無しさん:04/07/30 02:52
SetConsoleCtrlHandler関数で設定したシグナルハンドラがCTRL_C_EVENTを受信する場合と、
signal関数で設定したシグナルハンドラがSIGINTを受信するのは
同じ意味でしょうか?両方設定した場合はどちらが有効でしょうか?
>>295
Zオーダーとかがめちゃくちゃになるらしい
>>295
ぬー,微妙ですね.
変更は初めの一度だけなんで作り直す事にします.
>>293
SetParent
300デフォルトの名無しさん:04/07/30 10:58
画像編集ツールを作っているのですが、
どうもグリッドライン表示するのにてこずってます。(デバイスコンテキストがいまいち理解出来てない)
HDCを二つ取得するんだろうけれど、実際にどういう流れになるかがよく分かりません。
それと、背景となる画像についてはデバイスコンテキストハンドルを開いてる間はずっと開放しないのでしょうか。
概略でもいいので、助言していただけると助かります。。
勉強しろとしか言いようが無い。
>>300
301のとおり。「猫でも分かる」サイトでも見て自分でやれ。
それだけでもあんまりなのでひとつだけ言っておくと、DCは画面描画を行うときに一時的に借りてくるものだから
使い終わったらすぐ返すのが基本。
303300:04/07/30 12:03
分かりました。。
一応これでも猫でも〜や他のSDK系のサイトを見てやってみたんですが。。
もう何度か読み直してみます。失礼しました。
>>303
まあがんがれ。ほとんどはDC取得->コンパチDC取得->描画->選択->Bitbltって感じだろ。
お前は猫未満だ
306デフォルトの名無しさん:04/07/30 14:22
PathFindExtensionを使うとリンカエラーになるのですが
なにをリンクすればいいですか?
お前の脳
shlwapi.lib

とお前の脳
お前の悩
310デフォルトの名無しさん:04/07/30 15:02
C++でクラスを作りたいんですけど
クラスを作るごとにクラスごとにクラスの中の変数の値を違うものにしたいのです
俺がやりたいのは、クラスのインスタンスを作るときに、引数にキーの引数を入れると、
クラスの中のRegisterHotKeyの第二引数のIDをクラスごとに自動で別々のものに割り振るには
どうやりるのがプロのやりかたですか、教えてください
>>310
実にプロっぽくないコードだけど、コレで十分な場合っぽいのでこうする。
ついでに map にいれとく。
class hoge {
 static int _CookieBase;
 static std::map<int, hoge*> _Instances;
 int _Cookie;
 hoge() { _Cookie; = _CookieBase;++; _Instances[_Cookie] = this; };
 ~hoge() { _Instances.erase(_Cookie); };
};

32bit 環境だけで動けばいいとするなら、(int) this を ID にしてもいいし。
312311:04/07/30 15:12
>>32bit 環境だけで動けばいいとするなら、(int) this を ID にしてもいいし。
あ、RegisterHotKeyの場合使っていい範囲が限定されてるからこれはダメか。
313デフォルトの名無しさん:04/07/30 15:14
>>307-309
知らないならレスするなよ厨房はゲームでもしてろ
>>312
thisをIDにするのはいい考えなのでそうさせてもらいます
>>313
分からないなら、口出すなよ
class hoge {
 static int _CookieBase;
 static std::map<int, hoge*> _Instances;
 int _Cookie;
 hoge() { _Cookie; = _CookieBase;++; _Instances[_Cookie] = this; };
 ~hoge() { _Instances.erase(_Cookie); };
};
意味が分からないので僕にもわかるようにコメント付けてください
317デフォルトの名無しさん:04/07/30 15:51
当方、WindowsXPです。
外字エディタを使うことなく、外字ファイル(EUDC.TTE)に外字登録
したいのですが、方法がわかりません。

外字データはベクタデータです。
外字データは数が多いので、外字エディタを使っての登録は現実的
ではありません。

なにか、便利なツールとか、プログラミングの方法とか(VC++の開発
環境はあります。)ご存知の方、ご教示ください。


>>316
C++ スレで聞いてみてはどうでしょう?
I am Windows XP.
I have a dream.
GetWindowTextなどのテキストを格納するバッファを受け取る様な関数に
ATL、WTLのCStringや、std::stringを直接引数として渡すのは無理でしょうか
>>320はキング牧師
>>321
CStirngならGetBufferとReleaseBuffer
>>317
>現実的ではありません。

あなたの技術でツールの製作を行う方が現実的ではありません。

>便利なツールとか

板違いです
325321:04/07/30 17:16
>>323
無事にできました、必ずReleaseBufferも必要なんですね
レスありがとうございました
326デフォルトの名無しさん:04/07/30 18:35
VB6で作成したアプリのウィンドウが非アクティブ状態になっても、
キー入力を取得したいと思い、キーボードフックを使うべく
C言語でdllを作成しました。

VB側からこのdllを呼んで、他のアプリがアクティブになっても、
dll内でキー入力を捕まえることはできたのですが、
これをdllからVBアプリの方へ通知する方法がわかりません。

SendMessageなんかも、他のアプリのウィンドウがアクティブになった
状態だと通らないようです。

何か方法をご存知の方、お教えください。
>>299
オーナーと親は違う。SetParentでは親しか変更できない
>>327
どう違うの?
EnumChildWindowsで列挙できないとか?
>>326
SendMessage自体は通ると思うけど。
ダメならCOM経由とかコールバック関数は?
>>326
PostMessage
自分の作ったメッセージループのウインドーがGetAncestor(hwnd, GA_ROOT)で得られるウインドーですか?
デスクトップウインドーだったらヤバいので教えてください
>>328
MSDN嫁
>>332
MSDNのどのカテゴリでしょうか?
あの膨大な量のドキュメントから探し出す事は無理っぽいです

SetParent/SetWindowLong/GetWindow
Window Relationships>Owned Windows

あたりを読んでみましたが、ParentとOwnerの違いはかかれてませんでした
>>333
あるウィンドウに所有されているが、そのウィンドウの子ウィンドウでないウィンドウのこと。
335デフォルトの名無しさん:04/07/31 02:40
>>333
SetWindowPos で HWND_TOPMOST を指定するとよさげな感じ。

Parent は一つ上の親、Owner は一番上の親。
子→親 と 子→親→親→....→親の違いですね。
違う
>>333
CreateWindowでhwndParentを指定して、WS_CHILDなら子、ちがうならオウンド
338326:04/07/31 08:41
>>329-330
ごめんなさい。
SendMessage通りました。
ウィンドウハンドルの正常な値が渡されていなかったようです。
VBのフォームの表示後、すぐにハンドルを渡していたのを、
DoEventsを実行後に渡すようにするとちゃんと動きました。
一般的には、child windowはowned windowでもあるからややこしく思われてるのかな。
>>335
大嘘。

初心者には、書籍「APIで学ぶWindows徹底理解」の、
「ウィンドウについて詳しく学ぼう」の項がお勧め。
BMPを左右反転して表示する関数ありますか?
>>341
ある。それが何かは自分で探せボケ
自力で反転させても大した手間じゃないと思うが
>>341
あるらしいのでガンバレ

>>342
「ある/ない」を答えるだけのスレではないので
それが理解できるおつむを持ってないならこないでください
左右反転ってBitBltに負数を与えることか?
実行できないバージョンもあるんでない?
PlgBltでネーの?
>>333
Child Windowsの説明も読んで自分でdiffを取れ
>>344
(1) "「ある/ない」を答えるだけのスレではない" などとはどこにも書かれていない。
 勝手な妄想で断定するな。
(2) 341が求めているのが実際に関数の有無だけかもしれない。
 たとえば、各種ウインドウシステムのビットマップ関数の機能調査をしているかもしれないのだ。
 何を調べたいのかも述べていない以上それに対する最も適切な回答は有無を答えることだけである。
(3) だいたい、341には必要なことが何も書いていない。

以上。
StretchBlt なら確実。
350デフォルトの名無しさん:04/07/31 18:57
WindowsXP付属のサウンドレコーダーの起動中に、それが再生中・録音中のどちらか、
外部のアプリケーションからAPIで調べる方法はないですか?
ボタンのEnable状態を調べようかと思ったのですが、再生も録音もボタンの状態が
同じなので、区別できませんでした。
そういうことするアプリ、嫌いです。
>>351
ゴミレス (゚听)イラネ
>>352
ゴミレスに対するゴミレス (゚听)イラネ
>>1-1000
ゴミスレ (゚听)イラネ
355デフォルトの名無しさん:04/07/31 20:38
URLDownloadToFileでcgiファイルはダウンロードできますか?
うん
357355:04/07/31 20:47
では可能と言う回答の元質問いたしますが、
cgiファイル(URLはhttp://192.168.1.200/cgi-bin/test.cgiと設定)をダウンロードしようとすると戻り値0は返されるのですが、
指定したダウンロード先にファイルがありません。何度実行しても同様の症状が出ます。

ちなみにtest.cgiをブラウザ上で開いた場合はちゃんと表示され、HTMLファイルやZIPファイルのダウンロードには成功します。(ファイルもあります)

URLDownloadToFileは以下のように記述しました。
URLDownloadToFile(0, sUrl, sFileName, 0, 0)
358355:04/07/31 21:05
微妙な手段ですが自己解決いたしました。

ありがとうございました。
>>355
報告だけじゃなくて、その方法も記載しような。
>>359
教えて君キタワァ━━━━━━(n‘∀‘)η━━━━━━ !!!!!
夏全開だな
>>360が?
まったくだ。
364355:04/07/31 23:07
>>359
cgiファイルを格納しているサーバの設定弄ってたらダウンロードできるようになりました。

だから微妙な解決orz
cgiが一般人に読まれたら困るんでないかい

>>365
まさかcgiファイルそのものをダウンロードするなんて思ってないよね?
妙に気になる解決方法だな
このスレはレベルが高そうなので教えてください。
IEの右クリックのメニューに自アプリを登録して
リンク先のURLを渡したいのですがやりかたがわかりません。
とりあえず、レジストリに登録してIEのメニューに.htmを
追加するところはわかったのですが、その.htmから
exeを呼ぶことができません。IriaなどはActiveXDLLを
作って対応しているようなのですが詳しくはわからず困っています。
もしご存知の方がおられましたら教えてください。
よろしくお願いいたします。
>>368
WScript.Shell の Run メソッド
オートメーション。
>>396
そのメソッドは.vbsだと実行できるのですが
IEのメニューから実行するとHTMLとして実行されるらしく
エラーになってしまいます。
>>368
.htm から任意の .exe なんか呼び出せたら危険でしょうがいないと思うが。
>>372
やっぱりそうですよねー。そうだとは思ったんですけど
何かないかなーと。残念です。
自アプリをActiveX Exe対応にしたらええやん。
ActiveXの作れる開発ツールを持ってないんです。。・゚・(ノ∀`)・゚・。
MinGWでも作れるべさ
てか何で開発してるのさ?
hsp
fuck off
Delスレにいる奴だろう
Delスレの奴です。
Delスレの奴でしたか。
はい
384デフォルトの名無しさん:04/08/01 17:53
CreateCompatibleBitmapしたHBITMAPはDeleteObjectしますが、
(HBITMAP)LoadImageしたHBITMAPはDeleteObjectする必要は無いのでしょうか。
必要だす。古いマニュアルには載ってないんだけど
(おかげでずっと未解放のままだった。ちゃんと書いといてくれよ)
MSDN には DeleteObject しろと書いてある。
http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/resources/introductiontoresources/resourcereference/resourcefunctions/loadimage.asp
386385:04/08/01 18:04
でもよく読んだら、"不要になったらDeleteObject してもよい"
"プロセス終了時に自動で解放する" か。一応解放はされていたのか。
387384:04/08/01 18:10
>>385
(こことか)ttp://www.users.yun.co.jp/~studiowing/win32api/win-04.htm
DeleteObjectを1回はしているけど、
それはSelectObjectで関連付けたものを離す為の物で、
HBITMAPを消す為にもう一度必要なのに、なぜしないのだろうと思っていました。

Win32APIを研究したわけではなく、ネットのいろんな講座を見ただけだったので、
正しいか正しくないかずっと引っかかっていたのですが、
やっとすっきりしました。ありがとうございました。
388384:04/08/01 18:13
>>386
リロードしていませんでした。
なるほど、例え消していなくても、危険というわけではないのですね。
でも、HDCと一緒でなんかすっきりしないので
(HDCは遅くなることもあったっけ?)、消していくやり方で行きます。
Windowsのプロセス間通信てどんなものがありますか?
おしえて!

少量の情報をやりとりするだけで、軽いものがあれば
それがいいのですが。
>>389
COM最高!
>>390

COMてなんですか?googleで検索したら・・・・

"COM" は一般すぎる言葉のため、 検索には使用されていません。

(´・ω・`)
Common Object Modelでぐぐろう
PlaySound()とmciSendCommand()で同じWAVEファイルを再生しようとしたんですが、
PlaySound()のほうは普通に再生できたんですけどmciSendCommand()だと
パスがみつからないというメッセージがでます。これはファイルがみつからないってこと
ですよね?前者なら再生できるのに。どういう原因が考えられますか?
>>392
サンクス。Component Object Modelの略だったのは、ギャグだったと
想像します。:−)
あー、すまん。素で書き間違ったよ
COM
socket
WM_COPYDATA
FileMappingObject

あたりだな。
軽いならWM_COPYDATAがよさげ
Pipe,MailSlot,Clipboardもあるでよ
>387
待ってくれ (;´Д`) DeleteObject って、SelectObject の関連付けを
離す事が出来たっけ?

漏れなんか、むしろ SelectObject で明示的に関連付けを離さないと
DeleteObject してもオブジェクトは解放されないつー話を
ずっと信じてるわけだが
別に軽く無いよ。
楽なのはWM_COPYDATAだけど、
FileMappingObjectの方が軽い
TCP/IPでプロセス間通信を実装するよりはCOMコンポーネントにしたほうが良い・・・のかな
TCP/IPなんて一番重いよ
CでCOMコンポーネント書いてる人居ますか?
C++で書いて下さい
普通はやりませんかね?<Cで
>>399
軽いなら=軽いオブジェクトなら、だなスマソ
WM_COPYDATAなら、通知も気にせずできてお手軽だから、楽だよと。
>>398
DCに選択されたHGDIOBJをDeleteObjectしても当然失敗する
Win9xだと悲惨なことになるだろうな
407384:04/08/01 22:28
あれ、かなり間違えてますかね。
自分のやり方はこんな感じです。
間違えている所があったら教えてください。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1086258254&res=4&fi=no
普通 src dest
日本原理主義 moto saki
>>398
私もそう思ってましたが、それであってるんじゃないですか?
SelectObject の戻り値は大切に保存して、描き終わったら必ず
元に戻すようにしてますが。
410384:04/08/02 06:05
かなり勘違いして覚えていたようです。
もう一度勉強しなおします。
資料はまとなものを使ってください
412384:04/08/02 09:06
分かりました。
ファイルのバックアップをするツールを作っていまして
サイズと更新日時を調べて重複コピーを避けようとしています。

CopyFile() でコピーした同じファイルの更新日時が、一秒前後ずれています。
いろいろ試したところどうやらNTFS(Cドライブ)からFAT32(Dドライブ)にコピーしたときにのみ
起こっているような感じですが、仕様上の問題でしょうか?
比較にはGetFileTime()→FileTimeToSystemTime()として各要素を比較しています。

・更新日時が違うので上書きしたときの出力例↓
Directoryコピー C:\Documents and Settings\Administrator\デスクトップ\
       memo.txt
       overwrite src 2004/07/30 09:24:03.010 size 1242436
              dst 2004/07/30 09:24:04.000 size 1242436

414:04/08/02 19:25
あげさせていただきます
FATは偶数秒単位でしか時刻を管理できないから。
NTFS delays updates to the last access time for a file by up to one hour after the last access.
>>413
FAT ファイルシステムの更新時刻の分解能は2秒。参照時刻にいたっては1日。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/getfiletime.asp
"Remark" のところ参照。
物尻だな
419413:04/08/02 19:41
手持ちのMSDNにはそんなこと書かれてねー。
要するに互換性が無いよってことでいいのですね。
アバウトに比較しておきます。まあ簡易ツールなので。

>>416
英語力ぜろなんですが、NTFSでは更新されてもしばらくは更新日時を更新しない
ということですかね?ツール使用前に再起動必須でいいのかな。

ありがとうございました
>>419
更新日時じゃない。
>>413
サイズと更新日時で比較する他に、アーカイブ属性を使うという手段もあるけど、
どうなのだろう…
422413:04/08/02 19:45
>>420
あ、ほんとだ。指摘ありがとうございます。
423413:04/08/02 19:54
>>421
これは誰でも操作可能なようで少し不安になりますね。
コピーするときに自前のDBを作っちゃうのがもっとも確実でしょうか。
そこまで面倒かけるのもあれですが。
アーカイブ属性ってのは本来こういう用途に使うもんなんだけどな。
変更があったらアーカイブ属性がついてバックアップ時に消す。
バックアップ取ったときにMD5かなんかでハッシュ取っとけ
MD5だと一致しちゃうかもよ
>>426
なぜですか?
>413
コピー後にSetFileTime()は?
>>427
MD5ハッシュは128bitだろ。128bit(0.301x128=38.528桁)ぐらいなら一致しちゃうかもしれないじゃーん。

まあ、これが一致するならGUIDやUUIDも一致する危険性があると言えるけど。
>>429
アフォですか?
>>430
そう思った根拠をどうぞ。現実的でない話、というの以外で論理的にお願い。
いちいち煽りに反応しない
運のいい人なら一致するよ
おれは運が悪いから一生当たらないだろうけど
ジャンボ宝くじ1等が当たる確率のほうが高い。
通りすがりの者す。
まったく根拠がないので大嘘かもしれないが、概略計算してみた。
現在、56BitのDESが何とか解読可能らしいから、1台のPCで解読可能な限界が
64Bit程度とすると、128BitであればPC1台で解読不能な64Bit倍の組み合わせ
が残っている。
これを100億台のPCで分散して計算したとしても
2^64 / 10,000,000,000 = 1,844,674,407.
通りの組み合わせがまだ残ってる。
つまり100億台のPC をフル稼働して128Bitビットの暗号を解読して解析される
確立は 1/1,844,674,407 とかそんなオーダーじゃないのかな?
運のいい人なら一致するレベルではないような気がする。
MD5が一致する確立と、暗号の解読云々に何の関係があるんでしょうか。
俺も、MD5とファイルサイズが一致するのに、別ファイルなんて考える事はないと思う。
それに、アバウトなタイムスタンプも組合わせれば、故意にそんなファイルを作成しない
限り問題ないと思うけどなあ
MD5の一致でファイルの一致としてしまって、
万が一間違って国家機密ファイルを消してしまったらどうするのだろう
>>438 が国家機密ファイルを扱うような身分になることはない。安心しろ。
つーかMD5の中にファイルサイズも含まれてるんだら、
MD5とファイルサイズ両方調べても意味無いだろ
あと、CRC32とかも組合わせれば、まず問題ない。

でも、市販ソフトはそこまでやっていないと思うぞ。
つーか頭悪すぎる人多いのね。
430の気持ちが少しわかった。
>>435
どうでもいいけど、その確率は宝くじが2回当たる確率をはるかに上回るから、無いとは言えないんじゃ。
MD5は特定の条件下で結果が偏るから実際はそんなに確率低くないよ
もしMD5が核の発射ボタンだとしても使えますか?
SHA-1にすればだいぶ安全になるよ
>>443
>無いとは言えないんじゃ

通常のものなら問題ないと思うが、ないとは言えないね。
もちろん
>国家機密ファイル
などという重要なものにはまだ足りないとも思うけど。
少なくとも普通の人が適当に入力し世界で1人ぐらい当たってしまうほど、脆い
符号化でもないということ。
SHA512くらいでやっと安心かな
ミラー・ラビン法みたいな感じで、底を変えて複数回評価することでより一意性を高める方法が良いのかもね。
そこまでするなら、

1.日時が等しい(もしくは極めて近い)
2.サイズが等しい
場合に、
3.バイナリ比較

すればいいだけの話のような気もする。
>>450
1も2も弱すぎる
バックアップでしょ?
バックアップされてないファイル名があったらコピー。
もし、そのファイルが既存のもののコピーであったとしても、
それを検出する必要ってあるのか?
>>452
更新されてたらどうするの?
日付とファイルサイズが変わって無くても中身が更新されてたらどうするの?
>>452は視点がずれてる。
だれも新しいファイルの話などしてない。

というか、そろそろAPIの話題じゃないね。
そろそろぬるぽの話ですね。
そろそろガッの話です
457デフォルトの名無しさん:04/08/03 08:06
一致したらコピーしないんだから、そもそも上書きの心配はないだろ?
458デフォルトの名無しさん:04/08/03 09:36
       (\        /)
       (\\     //)
       (\\\  ///)
    / ̄ ̄    ∧Ω∧    ̄ ̄\  
   (/// ̄  ( ´∀`) ̄\\\) 
      ( \) ⊂   つ(/  )
       \\) │││ (//
        \) (_)__) (/
459デフォルトの名無しさん:04/08/03 22:03
教えて下さい。
IMEで現在変換候補選択中かどうかを知るにはどうしたらいいでしょうか?
MD5が一致する確率は、HDDが壊れる確率の1/1000000000以下だよ。
もちろん確率だから、最初の1回でヒットする確率もゼロでは無い。
そういう意味では、地球に隕石が衝突して、人類が滅亡する確率のほうが100000倍も大きいのだがな…

なんと!Windowsがハングする確率は10回に1回以上だぞ!?
これは「ほぼ間違いなく」Windowsは異常終了する(何が起きてもおかしくない)ってコトなんだが(w
100%成功する方法が存在するのに、失敗する可能性がある方法で
やろうとする神経がわからん。
>>461
100%絶対に成功するが10万年かかる方法と、
10%しか成功しないが0.1秒でできる方法があったとしたら、
藻前は絶対、10万年かけろよ。絶対だぞ。自分から言ったんだからな。
せいぜい長生きしてくれ。
463デフォルトの名無しさん:04/08/04 00:34
死んで
464デフォルトの名無しさん:04/08/04 01:30
>>462
100%絶対に成功する方法が
10%しか成功しない方法より
時間がかかることを前提にされてもな。

100%絶対に成功するが10万年かかる方法と、
10%しか成功しないが同じく10万年かかる方法とじゃ
100%絶対に成功する方法を選ぶだろ。

特にMD5計算で単純なファイル読み込み以上に時間がかかる場合はなおさら。
ファイルを読み込んでMD5なんて無駄な計算をしてから比較するより、
ファイルを読み込んでそのまま比較した方がいい。
プゲラ
ゲラプシュ
>>459
IME の動作を監視したいなら、対象のウィンドウで WM_IME_NOTIFY を処理する。
開いた時に IMN_OPENCANDIDATE、閉じた時に IMN_CLOSECANDIDATE が送られる。

実行時の瞬間に開いてるかどうかを調べるのは ImmGetCandidateWindow かな?
こっちは試してないのでよくわからん。
>>464
片方はあらかじめ計算しておけば読み込みにかかる時間は半分になるだろ
100%絶対に成功する方法が
この世にあることを前提にされてもな。
チェインハッシュコンテナを作らせたら恐ろしいものがみられそうだな。
>>460
10回に1回ってなんだ?起動した回数か?
winnyで逮捕される可能性と同じくらいだろ
逮捕騒ぎでwinnyやめた奴はMD5使えないよな
一致する可能性同じだから不安で
>>472
Winnyは実際に逮捕されたぞ。
winnyと同じとするならば、現実に起こりうる確率だが。
474デフォルトの名無しさん:04/08/04 11:04
スレ違いだったらゴメンナサイ

興味をもったので、仮想CDなどのソフトが実装している、仮想ドライブのアプりを作りたいのですが・・・
どのようなWinAPIを使えばよいのでしょうか?

また、参考になるドキュメントって存在しますか?
ググルときのキーワードの助言でも助かります。

テストとして、特定のディレクトリをドライブにしたり、仮想CDソフトのようにバイナリーファイル(イメージファイル)に複数のファイルをマッピングするようなドライブを作ってみたいと思っています。

よろしくお願いします。
475459:04/08/04 11:08
>467
ありがとう、できました!
よく考えたら選択ウィンドウだけじゃなく、単に入力開始/終了したかを
取りたかっただけだったので、WM_IME_STARTCOMPOSITIONと
WM_IME_ENDCOMPOSITIONでハンドリングするようにしたら、完璧でした。
>>474
まずddkを入手して慣れろ
話はそれからだ
>>475
ttp://d.hatena.ne.jp/einseul/?of=15
WM_IME_STARTCOMPOSITIONとかアテにするな
だそうな
478459:04/08/04 12:36
>477
ひー!でもIME2000以前なんて、手元に無いよぅ。問題が全角スペースだけなら、
まだ影響は少ないんですけどね。2002ならまともに動いてるみたい。

ATOKでも推奨しとこうかな(w
479デフォルトの名無しさん:04/08/04 17:48
ディレクトリを扱うDir()関数のようなものはないでしょうか?
:: を打ってみたのですがdir()関数が出てきませんでした
質問が間違っていたらごめんなさい
FindFirstFileとその仲間
481479:04/08/04 17:59
>>480
ありがとうございました!
482デフォルトの名無しさん:04/08/04 22:20
int LoadString(
    HINSTANCE hInstance,
    UINT uID,
    LPTSTR lpBuffer,
    int nBufferMax
)
という関数がありますが
第4引数 nBufferMax に渡す数を動的にしたいのです。

そこで、どうすれば文字列テーブルから1文字列のバイト数か文字数を取得できるのでしょうか?
環境は WinXP & VC++ & PlatformSDK です。

SizeofResource()は1セクション(複数の文字列の合計)のサイズを返すので使えないです。
>>482
atlcore.h の AtlGetStringResourceImage を読んでみると良いよ。
MFCのCString::LoadStringでも追ってみれば何かわかるんじゃ。
>>482
今月のCマガにちょうどのってたな。
よく覚えてないけど、_から始まるやつだった。
リストビューについての質問なんですが、
SuperTagEditorのように、大量のタグ、文字列や数値を扱う場合、

・リストビューに反映させておいて必要な時だけリストビューから直接データを取り出す
・リストビューに反映させているのと同じ内容のデータを常に保持しておき、リストビュー側に変更があったら保持してあるほうにも変更を加える

のどちらが効率としては良いのでしょうか?
その二択だと前者だけど、構造に自由がきかない。
仮想リストをつかうべし
>>486
どうしても性能あげたきゃ、出来合いコンポ使わず、自前でやれ。
(データとビューを分離して、ビューはリストビューじゃなく自前って事。)
>>485
あー俺も見た。あの新連載よさげ。
>>488
仮想リストビューでいいじゃん
491デフォルトの名無しさん:04/08/05 16:01
他スレでも聞いたんだけど返答が無かったので、こちらでも質問させて下さい。

実はC#からWin32をコールしていた時の不思議な現象なんですが、
開発機のXP Homeで、RichTextBox内の文字を選択して書式設定するために
EM_SETSELをSendMessageで文字選択してました。
これは全然問題なかったんですが、別のXP Pro機で動かしたところ、選択文字が
ことごとくずれてました。どうやら選択指定範囲が文字数ではなくバイト単位で
動作しているようで、SendMessageWにするとXP Proでもうまく動きました。

基本的にSendMessageならOSとして対応するのがSendMessageWか
SendMessageAかを勝手にハンドリングしてくれてると理解してますが、違うのでしょうか?
また、なんでXP HomeとProなんかでこんな違いが出てしまうんでしょう??
マルチポストウゼー
マルポ
ま、そう言わずに。
C#スレで聞くよりこっちで聞いてた方が相応しかったと考え直したもので。
>>491
C (C++) では SendMessage は
#ifdef UNICODE
#define SendMessage SendMessageW
#else
#define SendMessage SendMessageA
#endif // !UNICODE

なるマクロで、コンパイル時に SendMessageA または SendMessageW に変換されてます。
C# で user32.dll からインポートして使うなら、どちらを使うのか自分で指定するべき。
496491:04/08/05 17:10
なるほど、C#からだとこのマクロがどう作用するのかは分かりませんが、
要はどちらが使われるか保障がないんですね。
内部的にUNICODEに対応しているかどうか最初にチェックしないといけないわけですか。

ありがとうございました。
497デフォルトの名無しさん:04/08/05 17:47
VC++ Win32のTreeViewコントロールでビューのアイテムなどを
ダブルクリックしたかどうかを検出するにはどうしたらいいですか?

いろいろ調べたのですがわかりませんでした。
私の方で思いつく手段は GetClassLongでTreeViewウィンドウの
クラススタイルを取得して
CS_DBLCLKS を ORしてSetClassLongでセットする
ウィンドウをサブクラス化して、置き換えてたプロシージャ内で
WM_LBUTTONDBLCLKなどを検出

以上のような方法ぐらいしか思いつきません。
もっとスマートな方法はない物でしょうか?
WM_NOTIFYなどで受け取る方法でもよいのですが・・
(APIなのだからあるとはおもうのですが・・)


それとトップのテンプレ↓リンクきれてましたけど・・
Win32 SDK Programming
http://usr_vogel.at.infoseek.co.jp/Win32SDK/index.html
WindowsSDK入門
http://kerochan.no-ip.com/vcsdk/letsprog/letsprog-index.htm

NM_DBLCLKだったかな
サブクラス化
>>498-499以外には無いと思われ
501デフォルトの名無しさん:04/08/05 19:59
>>499-500
ありがとう。
いけそうです。
502デフォルトの名無しさん:04/08/05 20:00
>>498抜けてました、ありがとう
503デフォルトの名無しさん:04/08/05 21:00
DLLとexeの間で、任意のデータを共有する手法はあるでしょうか。
DLL呼び出しは呼び出し元と呼び出し先でプロセスが違うため、
ポインタの引渡しなどがうまくいきません。
引数、シェアードメモリ、ファイルマッピング…みんなダメっぽいです。

流石に、ポインタ型の変数を持っているクラスを共有する手段が無いというのは考えにくいんだけどなぁ…。
ファイルマッピングは使えるよ
>DLL呼び出しは呼び出し元と呼び出し先でプロセスが違うため、
ソンナバカナ
>>503
?????
何も考えずにできない?
C++のクラスならexeとdllで共有できない可能性はあるな。コンパイラの問題で。
>>503
どうせどこか間違えているだけだろ。

Win32APIもただのDLLの関数を呼び出しているだけ。
つまりWin32APIのポインタを引数に取る関数がうまく動くんだから、
自分で作ったDLLの関数も引数でポインタを受け取っても動かないはずがない。
子ウィンドウをドラッグすると親ウィンドウも一緒にドラッグする
ようにはどうすればいいのでしょうか?
MoveWindow
511238:04/08/06 01:03
>>503のはたぶん、システムフック用のDLLなんじゃないかな。
プロセス空間が違うので、当然ポインタの値も別のものだよ。

OS選ばずに済むなら、共有メモリでも使ってみてはどうかな。
238はミスです、スマソ
513503:04/08/06 13:04
再実験してみました。

DLL側の関数を呼び出す際にポインタを渡しても、
ファイルマッピングを行っても、
値かポインタかに関わらず、データの引継ぎができたようです。
しかし、static変数については値でもポインタでも0クリアされてしまいました。

…えーと、static変数は無理なのかな?
ちなみに、実験環境はXP Home上の.NET2003。

>>DLL呼び出しは呼び出し元と呼び出し先でプロセスが違うため、
>ソンナバカナ
あれ?違いましたっけ。情報元を失念したので探しに行ってきます。
514503:04/08/06 13:06
あー、ちょっと誤解を招きそうなので修正。

class CTest
{
public:
int LocalValue;
int *LocalPointer;
static int StaticValue;
static int *StaticPointer;
};

こいつのポインタを渡したり、CreateFileMappingとMapViewOfFileで共有させたりしたってことです。
>>514
クラスのインスタンスにはstaticは含まれていないから。
#include <iostream>

class A{
public:
int LocalValue;
int *LocalPointer;
static int StaticValue;
static int *StaticPointer;
};
class B{
public:
int LocalValue;
int *LocalPointer;
};

int main() {
std::cout << "sizeof(A)=" << sizeof(A) << std::endl;
std::cout << "sizeof(B)=" << sizeof(B) << std::endl;
return 0;
}
dll 側で _declspec (dllexport) int CTest::StaticValue とか、
exe 側で_declspec (dllimport) int CTest::StaticValue とか、
これ正確な表記かどうかわかんないけど、こういうことちゃんとやってる?

あと、
>あれ?違いましたっけ。情報元を失念したので探しに行ってきます。
そんなの探してもムダだから、その時間を使って Microsoft が丁寧親切に書いてくれてる
公式ドキュメントをちゃんと読んだ方が良いと思う。
517503:04/08/06 13:35
日本語読み違えてた。DLLは同じプロセスだった…

>>515
りかいしますた。

えーと、staticな変数も共有する方法ってあるんでしょうか?
必死にぐーぐる先生と相談中。見つからないなぁ。
>>517
方法もなにも、ふつうは何も考えずにできるってば。

本体側とDLL側で具体的にどういうコードを書いたのか示さないと、ア
ドバイスはできないと思うぞ。
例えば mozilla の文字列クラス nsString や nsCString は
 class __declspec(dllexport) nsString : public nsAString {
  . . .
 };
 class __declspec(dllexport) nsCString : public nsACString {
  . . .
 };
みたいに宣言されてる。これで、EXE<->DLL 間でクラスのインスタンスを
やりとりできるみたい。

要するに __declspec(dllexport) で方向性は間違ってないはずだっていう
ヒントだけだ ('A`)ノ 漏れもあんま詳しくないんでね。ゴメソ
Win32APIの話じゃ無いけどな。
521519:04/08/06 14:41
ごめん。無視して。ぜんぜん意味のない話だったね。
暑いから大変だ。
522503:04/08/06 14:42
てすと1

dll側
class CTest{public:    int LocalValue;    int *LocalPointer;    static int StaticValue;    static int *StaticPointer; };
int CTest::StaticValue = 0;
int* CTest::StaticPointer = NULL;
#define EXPORT extern "C" __declspec(dllexport)
EXPORT int TestFunction1(class CTest *test){    return 0;    }


exe側
dll側と同じCTestの定義

typedef int (*LPDLLFUNC1)(class CTest*);
int main(){    HINSTANCE hDll;    LPDLLFUNC1 lpDllFunc1;
   hDll = LoadLibrary("dll.dll");
   lpDllFunc1 = (LPDLLFUNC1)GetProcAddress(hDll, "TestFunction1");

   class CTest test;
   test.LocalValue= 100;    test.StaticValue= 200;
   test.LocalPointer= new int;    *(test.LocalPointer)= 1000;
   test.StaticPointer= new int;    *(test.StaticPointer)= 2000;

   int ret = lpDllFunc1(&test);

   delete test.LocalPointer;    delete test.StaticPointer;
   FreeLibrary(hDll);    return 0;
}

dll側でクラスがどうみえるか、ステップ実行で確認。
結果として、LocalValueとLocalPointerはそれぞれ100や1000が見えたが、StaticValueとStaticPointerは0が埋められていた。
あたりまえだ
524503:04/08/06 14:46
てすと2

dll側
EXPORT int TestFunction2(){
 HANDLE hMapFile;  class CTest *test;

 hMapFile = CreateFileMapping((HANDLE)0xFFFFFFFF, 0, PAGE_READWRITE | SEC_COMMIT, 0, sizeof(CTest), "test");
 test = (CTest*)MapViewOfFile(hMapFile, FILE_ALL_ACCESS, 0, 0, 0);
 if(test==NULL)printf("test = NULL\n");

 UnmapViewOfFile(test);  CloseHandle(hMapFile);
return 0;
}


exe側:dllのロード/アンロードなどは省略
 HANDLE hMapFile;  class CTest *test;

 hMapFile = CreateFileMapping((HANDLE)0xFFFFFFFF, 0, PAGE_READWRITE | SEC_COMMIT, 0, sizeof(CTest), "test");
 test = (CTest*)MapViewOfFile(hMapFile, FILE_ALL_ACCESS, 0, 0, 0);
 if(test==NULL)printf("test = NULL\n");

 test->LocalValue= 100;  test->StaticValue= 200;
 test->LocalPointer= new int;  *(test->LocalPointer)= 1000;
 test->StaticPointer= new int;  *(test->StaticPointer)= 2000;

 int ret = lpDllFunc2();

こっちも同じ結果。
525503:04/08/06 14:47
と、いうわけで、何が悪いのかさっぱりさっぱり。
色々と根本的な間違いをしている気がするんですが、脳みそパニックなのでアドバイスください…_| ̄|○
DLLがわとEXE側で両方でマップ作ってない?
527503:04/08/06 14:54
>>526
ファイルマッピングオブジェクトの新規作成に成功した場合は、新しいファイルマッピングオブジェクトのハンドルが返ります。指定したファイルマッピングオブジェクトが既に存在していた場合は、既存のファイルマッピングオブジェクトのハンドルが返ります。

なので、問題ないかと。
だーかーらー、static変数は単にスコープが限定されたグローバル変数なの!
お前の書いたやつじゃexeとdllがそれぞれ自分のやつを自分でいじくってるだけで
相手には何も伝わっていないのー
マイクロソフトが悪い
ファイルマッピングは使う必要ない
531503:04/08/06 15:00
>>528
>相手には何も伝わっていない
すいませんが、相手に伝える方法について教えていただけませんか。
キーワードだけでも良いので。
>>522
クラスや変数は__declspec(dllexport)書かないとDLLからインポートされないよ。
533528:04/08/06 15:09
>>531
>>516は?
ぶっちゃけ、DLLとの通信に(具体)クラスを使うな!と言いたい。
535503:04/08/06 15:17
メンバ変数に__declspec (dllimport) つけると怒られてしまいます。
dllexportなら怒られないけど…どっかに実例落ちてませんか(ぉ
いいかげん氏ねよ、能無し。
>>535
メンバ変数じゃなくて>>519みたいにclass __declspec(dllimport) CTestってクラスに書くんだよ。
>>535
(VC++ 使ってる仮定して)Visial Studio のドキュメントはインストールしてないの?

こうやるんだよ。

test.h
EXPORT class CTest{
 public:
   int LocalValue;
   int *LocalPointer;
   static int StaticValue;
   static int *StaticPointer;
};

dll.cpp:
#define EXPORT __declspec(dllexport)
#include "test.h"
EXPORT int CTest::StaticValue; //ココ EXPORT いるのかいらんのか知らんけど。
EXPORT int *CTest::StaticPointer; //ココ EXPORT いるのかいらんのか知らんけど。
extern "C" EXPORT int TestFunc() {...};
...

exe.cpp
#define EXPORT __declspec(dllimport)
#inlcude "test.h"
...
DLL側の変数の名前をEXE側はどうやってわかるんですか?
>>539
DLLにはシンボル名が埋め込まれています。
541503:04/08/06 15:53
一応、ちゃんとMSDNみながらやっているんですが…

class __declspec(dllexport) CTest{...};
はともかく、
class __declspec(dllimport) CTest{...};
の方は、static変数の宣言でこけてしまいます。
スタティックデータメンバの定義は許されないとか言われます。

#exe側にインスタンスがあるのに、exe側でクラス定義にimportって書くのは違和感があるなぁ。
>>539
超能力で。

Win32 とどう関係があるのか正直漏れにはわからん。
なんだかこのスレが悲惨なことになりそうだからスルーしまつ。
そもそも何でAPI形式でやる必要があるのか不明。
COM DLLではダメなのだろうか?
API形式ってオレ用語?
COMはレジストリー使うだろ?
>>545
直接ハンドルすればレジストリ使わないよ。
SHCreateStreamOnFileについてなんですけど
このAPIで取得したIStreamインターフェースのCloneを呼ぶとE_NOTIMPLが返ってきます。
自分で実装するしかないのでしょうか?
VC6.0SP6 Win2k
shlwapi.dll Ver 6.0.2800.1552
そうですよ
549547:04/08/06 20:07
面倒くさいですね。
MSはなんで実装しなかったんでしょうね。
MSの中の人も面倒くさかったんだろう
ほとんどなんも実装されずに終わったDirectDrawよりマシ
>>546
具体的に。
IHogeInterface *CreateHogeInterface();
をExportするんだろ。
普通はDllGetClassObjectじゃないの?
555デフォルトの名無しさん:04/08/07 01:53
こんばんわ、Win32のコモンコントロール(TreeView)で
キーボード入力を検出したいのですがうまくいきません。
お知恵をお貸しください。

TreeViewでアイテムにフォーカスがある状態で
Deleteキーを押すと、オーナーウィンドウの
WM_NOTIFYにNM_KEYDOWNが通知されるようにしたいのですが
意図したように動作しませんでした。

改行多いって出るので分割しますね
556デフォルトの名無しさん:04/08/07 01:54
プログラム部分は

case WM_NOTIFY:
{
NMKEY *pKeyInfo = (NMKEY *) lParam;

if ( (treeview_id == wParam) && (pKeyInfo->hdr.hwndFrom == treeview_handle) ) {
if ( pKeyInfo->hdr.code == NM_KEYDOWN ) {
if ( pKeyInfo->nVKey == VK_DELETE ) {
TreeView_DeleteItem(treeview_handle, item_handle);
}
}
}
}
break;

という感じです。

TreeView内でdeleteキーを押すと無反応です。
pKeyInfo->hdr.code で NM_KEYDOWN すら通知されません。
NM_KEYDOWNが通知されるのはマウス操作(VK_LBUTTON, VK_RBUTTON)のみでした。
どうすれば他のキーも通知されるようになるのでしょうか?

別件ですが
オーナーウィンドウが、子ウィンドウが終了したことを検知するためにはどうしたらよいでしょうか?
子ウィンドウ終了>オーナーウィンドウになんらかのウィンドウメッセージ通知
を想定しているのですが、これは可能でしょうか?
557デフォルトの名無しさん:04/08/07 01:54
あれ?なんかスペースがなくなっちゃいましたね・・・
>>557
&nbsp;
つけろ
>>556
どうしてもだめならキーフック使え
>>555
TreeView の編集部分は TreeView 自身とは別のウィンドウです。
従って、編集中のキー押下は TreeView 自身では取れません。
(WM_COMMAND の EN_CHANGE なら取れるかも)
このウィンドウは最初からあるわけでなく、編集を行うと作成されます。
TreeView_GetEditControl で編集部分のハンドルが取得できますので、
Window Procedure を差し替えてサブクラス化すれば、その中で
WM_KEYDOWN など何でも取れます。
トラブルを避けるため編集が終わったら元に戻すことをおすすめします。

オーナーが親であれば、WM_PARENTNOTIFY で WM_DESTROY が送られます。
ただし、その子の ExStyle に WS_EX_NOPARENTNOTIFY が入っていると
送られてきません。
561560:04/08/07 06:10
>>555
すみません。後で見てみたら質問を読み違えてたみたいです。
編集中じゃなくて、普通の状態でのキー押下ですよね。
それなら親ウィンドウに送られる WM_NOTIFY の TVN_KEYDOWN に
応答するだけで OK です。

>>560 は全然違うことを書いてるので無視してください。
562503:04/08/07 11:17
いまだにわかっていない503です。

とりあえず>>538のようにやってみたんですが、
exe側でクラス内のstatic変数まわりでこけてしまいます。
クラス宣言の外でstatic変数を宣言しないと外部参照が未解決って言われるし、
宣言するとdllリンクが一貫していないとか、dllimportスタティックメンバの定義は許されないとか言われます。
>>516のような宣言をしても一緒でした。
どうすれば解決できるのでしょうか?

MSDNライブラリ見ても、classのstatic変数を共有する方法なんてみつからないよう。
もうstatic変数にこだわるな
503は、staticの意味を知らない香具師。
それに対して、答えてるのはDLLでstaticを
使った事無い香具師。

…これじゃ、いつまで経っても解決しない。
だから、COM流にインターフェースだけ公開しろよ。
566503:04/08/07 12:37
うーん、私は確かにstaticの意味がわかっていないかもしれません。
ただ単に、クラス変数が作れるってだけで使っていますから。
今回のケースで必要なstaticに関する理解は、どこで得られるでしょうか。
良い教材(?)があれば教えていただけませんか。

それとは別に、DLLでstatic変数を使ったことのある/使っている方はいませんか。
簡単なサンプルとかを見せていただけると、大変ありがたいのですが。
1って表示されたぞ
-----------------exe--------------------
#include <stdio.h>
class CTest{
__declspec(dllimport) static int sta;
};
int main() {
printf("%d\n", CTest::sta);
return 0;
}
-----------------dll--------------------
#include <windows.h>
class CTest{
__declspec(dllexport) static int sta;
};
__declspec(dllexport) int CTest::sta;
BOOL WINAPI DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
{
switch(dwReason) {
case DLL_PROCESS_ATTACH:
CTest::sta = 1;
break;
case DLL_PROCESS_DETACH:
break;
default:
break;
}
return TRUE;
}
メンバ変数パブリックにするなんて汚ねえコードだな
569567:04/08/07 13:04
publicを消しちまった
>>566
基本的にstaticはモジュールごとのローカル変数と考えるべきで、
モジュールをまたいで使うことは少なくとも俺はない。
571567:04/08/07 13:17
dll5行目は
int CTest::sta;
だけでよかった
>>570
あなた違うものについて言ってるよね?
そんなことはないか
574503:04/08/07 13:38
>>567
exeの方が、

exe error LNK2001: 外部シンボル ""__declspec(dllimport) public: static int CTest::sta" (__imp_?sta@CTest@@2HA)" は未解決です。

って出てビルドできないんですが…。
ちなみに、テスト環境は.NET2003。
「リンクの冒険」オチでしたか…
dll.libをexeにリンクしているよなぁ〜?
そういうオチですか。
578503:04/08/07 14:15
アプリケーションの設計上、明示的リンクでいきたいんですが…。
579デフォルトの名無しさん:04/08/07 14:28
CWebBrowserクラスのNavigateで、自前のウィンドウに埋め込みウェブを表示させているのですが
そこのユーザーエージェントを制御したいのですがどうすればよいでしょうか?

Navigateに与える引数を工夫すれば実現できそうなのですが・・・
どなたか教えてください
>>578
loadlibrary 使え
582デフォルトの名無しさん:04/08/07 14:37
>>579
その質問最近どっかのスレで見たぞ
>>578
クラス・変数は__declspec(dllimport)とLIBでリンクする以外無理、ってMSDNのどっかに書いてあったような……。
>>578
こんなとんまなクラスではダイナミックロードなど無理だボケ
32ビットウインドーズコンソールアプリで画面に点を打ったりするみたいな
WIN32APIのHDCと同じようなことをやるにはどうやればいいですか?
587デフォルトの名無しさん:04/08/07 16:49
 
588デフォルトの名無しさん:04/08/07 20:07
 
>>586
コンソールアプリでも hWnd や hDC は取得可能だが?
そろそろ、>503 はスルーの方向でいいんじゃないか。
せっかく、レスしていても無意味だろ。
>>589
素直に知らないと言えよw
あるいは書き込むな
夏だね
593589:04/08/07 21:01
>>591
これで出来たが?

#include<windows.h>

#include<stdio.h>

intmain(void)
{
HWNDhWnd = (HWND)0x00000000L; // 君が書き込みたいウィンドウ(クライアント領域)のハンドル
HDChDC = GetDC(hWnd);
RECTr = {0, 0, 100, 100};
HBRUSHhbr = (HBRUSH)GetStockObject(WHITE_BRUSH);

FillRect(hDC, &r, hbr);
InvalidateRect(hWnd, NULL, TRUE);

ReleaseDC(hWnd, hDC);

return0;
}
594デフォルトの名無しさん:04/08/07 21:03
>>586
int10hのこと言ってるのかな?
>>593
だから書き込むなって
596589:04/08/07 21:06
夏だから・・・
スマソ orz
>>586
ウィンドウハンドルが欲しいという意味なら、
GetConsoleWindow() で取得できるので、あとはご自由に。
文字をつかって画面に点を打つという意味なら、
SetConsoleCursorPosition() かな。
>>593
あのままじゃ動かないな
>>590
素直に、自分にはわからないって言えよ

漏れはわかりませんが何か…orz
600586:04/08/07 23:15
そうじゃなくてドスプロンプトの画面のウインドーに
点を打ちたいのです
点は色の付いた点です
> ウィンドウハンドルが欲しいという意味なら、
> GetConsoleWindow() で取得できるので、あとはご自由に。
で理解できないのか?
602586:04/08/07 23:29
HDCでやったら普通のウインドーに点を打つのと変わらないのでウインドープロシジャーを
使わないようなやり方をしたいです
>>586
これで理解できないのなら、基礎からやりなおせ。

HWND hwndConsole = GetConsoleWindow();
HDC hDC = GetDC(hwndConsole);
RECT rc; GetClientRect(hwndConsole, &rc)
OnDraw(hDC, rc);
ReleaseDC(hwndConsole, hDC);
604586:04/08/07 23:38
ドスプロンプトに一番高速に書き込む方法はHDCしかないのならそれで諦めますが
他に方法があったら教えてください
HDCと同じ事をやりたいというから
HDCそのものを与えてやると
今度は、HDCじゃダメという

どうしろと。
キチガイとアホは相手にしないのが一番。
>>604
ウインドウを好きなところに移動した後、画面に油性マジックで描画。
ウインドウを移動させると、内容がずれるから注意。
GetConsoleWindow() で取得したウィンドウに対して、
Direct3D, DirectDraw, OpenGL などで描画すると高速だよ。

(呆れるのを通り越して、逆に楽しくなってきた)
いったん他のウインドウの裏に回ってしまうと描画が
元に戻ってしまうんですが
610586:04/08/07 23:51
DirectXを使うとドスプロンプトでやる理由が全画面表示したいだけなので
意味ないですよね
直接打つ方法ありませんか?
SetRegion() と SetLayeredEX() あたりを組み合わせると良いかも。
>>619
DirectX ってそのためにあるんじゃないの?
>>610
直接ってなんだよ
>>610 です orz
割り込まれた orz
>>610
そうなると、もうWin32の範囲では できない。
16bit DOS で使われたような方法をとらないとダメ。
全画面表示ふつうのウィンドウでもできるじゃん
>>614-615
なんか悪い事をしている気分になってきた
619586:04/08/08 00:00
メッセージループがあるので普通のウインドーは出来ても使いたくないです
いまから自分で考える事にします
ありがとうございました
620586:04/08/08 00:01
>>617
もしよろしければそのやり方教えてください
妙な質問するやつ→「ウインドー」
CreateWindowで然るべきサイズとスタイルを指定する
> いまから自分で考える事にします
> いまから自分で考える事にします
> いまから自分で考える事にします
> いまから自分で考える事にします
> いまから自分で考える事にします
>>619
GDIとメッセージループとウインドウにどんな関係があるんだよ

>>620
ChangeDisplaySetting
IDirectDraw*::SetDisplayMode
画面のサイズいっぱいで
キャプションもウインドウ枠も無いウインドウを作る
626586:04/08/08 00:07
>>622
解像度変えられますか?

>>624
それdirectX使ってませんか?
>>610
直接打つ方法は>>607に書いてある。
DirectX使わずに解像度変更するとウィンドウサイズが無茶苦茶になる。やるな。
解像度の変更の仕方くらい、見つけることが出来ないのかよ
630586:04/08/08 00:10
もういいです、さようなら
こんな程度のことが、自分の力で見つけられないようでは
見込み無いな
では次の議題に移ろうか。
ドスプロンプトに点を打つ方法を教えてください。
方法は、自分ではまだ考えてません。
Eclipseスレが激しく荒れてる件について私見を述べよ
夏だから
636デフォルトの名無しさん:04/08/08 00:18
なんだか荒れ気味だな
とりあえず579の質問に答えてやったらどうよ?
消化していこうぜ!
それは逃げだ
>>586はメッセージループが理解できないってことなの?
コンソールアプリでもウィンドウ作ってメッセージループつくれば普通に使えるんだけどな。
>>639
そんなことはみんな知っている
>>636
おまえ本人だろ。そしてMFCスレでも同じこと言ってるだろ。
無名のファイルって作る事できないんですか?
いちいちテンポラリファイルの名前を生成するのが
なんかスマートで無い気がするのですが。
ファイルじゃなくてデータベースに格納すればいいんじゃなかろうか
644586[:04/08/08 01:26
メッセージループはクラス化できないので使いたくないのです
>>644
出来るだろ?
ドアホが入れ代わり立ち代わり沸いて出るスレはここです。
647586:04/08/08 01:58
スレッド一つに一つのクラスを持たせたいので
メッセージループを作るとクラスがいっぱい作らないといけなくなるからです
スレッドひとつにひとつのクラスなら、
コンソールウインドウをホストにする限り
クラスひとつでいいはずなんだけど。
間違いなく根本の設計から大勘違いして馬鹿なことやってるな。
釣りでなければ、そうだね。
651デフォルトの名無しさん:04/08/08 06:58
プロセスが死んでいるタスクバーの右がわのアイコンを
消す方法はないでしょうか?

マウスを重ねると消えるのですが、どうプログラムして
いいのかわかりません。
タスクトレイのハンドルを指定してInvalidateRectとか
>651
マウスを重ねる。
タスクトレイのハンドルってどうやって取得出来ますか?
>>642
GetTempFileNameで我慢しろ。
>>654
HWND hwndTaskBar = ::FindWindow("Shell_TrayWnd", NULL);
HWND hwndTray = ::FindWindowEx(hwndTaskBar, NULL, "TrayNotifyWnd", NULL);
これでhwndTrayにタスクトレイのウィンドウハンドルが取れる。
>>656
ありがとう
そのウィンドウ名の定数でOSのバージョン制約とか受けませんか?
まさか消したいアイコンって自分の登録したアイコンじゃないよね
>>659
おかげさまで参考になりました。ついでにもうひとつ貼っておきます。
ttp://homepage1.nifty.com/kazubon/progdoc/tclock/taskbarhistory.html
ドスプロンプトに点を打ちたいのですが
MDMAは新宿のどこで買えますか?
>>661
OADG と VRAM でぐぐれ
663デフォルトの名無しさん:04/08/08 14:06
すみません質問したいんですが、CPUの稼働率?ってどうやって得ればいいんですか?
Win98だとレジストリから得られるみたいなんですがXPだとどうやればいいんでしょうか?
VisualC++歴半年のヘタレなんですが出来ますかね?
シェル(エクスプローラ)での「コピー」や「貼り付け」をAPIを使って実行しようとすると、
どのあたりの関数を使えばよいのでしょうか。
>>663
PdhOpenQuery
PdhMakeCounterPath
PdhAddCounter
PdhCollectQueryData
PdhCloseQuery
>>665
なんだか色々使いますね。。。
とりあえず教えてもらった関数名を頼りにググってみます。
プログラムを日本語版のwindowsでのみ動かしたいのですが
日本語版とそれ以外を判別する方法をご教授下さい。
デバイスコンテキストの座標はX軸とY軸はどこから始まりますか?
原点から。
リストビューのアブアイテムにテキストを設定する際に

LV_ITEM lvitem;
lvitem.mask = LVIF_TEXT | LVIF_PARAM;

というように LVIF_PARAM が設定されていると、
テキストが設定されないのは仕様ですか?
671671:04/08/08 18:07
アブアイテムて。サブアイテムの間違いです。
設定されると思うが?
673670:04/08/08 19:08
>>672
おやそうですか…。うむむ、なぜだらう。
表示されないんですよね。LVIF_PARAM を外すと表示されます。
どこかでおかしいことやってるのかな。
メニューとかステータスバーのGUIの部品が占有する領域は
ウィンドウのクライアント領域から除外されるじゃないですか、
それってどんな機構で実現してるんでしょう?
クライアント領域から alloc するというか、なんかそんな隠しメッセージでも
やり取りしてるんでしょうかね…。
>>674
そんなことはない。
>>674
子ウィンドウを上から重ねて描画しているんじゃないですかね。
メニューの場合も高さに合わせてクライアント領域を
ScrollWindow()か何かでずらしてるだけのような気がする。
でもそれだけだとチラつくはずなんで、どこかで
クリッピング領域を管理してるんでしょう。
677676:04/08/08 19:34
ScrollWindowは無いな。単に再描画されるだけか。
>>674
WM_NCCALCSIZE
VCで、フォルダーの一括削除を行いたいのですが、
ファイルやサブフォルダがあるので、
RemoveDirectory()だと、うまくいかないみたいです。

VBだとDeleteFolder()が使えるようですが、
これをCから使うにはどうしたらいいのでしょうか?



SHFileOperationかな
>>679
SHFileOperation
682679:04/08/09 08:18
>>680 >>681 thanks

main()
{
SHFILEOPSTRUCTpFileOp;
intrc;

memset( &pFileOp, '\0', sizeof( pFileOp));

pFileOp.wFunc = 3;/* 削除 */
pFileOp.pFrom = "d:\\test\test\*.*";
rc = SHFileOperationA( &pFileOp );
printf( "rc = %d\n", rc );

}

一応 rc = 0 で返ってくるけど、何故か消えていない・・・
pFromはdouble null-terminatedじゃないとダメだぞ。
pFileOp.pFrom = "d:\\test\\test\\*.*\0";
>>682
>pFileOp.pFrom = "d:\\test\test\*.*";

それ以前にC言語がダメダメ。
685682:04/08/09 08:46
>>683
すんまへんでつた。お蔭様で出来ました。
ありがとうございました。
"d:\\test\\test\\*.*"
0x5C
ビットマップの24bpp->16bpp変換コードを書いてます。んでCreateDIBSectionで
わからん部分があるんで教えて下さい。

内部でCreateDIBSectionで16bppのBITMAPを作成し、元画像(24bpp)をそこにBitBlt
する事で16bpp画像を作ってるんですが、BI_RGB(555)はいいとしてBI_BITFIELDS(565)の
時のDIBの格納形式が判りません…

ファイルに書き出す時にBITMAPFILEHEADER、BITMAPINFOHEADER、マスク情報(DWORD * 3)を
書いた後でCreateDIBSectionで取得したポインタから画像データを書き出してるのですが、
書き出した画像を見ると右に6ドットずれます。
しかも画像の左下から6ドットにマスク情報から起こしたような3色の点が書きこまれます。
(マスク情報のDWORD * 3ヶ?)
16bpp(BITFIELDS)の時、DIBSectionのデータはBI_RGBの時と格納形式が違うのでしょうか?
>>688
BITMAPFILEHEADERのbfOffBitsあたりが間違ってるだけじゃないの?
ハードディスクを自動でフォーマットするやり方教えてください
>>690が作ったソフトは使いたくないな。
692690:04/08/09 13:16
WinGroove2開発中でうs
DrawTextで文字を描画すると、文字の部分だけが白く縁取りさせてしまいます。
文字の部分以外は後ろに描画したものが透けるようにしたいのですがどうしたらよいでしょう?
SetBkModeかな
>>694
Thx
696688:04/08/09 16:01
>>689
ずばりその通りですた
つか、今までbmpファイル作るときそこは全部0のままにしてたよ…orz
ちゃんと値を設定したら直りました
マリガトン
スケルトンプログラムのShowWindow()とUpdateWindow()をコメント化して
メッセージループに入っても、WM_PAINTはきっちりプロシージャに届いてるようですが
どこがWM_PAINTを飛ばしてるんでしょうか
ウインドウの無効領域を見てDispatchMessage()が送出してる。
RegDeleteKeyをMSDNで見たらこう書いてありました。

>Windows 95: 指定されたレジストリキーとそのサブキーを、すべて削除します。
>Windows NT: 指定されたレジストリキーを削除します。サブキーを持つキーを
> 削除することはできません。

googleったらここの Build4が引っ掛かってこう書いてありました。
http://pc3.2ch.net/tech/kako/1023/10233/1023361418.html
>13 名前: デフォルトの名無しさん 投稿日: 02/06/07 17:11
>>10
>> 今調べてみたんですけど、双方の違いがよくわかりませんでした。
>
>NTでもサブキーがあっても削除できるじゃん

2000とXP向けにあるレジストリを一括削除したいのですけど、何か方法ありますか?
>>699
ある。たぶん再帰で書くのが簡単。
SHReg〜系になんかあったような気がする。
>>701
ない。と思う。
703699:04/08/09 18:12
>>700
再帰ですね、分かりました(マンドクセ)

>>701
SHDeleteKeyですね(チガイガ、ワカラン、オシエテケロ)

>>702
あたしゃ、どーすりゃイイんですかい?
>>702が嘘。
SHDeleteKey
Deletes a subkey and all its descendants.(以下全部消す)
こっちは9x系かNT系か関係ない。
>>698
ありがとです
707699:04/08/09 18:30
>>705
マジでっか!? 試してみヤス。
ありがとうございやした。
質問です。
GetDCでウィンドウのDCを取得・・・というのは必ずループ毎でしなければならないのでしょうか?
たとえばstaticを使用して一回目だけDCを取得するとかはダメなのでしょうか?

講座とかのサンプルソースを見てるとほとんど全ての物がループ毎にDCを取得しているので疑問に思いました。
教えてください。
HDCの座標を左下を0にする方法教えてください
>>708
スターティック使えばいいよ
>>708
CS_OWNDC
712708:04/08/09 18:59
ありがとうございました。
713デフォルトの名無しさん:04/08/09 19:24
Subnet Maskを知る方法はありますか?
>>714
本当にあるとは思ってもいませんでした
ありがとうございます
プログラムからマウスやキーボードの操作を制御するにはどうすれば
よいでしょうか?
マクロツールのようなものを作りたいのですが、何から調べてよいか
検討がつきません。
どなたかご教授おねがいします。

環境はC++、WIN32APIです。
>>716
>環境はC++
>環境はC++
>環境はC++
プログラムを使ってマウスを動かしたり、キーボードを打鍵したりすることは出来ません。
>>716
その前にWSHについて調べてみたら?
>>716
mouse_event
keybd_event
>>708
デバイスコンテキストの意味がわかってないね。
WindowsXPのエクスプローラでは
「表示」→「縮小版」を選ぶと画像のサムネイルが表示されますよね。
# 他のファイル形式もサムネイルされますが

このサムネイルをプログラムから最新の情報に更新する方法を教えてください。
現在、画像ファイルを編集するプログラムを作っているのですが、
画像ファイルを更新しても、その画像のサムネイル画像が更新されないのです。

マウスで右クリックすれば「縮小版を最新の情報に更新」を選択すればよいのは
判りましたが、プログラムから更新したいのです。
>>708
GetDC したら、不必要になった時点ですぐに ReleaseDC を呼ぶのが普通。
リソースがもったいない。
それに CS_OWNDC でも非クライアントを描画する必要があるでしょ。

>>716
むやみにキーボードやマウス操作を起こすよりも、操作対象のウィンドウの
種類によって、最適なメッセージを送った方がいいと思う。
ボタンを押すなら WM_COMMAND で BN_CLICKED を親ウィンドウに送るとか。
タイトルバー(CAPTION)をクリックして、離した瞬間を捕らえることって可能でしょうか?
WM_NCLBOTTUNUPで捕らえれそうに思えたんですが、クリックしてからボタンを離すまで
の間隔が1秒程度を超えると、WM_NCLBOTTUNUPが送られてこないみたいなんです。
もうちょっとクリック時間が長くなるとSIZEMOVEメッセージが流れてくるので離した瞬間が
わかるんですが、1秒〜3秒未満でマウスを移動させずにボタンを離されると、SIZEMOVEも
送られないのでお手上げです。
>>722
外してるかもしれないがSHChangeNotifyとか?
>>722
一番簡単なのは、Thumbs.db を削除しちゃうこと。
ウィンドウを、画面へ描画しているのは何のAPIなんでしょうか?
ShowWindow()かと思ってたんですが、WinMain()にそれがなくてもウィンドウは描画されますから
CreateWindow()がオブジェクトの生成から描画までやってるんですかね?
自分で確かめろ
729デフォルトの名無しさん:04/08/10 10:27
>>708
HDCはループごとに取得するのが決まりのようだと本かサイトかに
書いてあったが……。
途中でHDCが変わらんとも限らんし。
BiginPaintがWM_PAINT時にしか使えないからその影響でGetDC派も毎回取得するようになったんだろう。
>>727
> ウィンドウを、画面へ描画しているのは何のAPIなんでしょうか?

WM_NCPAINTのときのDefWindowProc。
WM_PAINT,WM_NCPAINTはシステムが描画の必要があると判断したときに発行する。
ShowWindow()は状態を変更するだけ。
732デフォルトの名無しさん:04/08/10 10:54
>>713 もお願いでつ。
>>731
ありがとです。
メッセージループの有無で
ウィンドウが描画されたりされなかったりしたので
デフォルトのプロシージャが何かやってるんだという結論に達してましたが
確信もてますた。
>ShowWindow()は状態の変更するだけ
参考になりました。
>>732
GetAdaptersInfoだ
>>732
GetIpAddrTable()
>>734-735
サンクス。ぐぐったら
ttp://homepage2.nifty.com/spw/tips/GetIpTable.html
が出ますた。
タスクバーのウィンドウプロシージャーを取得しようと思ったのですが、
うまくいきません。

hTaskbar = FindWindow("Shell_TrayWnd", NULL);
TaskbarProc = (WNDPROC)GetWindowLong(hTaskbar , GWL_WNDPROC);

FindWindowでハンドルは取得できているのですが、プロシージャーの取得で
失敗してしまいます。どうしたらいいのでしょうか。
>>737
Shell のプロセス内で実行してますか?
739737:04/08/10 16:49
>>738
CoCreateInstanceを使ってやるんでしょうか・・・。
はじめて聞いてよくわからないので勉強してきます。
740デフォルトの名無しさん:04/08/10 17:21
180度回転した文字を表示するにはどうすればよろしいのでしょうか?
「小」という字だったら 「ヽ|ノ」みたいな感じで。
ちなみに、普通の文字の出力方法なら分かります。
LOGFONT構造体の説明をよーく読む。
>>740
nEscapement かな?
CreateFontのnOrientation
!分かりました。ありがとうございました。
!分かりました。ありがとうございました。
 == わかりません。くそやろう。

いや、暑くてさ…
RegOpenKeyExでキーを開くとき、キー名で
::RegOpenKeyEx(HKEY_CLASSES_ROOT, "\\\\\\\\AudioCD", 0, KEY_ALL_ACCESS, &key);
のように前後にたくさん '\\' を指定すると開けるときと
「パラメータが間違っています(0x57)」が帰ってくるときの二通りがあります。
規則も良く分からないのですが、この辺の事情知っている人いませんか?

VC6SP5+PPack,Win2kSP4
747744:04/08/10 19:56
>>745
そんなつもりじゃなかったんですけど・・・。
!(分かりました。ありがとうございました。== わかりません。くそやろう。)
です。
>>747
!(false)
>>747
すまんすまん、ジョークジョーク
いや、暑くてさ
750一星 ◆Cppn/.YI3. :04/08/10 20:31
ダブルバッファリングをやってみたんだが、
なぜか2ピクセルほどずれ、空白が出来てしまう。
そこに点か何かを描画しようとしたが、送信範囲にはいっていないのか、
何も描画されない。
WM_PAINTが送られてきた時のBitBltの引数をいじってみたりしたが、
うまくいかない。
考えられる理由はある?
この説明だけではわからないというのなら、テストコード載せるけど。
2ピクセルずらせばいいやん
うわぁ〜〜
>>750
クライアント RECT ではなくウィンドウ RECT でアレコレしている、に1票。
ちゃんと動くサンプルって、Google とかで探せるとこになかったっけ。
CreateFileでFILE_FLAG_OVERLAPPEDを指定して開いたファイルは
LPOVERLAPPEDでアクセスする位置を指定するので
SetFilePointerは機能しませんよね?
でもSetEndOfFileを使う場合にはSetFilePointerが必要ですよね?

FILE_FLAG_OVERLAPPEDを使った場合SetEndOfFileは使えないのでしょうか?
755一星 ◆Cppn/.YI3. :04/08/10 21:10
>>753
その問題は以前さんざん悩んだことがあるので、
大丈夫だとは思うんだが……。
コードを載せておく。

HDC CreateDoubleBuffer(HWND hWnd,COLORREF color,int width,int height){
HDC hDC,hMemDC; BITMAPINFO *lpBMI; HPEN hpnRect; HBRUSH hbrRect;
HBITMAP hBitmap; LPBITMAP lpBMP;
hDC=GetDC(hWnd);
lpBMI=(LPBITMAPINFO)GlobalAlloc(GPTR,sizeof*lpBMI);
ZeroMemory(&lpBMI->bmiHeader,sizeof lpBMI->bmiHeader);
lpBMI->bmiHeader.biSize = sizeof lpBMI->bmiHeader;
lpBMI->bmiHeader.biWidth = width;
lpBMI->bmiHeader.biHeight = height;
lpBMI->bmiHeader.biPlanes = 1;
lpBMI->bmiHeader.biBitCount = 24;
lpBMI->bmiHeader.biCompression = BI_RGB;
lpBMI->bmiHeader.biSizeImage = 0;
lpBMI->bmiHeader.biXPelsPerMeter = 0;
lpBMI->bmiHeader.biYPelsPerMeter = 0;
lpBMI->bmiHeader.biClrUsed = 0;
lpBMI->bmiHeader.biClrImportant = 0;
hBitmap=CreateDIBSection(hDC,lpBMI,DIB_RGB_COLORS,(void**)&lpBMP,NULL,0);
hMemDC=CreateCompatibleDC(hDC);
SelectObject(hMemDC,hBitmap);
756一星 ◆Cppn/.YI3. :04/08/10 21:11
続き。

hpnRect=CreatePen(PS_SOLID,1,color);
hbrRect=CreateSolidBrush(color);
SelectObject(hMemDC,hpnRect);
SelectObject(hMemDC,hbrRect);
Rectangle(hMemDC,0,0,width,height);
DeleteObject(hpnRect);
DeleteObject(hbrRect);

ReleaseDC(hWnd,hDC);
return hMemDC;
}
>>756
WM_PAINT での処理は?
>>746
"\\\\\\test\\\\\\command\\\\\\\\\\1\\\\"
こんなのも可能(ただし保証なし)
MSDNで名前規則について調べろ
759一星 ◆Cppn/.YI3. :04/08/10 21:31
よくわからないことになった。
ウィンドウスタイルをWS_OVERLAPPEDWINDOWにするとうまくいった。
俺は、サイズ固定ウィンドウにするために、
それをWS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOXと
指定していたんだが、恐らくこれがおかしいのだと思われる。

>>757
case WM_PAINT:
{
/* ClSizeX・ClSizeY:クライアントエリアの大きさ
hMemDC:CreateDoubleBufferで受け取ったメモリーデバイスコンテキスト
*/
HDC hDC; PAINTSTRUCT ps;
hDC=BeginPaint(hWnd,&ps);
BitBlt(hDC,0,0,ClSizeX,ClSizeY,hMemDC,0,0,SRCCOPY);
EndPaint(hWnd,&ps);
break;
}
>>759
ClSizeX と ClSizeY はそれぞれ GetClientRect した RECT の幅と高さ、ですよね。
761一星 ◆Cppn/.YI3. :04/08/10 21:48
しまった。
AdjustWindowRectのところを見たら、
ウィンドウスタイルの引数が「WS_OVERLAPPEDWINDOW」のままだった……。
>>760の予想する問題点は、この関数を使って修正する様にしているから
大丈夫だと思っていたが、引数をよく見たら誤っていたというわけだ……。

わざわざ考えてくださって、みなさんありがとうございました。
猿山にカエレ!!(・∀・)
質問なのに独白調で面白いですね。と思った
age厨うぜぇ
>>763
ドクハク!
D&Dされたものがフォルダかファイルかを判断するにはどうすればいいですか?
また、フォルダの場合そのフォルダの中のファイルを操作するにはどのようにすればいいんですか?
GetFileAttributes
FindFirstFile
PathIsDirectory()という、そのまんまなモノがある
769デフォルトの名無しさん:04/08/10 23:52
他のアプリケーションを終了させるのはどうやったらいいんですか?
ウィンドウタイトルやウィンドウクラスからウィンドウハンドルを取得、ウィンドウハンドルからスレッドハンドルを取得、スレッドハンドルからプロセスハンドルを取得してTerminateProcess()

で、出来ない?
>>769
対象アプリケーションに終了させる仕組みが用意されてなければ
メインウィンドウにWM_CLOSE、TerminateProcess()など…
ただし、正常に終了できるとは限らない。
>>769-770
ExitProcess()でダメならSendMessage()、
それでもダメならTerminateProcess()かなぁ
>>770-772

ありがとうございます。強制終了ではなくて、終了の指示を出すわけですね。試してみます。
774770:04/08/11 00:22
DWORD ProcID;
HANDLE hProcess;
BOOL fResult = FALSE;
HWND hwnd;


hwnd=FindWindow(0,winname);
GetWindowThreadProcessId(hwnd, &ProcID);
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcID);
if(hProcess != NULL){
fResult = TerminateProcess(hProcess, 0);
WaitForSingleObject(hProcess, 500);
CloseHandle(hProcess);
}

てな感じで無事、殺せました。ありがとうございました。
RegOpenKeyExのsamDesiredで
KEY_CREATE_SUB_KEYを指定していない(KEY_READ指定)のに、
サブキーを作る事が出来ているのですが、私のプログラムのバグでしょうか?

以下のコードでassertに掛かって欲しいんですけど。
{
HKEY key1, key2;
LONG result;
result = ::RegOpenKeyEx(HKEY_CURRENT_USER, "Software", 0, KEY_READ, &key1);
assert(result == ERROR_SUCCESS);
result = ::RegCreateKeyEx(key1, "TEST", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_READ, NULL, &key2, NULL);
assert(result == ERROR_SUCCESS);
::RegCloseKey(key2);
::RegCloseKey(key1);
}
776デフォルトの名無しさん:04/08/11 01:57
画面のプロパティで設定したフォントを、
自分で作ったウィンドウの中の文字に適用したいんですが、
なにもしないと適用してくれません。
何か設定しないといけないんでしょうか?

ちなみに、

エクスプローラでは、左のフォルダにも右のファイル表示にも
アドレスバーにも適用されてます。

かちゅでは、ステータスバーには適用されてるんですが、
メインの3つのビュー、バーにはどれも適用されてません。

というところを見ると、
子ウィンドウ毎にも設定があるんでしょうか・・・
自分で作ったウィンドウのフォントなんか、システムが面倒見てくれるわけもなく。
逆にシステム設定を読んで、そのフォントで描画すればよし。
かちゅーしゃは知らんけど、好みのフォント設定できるようになってるだけじゃないの?
778776:04/08/11 03:03
>かちゅーしゃは知らんけど、好みのフォント設定できるようになってるだけじゃないの?

かちゅの設定に、ステータスバーのフォントなどという項目はなかったと思います。


以前、ある自作アプリのプログラムを変更中に、何かの拍子で
そのアプリに画面のプロパティのフォントが適用されたされたことがあるんです。
どこが影響したのか上手く特定できず、
開発を続けるうちになぜか元に戻ってしまいました。

なので、いちいちウィンドウ毎にフォントを設定しなくても、
画面のフォントを適用させる何かしらの設定があるんじゃないかと思うんですが・・・。
CopyIconの使いどころが分かりません。
特定のモジュールからLoadIconでアイコンをロードした後、FreeLibraryする前にCopyすればいいのですか?
また、LoadImageの場合も必要になりますか?

LoadLibrary>LoadIcon>FreeLibraryだけでも(見た目正しく)ロードできているので、
どこで使うのか調べきれませんでした。
>>774
TerminateProcess()は危険な香り
>>778
Delphi ですか?
Delphi なら TControl.DesktopFont というプロパティがあります。
ただし TCustomStatusBar と THintWindow は別の方法でシステムの
フォントを使っています。
>>774
QUERY_END_SESSIONとかそのへんのメッセージ投げるもアリ。
対象アプリの作りによるが
>>775
テストした OS は?
VBLANKのタイミングを取得できるAPIはありますか?
>>783
2000です
すみません。教えてください。

エクスプローラーみたいに、右ドラッグ時に
コンテキストメニューを表示したいのですが、
どのようにすれば良いでしょうか?

現在、IDropTarget::DropでIDataObjectまでは取得できています。
787766:04/08/11 16:00
>>767-768
無事解決できそうです。ありがとうございました。
788776:04/08/11 18:20
>>781
すみません、DelphiじゃなくてVC++です
GDIでダブルバッファリングと画面を60分の一秒ごとに高速に書き換える手法を教えてください
>>789
とても速いCPUと、とても速いビデオカードを買う。
while (1) {
 SetPixel(hdc, 0, 0, rnd());
 Sleep(1000/60);
}
そんなエサで俺様がクマー(AA略
>>786
右ドラッグを受けたいの?
それとも、エクスプローラに送りたいの?
WM_PAINTを始め、メッセージはメッセージキューに蓄積していくのでしょうか?

例えばWM_PAINTの処理を行っている最中にWM_PAINTのメッセージが何度送られても
次のメッセージが実行されるのは処理を全て終えてから、ということでしょうか?
>>794
基本的にメッセージはキューに蓄積されます。
WM_PAINT は違うけど。
>>795
WM_PAINTが違う、とはどういうことでしょうか?
もう少し詳しくお聞かせ願えませんか?
>>796
MSDN読め
798796:04/08/11 21:13
>>797
MSDNってどこのプロバイダですか?
>>796
WM_PAINT は、
・メッセージキューに他のメッセージがない場合のみ GetMessage で取得される。
・同一のウィンドウにたいして、複数の WM_PAINT があった場合(←妙な表現だが、
 例えば InvalidateRect() で2箇所の領域を無効化した場合)、それらは一つの
 WM_PAINT にまとめられてキューから取り出される(無効領域も合算される)。
>>799
ご丁寧にありがとうございました。
WM_PAINT と WM_MOUSEMOVE だけ特別扱いなんだっけ?
ユーザーメッセージで、同様に優先度の低いメッセージってできますか?
>>801
WM_TIMER も。ユーザには出来ないんじゃない?
ZIPでファイルを圧縮する方法について教えてください。
LZHの方法は猫でもで発見しましたがZIPの方法が載ってなかったので。
pkzip e filename

じゃなかったっけ
フォーマットの話だろ?
>>788
じゃあ自分で実装するしかないんじゃないか?

SystemParametersInfo の SPI_GETICONTITLELOGFONT で取得した
LOGFONT から CreateFontIndirect でフォントを作成して
WM_SETFONT で送る。オーナードローの部分もそのフォントを使う。

ユーザーが設定を変更した場合はトップレベルウィンドウに
WM_WININICHANGE で SPI_GETICONTITLELOGFONT が通知されるので、
これを受け取ったらフォントの設定を最初からやりなおす。
>>803
zlibを使って下さい。
>>786
右ドラッグを受けたいです。
                      ''';;';';;'';;;,.,                  ザッ
                       ''';;';'';';''';;'';;;,.,   ザッ
          ザッ            ;;''';;';'';';';;;'';;'';;;
                        ;;'';';';;'';;';'';';';;;'';;'';;;
                        vymyvwymyvymyvy     ザッ
               ザッ     MVvvMvyvMVvvMvyvMVvv、
                   Λ_ヘ^−^Λ_ヘ^−^Λ_ヘ^Λ_ヘ
     ザッ            ヘ__Λ ヘ__Λ ヘ__Λ ヘ__Λ
                __,/ヽ_ /ヽ__,.ヘ /ヽ__,.ヘ _,.ヘ ,.ヘ    ザッ
    /\___/ヽ   /\___ /\___/ヽ _/ヽ /\___/ヽ
   /''''''   '''''':::::::\/''''''   '''/''''''   '''''':::::::\   /''''''   '''''':::::::\
  . |(●),   、(●)、.:|(●),    |(●),   、(●)、.:|、( |(●),   、(●)、.:|
  |   ,,ノ(、_, )ヽ、,, .::::|   ,,ノ(、_, )|   ,,ノ(、_, )ヽ、,, .::::|_, )|   ,,ノ(、_, )ヽ、,, .::::|  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
.   |   `-=ニ=- ' .:::::::|   `-=ニ= |   `-=ニ=- ' .:::::::|ニ=|   `-=ニ=- ' .:::::::| < ageますよ
   \  `ニニ´  .:::::/\  `ニニ \  `ニニ´  .:::::/ニ´ \  `ニニ´  .:::::/   \__________________
   /`ー‐--‐‐―´\ /`ー‐-  /`ー‐--‐‐―´\-‐‐ /`ー‐--‐‐―´\
>>809
幅広すぎ。崩れまくり。
>>808
APIとかの標準的な方法では提供されていない。
shellexからレジストリをたどって自分で構築するしかない。
812776:04/08/12 05:03
Λ_ヘ^−^Λ_ヘ^−^Λ_ヘ^Λ_ヘ
>>808
エクスプローラのコンテキストメニューそのものを表示したいのならば、
IShellFolder.GetUIObjectOf( IID_IDropTarget ) を取得して、
自分で実装した IDropTarget の引数をそのまま転送してやればよい。
>>803
UnZip32.dllを探せ。LHZと大して手順は変わらん。
UnZip32.dllは有料ですよ
>>815
まあまあ
UnZip32.dll互換dllを作る
商用以外ならカンパウェア扱いだろ。
コレ使うといいよ。
こっちはフリーだから
http://www31.ocn.ne.jp/~heropa/funzip32dll.htm
>>810
ショボイ画面で見てんじゃねーよ
821デフォルトの名無しさん:04/08/12 11:48
>>814 >>817 >>819
怪しいDLLは使いたくありません。
>>823-1000
怪しいzlibは使いたくありません
怪しいzipは使いたくありません
怪しいWIN32APIは使いたくありません
怪しいサイト=2chで質問することは、なんともないらしい。
怪しい>>825を放置することは、何ともない
>>813
できました。
ありがとうございました。
ListBoxで教えて下され
ListBoxのウィンドウをLBS_NOTIFYを付けて作成し、親ウィンドウでLBN_DBLCLKを
拾ってるんですが、その時に渡されるWPARAMの下位ワードが常に0になってしまいます。

ヘルプを見るとLOWORD(wParam)の説明はidentifier of listboxとなっており
てっきりダブルクリックした項目の番号が渡されるものだと思ったのですが…
実際には何番目の項目をダブルクリックしようがLOWORD(wParam)は0のままです。
このidentifier of listboxは何を意味するのか教えて下さい。
オナガイシマス orz
メインプログラムのほかは一つしかスレッドが無いという仮定の元で、
スレッド内で以下のような感じでキー入力を受けつけることはできますか?

_beginthread(Threadmain);

ThreadMain()
{
c = getchar();
}
>>829
出来る
>>828
identifier of listbox = リストボックスの識別子

つまり、どのリストボックスかを識別する。
LOWORD(wParam)が0なら、CreateWindow() したときの
子ウィンドウIDが0のリストボックスということ
>>821
猫のサンプルで使っているUnLha32.dllの兄弟だってば。
http://archiver.wakusei.ne.jp/lib/main.html
>>831
成程、Windowのidでしたか。納得。
やりたい事はLBN_DBLCLKを拾ってLB_GETCARETINDEXを送ることで出来ますた
マリガトン
>>832
DLL Hell に悩まされるのはイヤンです
>>834
UnLhaが良くてなぜUnZipはだめなのか?
836デフォルトの名無しさん:04/08/12 16:48
メッセージループでアプリケーションに送られたメッセージを取得するにはどうしたらいいのでしょうか?
当初PeekMessage()で処理したMSG構造体に全てのメッセージが格納されていると思っていたんですが、
どうやらSendMessage()などで送られたメッセージ限定だそうで一部のメッセージしか取得出来ません。
ウィンドウプロシージャ以外の場所で全てのメッセージを取得する方法がありましたら教えてください。
>>836
ピークメッセージのループはどういうときに使うといいですか?
>>813
それは「表示するだけ」
839836:04/08/12 17:07
>>837
GetMessage()はメッセージが来るまで制御を返さないので
メッセージが来てない時に(アイドル時)に何か処理したい場合に使ってます。
>>839
PeekMessage()の戻り値を見ましょう
>>839
GetQueueStatusでメッセージがあるかどうか調べて、GetMessageとアイドル時の処理とを振り分けてみたら
>>836
PostMessageで送られてきたメッセージ限定だ。
ついでに言うなら、GetMessageでもそれは同じ。
843803:04/08/12 17:51
皆さんレスありがとうございました。だいたいのするべきことが分かってきました。
ちなみに途中に出てきた間際らしい人は自分ではありませんので。
まぎわらしい(←なぜか変換できない)
845836:04/08/12 17:57
>>840
現状ではPeekMessage()して戻り値がTRUEならGetMessage()でメッセージを取得しています。
PeekMessage()の戻り値がFALSEならアイドルループを回しています。
そこまではいいんですが、GetMessage()でも完全に全てのメッセージが取得出来ません。

先ほどSetWindowsHookEx()を使ってメッセージをローカルフックしてみましたが
上記と同じ状態でハマッテます。

>>841
やってみましたが上記の方法と結果は同じでした。

そもそもメッセージループではウィンドウなどに送られたメッセージはトラップ出来ないんでしょうか?
でもウィンドウにメッセージを送ってるのはメッセージループ内のDispatchMessage()ですよね・・・。
うーん。
846836:04/08/12 18:02
>>842
やっぱりそうですか。

if (msg.message == WM_MOVE)
 // 自分所有のどれかのウィンドウが動いた
このような事をしたいんですが。

>>844
まぎらわしい
同一スレッドからSendMessageされたメッセージは直接(Get/PeekMessageやDispatchMessageを介さず)
ウィンドウプロシージャに渡される。
コンソールアプリの文字出力でunicode文字の記号(ハートマークとか)を
表示したいのですが出ません。

ハートマークは、ファイル名につけて、dir表示は出来るのに、
どうしてwprintfでは表示されないのでしょうか。

表示する方法があったら教えてください。
849一星 ◆Cppn/.YI3. :04/08/12 18:12
ダブルバッファーを作った後にクライアントエリアが真っ黒になるのは
し方ないことなのか?
850836:04/08/12 18:15
>>847
はー、と言う事はメッセージキューにも入らないんですね。
通りでSetWindowsHookEx()でもダメなはずだ。

とい言う事は
SetWindowsHookEx(WH_CALLWNDPROC, ...);
こんな感じで保持している全ウィンドウに対してフック掛ければいけるのかな?
でももっと簡単な方法ないのかなぁ。
851836:04/08/12 18:32
SetWindowsHookEx(WH_CALLWNDPROC,...)
これはウィンドウハンドルなどの指定はないんですね。
これ1つで所有ウィンドウのメッセージをトラップ出来ました。

SetWindowsHookEx(WH_GETMESSAGE...)
これと合わせて使えばほぼ全てのメッセージが取得できそうな感じです。

みなさんご指摘ありがとうございました。
>>848
wprintfW
>>849
WM_ERASEBKGNDを処理してるから?
854一星 ◆Cppn/.YI3. :04/08/12 18:48
>>853
いや、そんなものはいじっていないが……。
CreateCompatibleBitmapで作った裏画面の色が黒だからだろ
856一星 ◆Cppn/.YI3. :04/08/12 18:55
>>855
あとから背景にしたいものを描画するしかないということ?
>>854
WM_ERASEBKGNDをWindowsが処理してるから?
E.YAZAWAが「黒く塗りつぶせ」って言ったから。
>>852
そういう関数は無いみたいです。
>>856
あたりまえだ、何も描いてないのに意図した絵が出ると考えるのはアホだ。
SetWindowsHookEx()の第3引数はローカルフックの場合NULLを渡しますが、
システムフックの場合、ここにDLLのインスタンスハンドルを渡す必要があります。
>>859
setlocaleしないとだめとか
863829:04/08/12 19:11
>>836
ヒントありがと
CRTに頼らず、 WriteConsoleWで出力しないとダメ。
>>848
swprintfでバッファに書いてからWriteConsoleで出力すれば出せる。
>>859
ある。ヘッダ見てみろ。
printf <=> wprintf (CRT)
sprintf <=> swprintf (CRT)
wsprintf <=> wsprintfW (API)
>>867 こうだろ
   printf ← _tprintf → wprintf   (CRT)
  sprintf ← _stprintf → swprintf  (CRT)
wsprintfA ← wsprintf → wsprintfW (API)
>>862
してる。
setlocale(LC_ALL, "");
setlocaleをしないと、普通のSJIS文字もでなくなる。

>>864-865
上手くいき、文字がでました!ありがとう!

>>866
検索したのですが.NET2003の中のヘッダには存在しないみたい。
_tprintfはMS限定拡張だからなぁ。
>>848
wprintfってAPIじゃないだろ
WriteConsoleWで直接書く
>>870
_tprintfは_UNICODEのときwprintfに#defineるだけだから
wprintfでダメならダメだろ
APIじゃないんだからwprintfWも当然ない
873デフォルトの名無しさん:04/08/12 22:18
#define HOGE = 100
こう定義されてる時、

int iValue = HOGE;
これでiValueに100って値が入りますよね。

けど、"HOGE_"はini ファイルとかtextファイルから読み込みたいんです。

例えばテキストファイルに"HOGE"とだけ書かれていて、
まずそれを読み込んで
CString cs =_T("HOGE");
こう云う状態になるとしますよね。

この後iValueに同様に値をセットするにはどうすればいいんでしょ。
何か言葉がうまくでてこなくて、解りズラ買ったらすんません。
マジでぜんぜん意味が分からん
超能力者щ(゚Д゚щ)カモーン
なんかよくわからんが、たぶん無理なことをしようとしている。
>>873
INIファイルを扱いたいならGetPrivateProfileStringもしくはGetPrivateProfileInt
テキストファイルで扱いたいなら自分で読み込むルーチンを作れ

こういうことでいいんだろうか?
INIファイルを扱いたいなら
INIファイルの内容が以下のようだとして
----hoge.ini-----
[Section]
Key = 100
------------------
コードが以下
int iValue = GetPrivateProfileInt("Section", "Key", 0, "hoge.ini");
878超プログラマー:04/08/12 22:33
>>873
typedef std::map<CString, int> map_type;

map_type valMap;
valMap[_T("HOGE")] = 100;
valMap[_T("HAGE")] = 200;

とか、やっといて

CString cs = _T("HOGE");
int iValue = valMap[cs]; //これでiValueに100が代入される
879873:04/08/12 22:34
こんな感じなんですが・・・

<aaa.h>
HOGE = 100

<bbb.txt>
HOGE

<ccc.cpp>
CString str;
(bbb.txtから1行読み込んで、strには"HOGE"と入っている)
880873:04/08/12 22:35
ぬお!!! 説明考えてる間に、878さんありがと!
多分それだと思います。

しかしSTL勉強してないのだった。勉強してみます。
881873:04/08/12 22:36
連続すんません、訳解らん話に付き合っていただいた
他の方々も、本当にありがとうです。
882デフォルトの名無しさん:04/08/12 23:37
しょぼい質問で申し訳ないのですが、
ウインドウプロシージャの中で、WM_PAINTを受け取った際の処理で
BeginPaint()とEndPaint()を2回実行して、
一回目は線を描いて、2回目は文字を書いたのですが、
線しか表示されないのはどうしてでしょう?
解決策などあったら教えてください。
二回実行しない
一回目のBeginPaintでアップデートリージョンが吹っ飛ぶから。
二回目はGetDCにしとけ。
もしこうしてるのなら
paint1(); //この中でBeginPaintとEndPaint
paint2(); //この中でBeginPaintとEndPaint

こう変えろ
dc = BeginPaint(hwnd, &paintstruct);
paint1(dc);
paint2(dc);
EndPaint(hwnd, &paintstruct);
886デフォルトの名無しさん:04/08/12 23:51
>>882
WM_PAINTで描画できるのは、"無効リージョン(更新リージョン)"の部分だけ。
最初のBeginPaint(),EndPaint()で、無効リージョンはすべて有効化されるので、それ以上は描画できない。
デバイスコンテキストを引数にもつ、"線を引く関数"と"文字を書く関数"を作れ。
BeginPaint(),EndPaint()は1回で済む。



887882:04/08/12 23:55
みなさん、丁寧にありがとうございます。
やはり、2回呼び出したのが間違いだったのですね。
>>885さん >>886さん
わかりにくい文章を解読してくれてありがとうございます。
今度は引数渡しでやってみます。
マウスカーソルが、あるコントロールの上にある時だけ
フラグを立てておきたいのですが、良い方法はないでしょうか?

特にカーソルがコントロールのウィンドウ外に出るときの
イベントが分からず、困っています。
マウスをキャプチャして、MOUSEMOVEが定石か。
まあ、TIMERでGetCursorPos+HitTestを使っても良いけど
定期的にGetCursorPosを呼び出す
とか一応考えられるけど、本当にそんなフラグ立ての必要があるのか、仕様を考え直した方がいいな。
891デフォルトの名無しさん:04/08/13 00:37
>>888
フラグを立てずに、判定が必要になったときに毎回調べては。
コントロールのRECTとマウスのPOINTをPtInRect()に渡して。
ScreenToClient()やClientToScreen()なども使うかも。
>>888
889の前者に一票だな。
意味もなくマウスキャプチャすんなよ…
>>891
WindowFromPointで一発じゃ
(・∀・)ニヤニヤ
896888:04/08/13 00:50
>>889-894
皆さんレスありがとうございました。
キャプチャしてPtInRect、またはChildWindowFromPointで判定が良さそうですね。
そのものずばりのやり方が無いようなので、逆に安心しました。
897891:04/08/13 00:51
891はウィンドウが下に隠れてるときが考慮されてないのでダメだな。
894が賢い。
_TrackMouseEvent使ってWM_MOUSELEAVEでフラグを消すじゃ
だめなのか?
899888:04/08/13 01:09
>>898
ありがとうございます!こんな物があったとは。使ってみましたが良好です。

実はコントロールの場合だと、何もしなくてもドラッグしたとき
キャプチャー状態になっちゃうんですよね。

ですので自前でキャプチャーするとその辺の兼ね合いが面倒だったもので…。
このやり方なら、かぶらずにできそうです。
900一星 ◆Cppn/.YI3. :04/08/13 11:01
『WPARAM』と『LPARAM』の頭文字はどんな意味?
WORD LONG
Woman
Lady
Winner Looser
Windows Linux
Wgowgo Luga
書くなよ。自分でツマランってわかってるだろ。
オモシレー
16ビットWindowsでは>>901の通りで、WPARAMはWORDと同じ、LPARAMはLONGと同じサイズだった。
(つまりLONG WndProc(HWND hwnd, UINT uMsg, WORD wParam, LONG lParam);って宣言でも良かった。キャストも甘かったし)
ちなみに今のWPARAMはUINT_PTR、LPARAMはLONG_PTRからtypedefされている。
APIというかアーキテクチャの話なんですけど

マルチプロセッサ環境で、スレッドが走るCPUはどう決められるのでしょうか?
スレッドを作ったときに割り当てられたCPUでずっと走るのか
それともコンテキスト切り替えが発生するたびに動的に変化するのでしょうか?
910デフォルトの名無しさん:04/08/13 13:34
サービスプログラムを作成しています。
ローカルシステムアカウントで動作しているサービスから、IEを起動したいのですがウィンドウが表示されません。
CreateProcessでIEを起動しているのですが、そのパラメータ(STARTUPINFO等)の問題でしょうか。
何か情報をお持ちでしたらご教授ください。
よろしくお願いします。
素朴な疑問です
次期OSロングホーンになると
Win32SDKはWin64SDKになるんでしょうか?
また、メッセージループ構造にウィンドウプロシージャという
構造は変化しませんか?
>>911
変化しないと思う。
ただ、ミドルウェアやライブラリに隠蔽された別スタイルでのやりかたが増えてくるかもしんない。
913デフォルトの名無しさん:04/08/13 13:44
質問です。Mutexオブジェクトは、開いているハンドルが全て閉じたときに破棄されますが、
それ以外に無理やりオブジェクトそのものを破棄してしまうことは出来ませんでしょうか?
ExitWindowEx
ExitWindowsEx
         ~
916913:04/08/13 13:52
>>914-915
いや、あの、たしかにオブジェクトは破棄されるだろうけど…
Windowsも終了しちゃうじゃん (;´Д`)
917911:04/08/13 13:55
>>912

>変化しないと思う。
覚え始めなので変化したらどうしようかと考えていました

>ミドルウェアやライブラリに隠蔽された別スタイルでのやりかたが増えてくる
APIをラップしたライブラリを使ったりするんでしょうか・・・・
数年先のことですので、お楽しみにしておきます。
Win32APIが.NETをラップしたものになるんじゃなかったのか?
>>909
うーん、どうなんだろうね?

今の Windows の実装がどうなってるか知らないけど、今後出てくる
Intel のマルチコア CPU では「暇なときは一部のコアの電源を落とす」
ということをやるそうだから、あるスレッドが特定のコアで動き続ける
という保証はなくなるはずだよね。
>>909
動的に変化するし、固定することも出来る。
TrackbarをAPIで作る方法を教えてください(CreateWindow)
UpDownなどはうまくいくのですがTrackbarだけうまくいきません。"msctls_trackbar32"
自己解決しました
>>911
Longhorn Development Kit(LDK)
925デフォルトの名無しさん:04/08/13 17:43
>>924
嫌だなあ、また新しいこと憶えなきゃなんねえのかよ……。
>>919
「暇なときに」コアの電源落とすのなら、スレッドが動いている間は
特定のコアで動き続けるんじゃないか?
927911:04/08/13 18:00
>Kit(LDK)
そのLDKでつくったものは、ユーザモードによっては
動かないという情報を耳にしたのですが、不便ではないですか?
なにLDKって。LonghornSDKでしょ。
メッセージループを書くとき if (PeekMessage(..., TRUE)) {} とぜずに
if (PeekMessage(..., FALSE) { if (GetMessage(...)) } とするケースを良くみますが、
どうしてわざわざGetMessageを呼び出しているのでしょうか?
TRUE/FALSEじゃなくてPM_REMOVE/PM_NOREMOVEでした
>>929
ソースの見易さを優先してんじゃないのかな?
パフォーマンスの差なんてほとんど無いだろうし。
MSがそうしているからじゃないかな
PeekMessage/hWnd=NULLではPostThreadMessageで投入されたメッセージを受ける事は出来ない。
PeekMessage/hWnd=-1なら受けられるけど、今度はウインドウメッセージが取れないから二度手間になる。
GetMessage/hWnd=NULLなら両方受け取れる。
>>910
「サービスにデスクトップとの対話を許可する」を「ON」にする
>>910
そもそも、サービスからUIプログラムを起動すんな。
>>935
(°Д°)ハァ? お前何様?
>>936
( ´,_ゝ`)プッ まあ、もちつけ。
Winsock2の各APIのエントリー番号が知りたいのですがわかる人いますか?
DISWINでdiswin.apiを作ったのですが、WinsockのAPIが登録できていないので知りたいです。
>938
ttp://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx
このへん見てガンガレ。
>>938
Dependencywalkerで見れる
939&940サンクス。わかりました。
ピークメッセージでメッセージをおくったウインドープロシジャーと
ピークメッセージのあるループはマルチスレッドですか?
>>942
ピークメッセージでメッセージは送れない。
>>943
送る関数のなまえわすれたので それでお願いします
シングルスレッドです
デスパッチメッセージでループの処理が止まるということですね?
ACCEL構造体のfVirtに指定するフラグFNOINVERTはメニュー項目を反転させないとあるのですが、
具体的にはどういう効果があるのでしょうか?
普通に{ FALT|FVIRTKEY, 'A', 1 }とかを指定しても、メニューが反転する様子は見られないんですけど。
ウインドウ・プロシージャ内で、インクリメント(デクリメント)するにはどうすればいいのさ?
i++(i--)
950デフォルトの名無しさん:04/08/14 22:05
プロセスで使ってるウインドウの一覧はどうやって取得するのでそ?
>>950
EnumWindows()
EnumChildWindows()
GetWindowThreadProcessId()
EnumThreadWindow は?
>>952
まずプロセスに所属するスレッドのIDを列挙しないとね
RegisterClassでウインドウクラスを登録するとATOMが帰ってきますよね?
後からこのATOMを使ってクラスのデータを取り出せると思うのですが、
*AddAtomとかを見ても文字列を登録するだけで、任意のデータ(WNDCLASSとか)を
登録する方法がわかりません。どうすればいいのでしょうか?
955950:04/08/14 23:30
>>951-953
アリガd
>>954
ウィンドウクラスの"名前"が登録されてるだけじゃね?
ふつうウィンドウクラスの情報がほしいときはGetClassInfoExだと思う。