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


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

Win32API質問箱 Build49
251 名前:250 :2007/01/25(木) 01:27:18
ああ、レジストリは関係なかった。。。
だけどShellExecuteHookが効かないよぅ


252 名前:デフォルトの名無しさん :2007/01/25(木) 01:43:31
ウィンドウの中にエディットコントロールがあって、
そのエディットコントロールにユーザーの操作でフォーカスが当たった場合、
WM_FOCUSイベントって
ウィンドウ -> エディットコントロールの順番に来るか
それともエディットコントロールにしか来ませんか?
後者の場合、ウィンドウ側がコントロールがWM_FOCUS受け取ったことを
察知する一番良い方法はなんでしょう?

253 名前:デフォルトの名無しさん :2007/01/25(木) 02:53:37
>>252
>察知する一番良い方法は
EN_SETFOCUSとか。

254 名前:デフォルトの名無しさん :2007/01/25(木) 04:02:58
Win2000,XP等で、特定フォルダやファイルへのアクセス時を禁止するアプリを作りたいと思っています。
そこで、ファイルがオープンされる前にそのことを検出でき、かつそれを拒否するための方法が知りたいのですが、
何かヒントとなるキーワードを教えていただけないでしょうか。

現状を説明しますと、
まずディレクトリを監視しようと考え、FindFirstChangeNotification や ReadDirectoryChangesW にたどり着いたのですが、
これはディレクトリエントリの更新を検出するだけで、ファイルがオープンされたりすることを直接的に検出できるわけでは
なさそうだと感じました(もし検出できても、そのアクションを拒否できなそうです)。
次にたどり着いたのは、フィルタドライバなる言葉です。
もしかしたらこれでイケるのかなと思ったのですが、ちょっと難しそうな方法だと感じていまして、もっと手軽な方法は
無いものかと思っています(無いのであればこの方向で突き進むのですが・・・)
なので、その辺のアドバイスというか、何かコメントしていただけると大いに助かります。
例えば、これの開発環境(IFSキット?)というのは、有料なのでしょうか。ココを見ると、無料っぽくはないですが・・・
ttp://www.microsoft.com/japan/whdc/DevTools/IFSKit/default.mspx
そして、これだけ買えばOKなのでしょうか?(できればあまりお金をかけたくないです)
もしかしたら何かの書籍付属のCDについてくるようなものだったりするのでしょうか?

ところで、Sysinternal の FileMon みたいなものは、どんな API でファイルアクセスを検出しているのでしょうか?

聞きたいことてんこ盛りになってしまってすみませんが、よろしくお願いします。

255 名前:デフォルトの名無しさん :2007/01/25(木) 04:49:43
>>254
CreateFileでdwShareModeに0を指定したら?
FileMonは知らないが、同じ会社のRegMonはカーネルを書き換えて
ローレベルAPIにフックを仕込んでいるらしい。

ファイルの存在そのものを隠したいとかいう話だと、確実にマルウェアとして
認定されるからやめておいた方がいいかと。
ttp://www.atmarkit.co.jp/fwin2k/insiderseye/20051109rootkit/rootkit_01.html

256 名前:254 :2007/01/25(木) 05:15:13
>>255
それ(CreateFile)だと目的を実現できないです。

実はファイルサーバでいくつかのディレクトリを共有していて、そこに数台のクライアントマシンでアクセスに行きます。
ところがファイルサーバの都合、ディレクトリごとのアクセス権を設定できず、全部のクライアントが全部の共有ディレクトリを
参照できてしまいます。

そこで、各クライアントに、「自分向けの共有ディレクトリ」だけを参照するような細工をしようと考えました。
つまり、各クライアントでファイルサーバ上のディレクトリへのアクセスを監視し、自分用以外のディレクトリのファイル操作を
拒否するようにしよう、と考えたわけです。

いや、そもそも環境を見直せという意見もあるでしょうが、何分いろいろ事情がありまして・・・

ウィルス監視ソフトなんかは、ファイルアクセス時にウィルスの有無をチェックして、ウィルス入りだったらアクセスを拒否
させますよね。
そんな仕組みを作ってみたいです(ウィルスのチェックじゃなくて、パスのチェックですが)。

# ちなみにそのURL、ちょうど今読んでたところです。おもしろいですね。


257 名前:デフォルトの名無しさん :2007/01/25(木) 05:52:42
君のスキルじゃ無理だろうけど SSDT

でもやっぱりシステムを直さないと根本的な問題は解決できない。
物事はシンプルな方法で解決すべきだよ。

258 名前:254 :2007/01/25(木) 06:57:05
>>257
それはあんまり手を出したくない部分です。いや、出せといっても出ないのですが。
むしろそれはフィルタドライバを書くよりも厄介というか、推薦されない気がするのですが、
SSDT をいじらないと実現できなそうでしょうか?
フィルタドライバじゃダメなんでしょうか?
お手軽なフックAPI 探しはあきらめモードなので、フィルタドライバを書く覚悟を決めていた
ところなんですが、それでもダメだと萎えそうです。
もしや、ネットワーク越しのファイルアクセスにはフィルタドライバは使えないなんてことが
あったりしますか?

環境直しについては、そう指摘いただくことはよく理解できるのですが、既に「いろいろな事情」を
言い訳にするまでもなく、本末転倒ながら「とにかく作ってみたい」という気分になってしまいました。
ですので、その方向でよろしくお願いします・・・


259 名前:デフォルトの名無しさん :2007/01/25(木) 07:14:34
小細工するより、ディレクトリにアクセス権を設定できるサーバに
変えた方がいいと思うが。

260 名前:デフォルトの名無しさん :2007/01/25(木) 11:14:09
>>259
まったくその通り。それが正論だ。

261 名前:デフォルトの名無しさん :2007/01/25(木) 11:17:27
仮にフィルタドライバ開発したとして、
各クライアントにそれインスコして回るのかw

262 名前:デフォルトの名無しさん :2007/01/25(木) 11:54:58
>>261
だよな。 最終的にブロッキングかけるのはクライアント側になるしね。

263 名前:デフォルトの名無しさん :2007/01/25(木) 13:30:31
ディレクトリで管理してればインスコするのは簡単だがユーザーにパーミッションをかけて制限するほうがもっと簡単

264 名前:254 :2007/01/25(木) 14:08:12
>>261
そのつもりです。
>>258 で書いたとおり、いまや作ることが目的なので、管理の手間についてはどうでもいいです。
趣味の問題といいますか。
いまのところ、
 ・これを端的に実現するための API はあるのか (無さそうだと思う)
 ・フィルタドライバじゃ実現できないのか (イケそうだと思う)
 ・SSDT をいじらないとダメなのか (そこまでは必要ないんじゃないかと思う)
という疑問と、自分なりの回答を持っていまして、それについてのコメントがほしいです。
すみませんが管理手法についてはカンベンしてください。


265 名前:デフォルトの名無しさん :2007/01/25(木) 14:26:33
できるかどうかはわからんが、
シェルエクステンション使って、explorerに表示されなくするとかの方が目的に近くね?


266 名前:デフォルトの名無しさん :2007/01/25(木) 15:16:15
ウィンドウに対する複数の操作(更新や移動、サイズ変更など)を一度に反映させるためのAPIがあったと思ったのですが、誰かお分かりになりますか?
API呼び出し→複数の処理実行→API呼び出しで反映 という感じだったと思うのですが・・・(´・ω・`)


267 名前:デフォルトの名無しさん :2007/01/25(木) 15:18:19
>>266
SetWindowPos() と UpdateWinodw() ?

268 名前:266 :2007/01/25(木) 15:26:31
いやそれらを呼び出す前に画面に反映させるのを禁止するAPIと、それらを呼び出したあとにすべての処理を反映させるAPIのことです。
おなじAPIで引数の違いだけだったかもしれませんが。

269 名前:デフォルトの名無しさん :2007/01/25(木) 15:28:27
>>265
explorerに限定するならいいかもしれんがPowerShellとか使われたらあかんでしょ。


270 名前:デフォルトの名無しさん :2007/01/25(木) 15:29:11
BeginDeferWindowsPos
DeferWindowPos
EndDeferWindowPos


271 名前:266 :2007/01/25(木) 15:43:24
>>270 キタ━ヽ(ヽ(゚ヽ(゚∀ヽ(゚∀゚ヽ(゚∀゚)ノ゚∀゚)ノ∀゚)ノ゚)ノ)ノ━!!!!

272 名前:デフォルトの名無しさん :2007/01/25(木) 17:52:04
>>264
その手のマルウェアはカーネルモードのAPI云々ってのが普通みたいだし
過疎ってるけどDDKスレに行ってみたら?
と、情報量のないレスをしてみる

273 名前:デフォルトの名無しさん :2007/01/25(木) 18:02:37
システム構築失敗しちゃって費用をかけずに修正しようとてんぱっているんだろ。
土下座の練習したほうがいいんじゃね?

274 名前:デフォルトの名無しさん :2007/01/25(木) 18:16:33
ttp://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200701/07010058.txt
これは254君かな?

275 名前:デフォルトの名無しさん :2007/01/25(木) 22:52:43
>>254
クライアント側に細工していいなら、CreateFile他にAPIフックしてアクセスされたくないディレクトリ
内の物だったらFALSE返すようにすれば?
逆にクライアント側に仕掛ける限り、クライアントのユーザーに解除できない方法は無いような気がするが。
いずれにしてもここまでの書き込みを読む限り、>>254には無理そうだな。

SSDTって何だ?というおれもまだまだヒヨッコか・・・


276 名前:デフォルトの名無しさん :2007/01/25(木) 23:30:18
SSDT = Scottish Six Days Trial

277 名前:デフォルトの名無しさん :2007/01/25(木) 23:40:15
>>264
>・フィルタドライバじゃ実現できないのか (イケそうだと思う)
イケなそうだと思う。
ファイル共有ってサービスとして実装されているのであって、フィルタ入れられるようなドライバスタックは無いんじゃない?
ネットワークドライバにフィルタをかませてもどのファイルのアクセスかなんてパケット解析しないと判らんだろうし。

オレも254には無理だと思う。

>>272
WDM(デバドラ)スレも見てるんで、おかしなやつを誘導しないようお願いします。


278 名前:デフォルトの名無しさん :2007/01/26(金) 01:45:32
SSDTの書き換えはVistaで使えなくなると聞いた。

279 名前:デフォルトの名無しさん :2007/01/26(金) 02:13:41
Vistaで〜が使えなくなる……って、どこみたらいいの?


280 名前:デフォルトの名無しさん :2007/01/26(金) 03:38:07
Vistaでっていうか、XPでもx64では使えないみたいだけどね。
http://www.microsoft.com/whdc/driver/kernel/64bitPatching.mspx

281 名前:デフォルトの名無しさん :2007/01/26(金) 06:34:04
質問なのですが
ある特定のアプリケーションが確保しているメモリに他のアプリケーションからアクセスしてメモリの内容を書き換えてしまう事はできるのでしょうか?
もしできるのであればアクセスさせないようにする、もしくはアクセスを検出するにはどうすればいいのでしょうか?
できればこれをまったく別の第三者的なアプリケーションにさせたいと思っています。どうか知恵を貸して下さい。

282 名前:デフォルトの名無しさん :2007/01/26(金) 07:00:28
何故MSの資料を読まない?

283 名前:254 :2007/01/26(金) 08:40:33
>>265
それだと直接パスを指定してのファイルアクセスとかはダメそうです。

>>272
DDKスレも見てみました。
前からドライバというものを作ってみたかったので、何はともあれ本を買ってみることにしました。
というわけで本屋に入り浸ってきましたが、お目当ての本は無かったので、また別の本屋に行ってきます。

>>273
そんな大げさな話じゃないです。
自分ちで使おうと思ってます。

>>274
いや、自分じゃないです。
でも、パスワードがかけられるフォルダって面白いかもしれないですね。
ついでにトライしてみるかもです。
でもユーザにパスワードを促している間は元のファイルアクセス API が止まっちゃうわけですから、
よくないことが起こりそうですね。

>>275
API 自体をフックしてしまうのは邪悪かなと思います。
クライアントでユーザーががんばって仕掛けを解除してしまっても、それはそれで構いません。

>>277
イケなそうですか。自分もそこが少し気になっていたところです。
でも、ネットワークドライバの上に、共有サービスのためのファイルシステムドライバのようなものが存在していたり
しないんですかね?
この方法は置いといても、ウィルス監視ソフトってどうやってファイルアクセスを横取りしてるんでしょうか。



284 名前:デフォルトの名無しさん :2007/01/26(金) 08:51:36
>>283
>それだと直接パスを指定してのファイルアクセスとかはダメそうです。
クライアントに突っ込む時点で、
そのサービスをとめられたら終わるんだから、気にする必要があるとも思えんが

そこまで気にするなら、やっぱりサーバーで対応するしかないだろ

285 名前:デフォルトの名無しさん :2007/01/26(金) 09:21:38
>>281
VirtualProtectじゃだめ?

286 名前:デフォルトの名無しさん :2007/01/26(金) 10:17:48
>>283
>この方法は置いといても、ウィルス監視ソフトってどうやってファイルアクセスを横取りしてるんでしょうか。

kernelからでしょ。だからデバドラって話になる。勉強しなおしてこい。

287 名前:デフォルトの名無しさん :2007/01/26(金) 10:48:09
すみません。基本的なことで申し訳ないのですが質問があります。

FindWindowで取得した、既存のウィンドウのハンドルは
CloseHandleするべき対象なのでしょうか?

288 名前:デフォルトの名無しさん :2007/01/26(金) 10:58:57
CloseHandleをMSDNで調べるといい

289 名前:デフォルトの名無しさん :2007/01/26(金) 11:23:50
CloseHandleすると当該ハンドルのカーネルオブジェクトが
その時点で強制的に破棄される

そんなふうに思っていた時期が俺にもありました

290 名前:287 :2007/01/26(金) 12:15:23
>>288
調べました。
ttp://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpipc/html/_win32_closehandle.asp

知りたいのは、FindWindowで取得したハンドルから、対象のオブジェクトを
破棄するのではなく、一定の操作を行い、その後、オブジェクトはそのまま
存在させています。
そこで、操作のためだけに使用したハンドルは開放するべきなのでしょうか?

MSDNを見た限りでは、ハンドルカウントが増えていくため、ハンドルを都度
破棄しないと、オブジェクトが終了しようとしても、できないのではないかと
考えています。

291 名前:デフォルトの名無しさん :2007/01/26(金) 12:47:14
CloseHandleが閉じることの出来るハンドルにウィンドウは無い。
FindWindowの解説に、取得したハンドルを閉じろとは書いてない。
そもそもウィンドウハンドルを閉じるAPIは無い。

>MSDNを見た限りでは、ハンドルカウントが増えていくため
どこにそんなこと書いてあるの?

292 名前:デフォルトの名無しさん :2007/01/26(金) 12:47:22
   ∩___∩ 
   | ノ      ヽ ! 
  /  ●   ● |   こいつすげえアホ 
  |    ( _●_)  ミ 
 彡、   |∪|   / .\ 
/ __  ヽノ / \ ...\ 
(___)   /   .│ ..│ 
            │ │ 
            /  ヽ 
            l..lUUU 
            .U

293 名前:デフォルトの名無しさん :2007/01/26(金) 12:52:10
      ∩___∩
   (ヽ  | ノ      ヽ  /)
  (((i ) / (゜)  (゜) | ( i)))
 /∠彡    ( _●_)  |_ゝ \
( ___、    |∪|    ,__ )
    |     ヽノ   /´
    |        /

294 名前:デフォルトの名無しさん :2007/01/26(金) 12:58:29
   ∩___∩
   | ノ      ヽ !
  /  ●   ● |   こいつすげえアホ
  |    ( _●_)  ミ
 彡、   |∪|   / .\
/ __  ヽノ / \ ...\
(___)   /   .│ ..│
            │ │
            /  ヽ
            l..lUUU
            .U

295 名前:坂田 :2007/01/26(金) 12:59:20
ちなみに、ウィンドウハンドルはウィンドウマネージャが管理しているので、
アプリケーションからClose操作できるもんじゃない

296 名前:287 :2007/01/26(金) 13:21:57
>>295
すみません。すごい誤解をしていました。

ありがとうございました。

297 名前:デフォルトの名無しさん :2007/01/26(金) 15:02:16
>>281
WriteProcessMemoryで書き換えが可能。
これを防止できる一般的な方法は今のところ無いかな。

nProtect GameGuardのようにこれを防ぐシステムもあるが
結構簡単に破られているのが現状。



298 名前:デフォルトの名無しさん :2007/01/26(金) 15:19:15
>>297
破る方法キボンヌ

299 名前:デフォルトの名無しさん :2007/01/26(金) 15:27:01
WinFSはまだかね?

300 名前:デフォルトの名無しさん :2007/01/26(金) 16:32:43
>>299
しばらくはない

301 名前:デフォルトの名無しさん :2007/01/26(金) 16:50:21
>>298
内側から実行するだけ

302 名前:デフォルトの名無しさん :2007/01/26(金) 17:06:27
>>301
何を?

303 名前:デフォルトの名無しさん :2007/01/26(金) 17:17:15
WriteProcessMemoryにはプロセスハンドルが必要。
だからプロセスハンドルに対する権限をできる限りなくすように頑張ればいいような気がする。
CreateProcessから操られたらだめだろうけどね。

304 名前:デフォルトの名無しさん :2007/01/26(金) 17:51:49
遅延IOとか仮想CPUとか西暦1940年代のテクノロジーがいまに復活すげえ

305 名前:デフォルトの名無しさん :2007/01/26(金) 20:34:20
IDirect3DDevice7の仮想関数テーブルを書き換えてフックをしようとしています。
このテーブルはread onlyだったため、VirtualProtectで属性を変更しようとしましたが、
XPSP2でERROR_ACCESS_DENIEDで失敗します(2KSP4では普通に成功)。

ぐぐって見たところ、IATの書き換えの話ですがPAGE_EXECUTE_READWRITE
なら大丈夫という話があったので試しましたが効果なし。

何か原因に思い当たる方はいませんか?

306 名前:デフォルトの名無しさん :2007/01/26(金) 20:50:56
>>305
>>282

307 名前:デフォルトの名無しさん :2007/01/26(金) 21:02:26
>>305
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpmemory/html/_win32_VirtualProtect.asp
真っ先に調べてありますが、該当する情報まったくないんですが・・・

308 名前:デフォルトの名無しさん :2007/01/26(金) 21:37:47
まずエスパー以外にもわかるように書くんだな

309 名前:デフォルトの名無しさん :2007/01/26(金) 21:55:16
言ってることはわかるが解法はわからんね
ハンドルはあるんだから権限とか関係なさそうだしなぁ

ってかvtableを書き換えるって発想はなかったわ

310 名前:デフォルトの名無しさん :2007/01/26(金) 22:14:06
俺もvtbl書き換えてるけど、XPでも普通に動いてるな。
VirtualProtectでPAGE_EXECUTE_READWRITEにしてから書き換えてる。
むしろ305がどこで失敗しているのか疑問。

311 名前:デフォルトの名無しさん :2007/01/27(土) 00:16:00
APIのドキュメントは新しいのに限るからVISTAのSDKをインストールした。
日本語ドキュメントなんか誤訳がおおいから論外だな。

312 名前:デフォルトの名無しさん :2007/01/27(土) 18:34:48
関連付けされてない画像ファイルを「写真の印刷ウィザード」で開くには
どうすればよいのでしょうか?
関連付けではDropTargetでphotowiz.dllを起こすようになってますが。。。


313 名前:デフォルトの名無しさん :2007/01/27(土) 22:24:37
リストの行を縞々になるように交互に色を変えようとしています。

LISTVIEWをサブクラス化してWM_NOTIFY内で
NM_CUSTOMDRAWを捕まえてるんですが、
CDRF_NOTIFYSUBITEMDRAWを返しても
CDDS_ITEMPREPAINTまでしか送られてきません。

CDDS_ITEMPREPAINT|CDDS_SUBITEMが送られてくる条件は
スタイル指定など他にすることがあるのでしょうか?

314 名前:デフォルトの名無しさん :2007/01/28(日) 05:03:23
質問時はあげようぜ?

315 名前:デフォルトの名無しさん :2007/01/28(日) 08:51:15
LISTVIEW 背景色 カスタム
でぐぐったら一発でみつかったけど

316 名前:デフォルトの名無しさん :2007/01/28(日) 09:08:38
それだと縞々にならないんです

317 名前:デフォルトの名無しさん :2007/01/28(日) 10:07:46
あきらかに>>315がいうと思われるサンプルで描画できてる

だいたいCDDS_ITEMPREPAINT|CDDS_SUBITEMは各セルに対する描画要求じゃなかったか?
行単位ならあとは自分で縞にするだけじゃねえのか?

318 名前:デフォルトの名無しさん :2007/01/28(日) 10:16:07
ウィンドウのサイズを固定したいんですけどどうしたらいいですか

319 名前:デフォルトの名無しさん :2007/01/28(日) 10:21:32
WM_GETMINMAXINFO

320 名前:デフォルトの名無しさん :2007/01/28(日) 10:23:26
WS_THICKFRAME

321 名前:デフォルトの名無しさん :2007/01/28(日) 10:29:49
>>319
できました。
ありがとうありがとう。

322 名前:デフォルトの名無しさん :2007/01/28(日) 10:35:28
std::cout << "cout\n";
::CloseHandle(::GetStdHandle(STD_OUTPUT_HANDLE));
std::cout << "cout\n"; // 表示されない

コンソールアプリのときコメントのように表示されないのですが、
これはGetStdHandleの戻り値は通常開放する必要はないということで間違ってないですか?

323 名前:デフォルトの名無しさん :2007/01/28(日) 11:29:09
そういうこと。
万が一閉じる必要があったとしても、ハンドルはみんなプロセス終了時にWindowsが閉じてくれる。

324 名前:デフォルトの名無しさん :2007/01/28(日) 11:59:14
>>323
おぅサンクスです

325 名前:デフォルトの名無しさん :2007/01/28(日) 14:23:44
ここで質問してるバカってPlatformSDKのドキュメントを読まないのか?

326 名前:デフォルトの名無しさん :2007/01/28(日) 15:15:12
>>325
むずいから読まんし、インストールもしとらん、
そこで、猫たんとここですよ

327 名前:デフォルトの名無しさん :2007/01/28(日) 15:38:07
猫を読んでるのにMFCでダイアログベースのアプリしか作れない奴。
しかも自分でクラスを書けない奴。
哀れだな。


328 名前:デフォルトの名無しさん :2007/01/28(日) 15:45:17
PlatformSDKしかないのか…
と必死で読んでたけど、
最近猫の存在に気づいたけど、
もうPSDKに慣れたけど、
もう必要ねーww

329 名前:デフォルトの名無しさん :2007/01/28(日) 15:55:52
逆にMFCでアプリが作れません

330 名前:デフォルトの名無しさん :2007/01/28(日) 15:57:57
>>327
漏れのにはMFC付いてないよ、いいな、そんなの付いているの使ってる香具師
だから、ここと猫たん。
もれは、クラスはおろか、プログラムもろくに書けんよ
クラス書けるんだったら、喪前がフリーのMFC互換のクラスライブラリ作って公開してくれよ
インストールぐらいはしてやるから


331 名前:デフォルトの名無しさん :2007/01/28(日) 16:11:32
なんかひとりアツい漢がいる

332 名前:デフォルトの名無しさん :2007/01/28(日) 16:25:00
会社が保存したファイルを強制的に暗号化するtool入れようとしてるのですが
これってCreateFile をフックしてるのかなぁ?

333 名前:デフォルトの名無しさん :2007/01/28(日) 16:48:38
NTFSの暗号化だったりして

334 名前:デフォルトの名無しさん :2007/01/28(日) 16:52:42
>>313です。リストビューをサブクラス化してWM_NOTIFYはヘッダー部分が、
リストビューの親のWM_NOTIFYでアイテム部分が飛んできているようです。
少し検索しましたがこの方法以外で行っているものは無いようです。

リストビューをサブクラスにしてサブクラス内でアイテム部分の背景色を変える方法ってないですか?

335 名前:デフォルトの名無しさん :2007/01/28(日) 16:57:45
PGPdiskとかはドライバじゃないの。

336 名前:デフォルトの名無しさん :2007/01/28(日) 17:00:01
>>334
つまらないことで時間を無駄にしないように
質問する前に簡単なサンプルで確認すべきということだな

337 名前:デフォルトの名無しさん :2007/01/28(日) 17:00:10
>>334
WM_PAINT来たら自分で描画とか?
そもそもリストビューのカスタムドローはサブクラス化なんてする必要ないんだが

338 名前:デフォルトの名無しさん :2007/01/28(日) 17:23:36
リストビュー サブクラス
でぐぐったらほとんど答と思われるのがみつかるけど
背景色が頭から離れなくて目にはいらないのだろうか?

339 名前:デフォルトの名無しさん :2007/01/28(日) 18:02:25
>>337
親を動的に変更したいのでできればリストビュー内で完結したいんです

>>338
もう一度探してみます

340 名前:デフォルトの名無しさん :2007/01/28(日) 19:41:56
>>332
普通はデバドラ

341 名前:デフォルトの名無しさん :2007/01/28(日) 20:26:08
>>340
こういうのも64-bitVistaからは出来なくなるんだよな?

342 名前:デフォルトの名無しさん :2007/01/28(日) 20:33:08
デバイスドライバまで組まないだろ。
ファイルシステムフィルタドライバだろう。

343 名前:デフォルトの名無しさん :2007/01/28(日) 21:35:59
これですかね…
http://forums.belution.com/ja/vc/000/117/79s.shtml

344 名前:デフォルトの名無しさん :2007/01/28(日) 21:40:24
GetDlgItemで取得したハンドルを関数に投げて
GetClientRectやると何故かハンドルが無効のエラー(1400)が出るんだが。

GetDlgItemで取得したハンドルを使って直後にGetClientRectやると成功する
なぜだあああああああああああ

345 名前:デフォルトの名無しさん :2007/01/28(日) 21:50:16
ヒント: static

346 名前:デフォルトの名無しさん :2007/01/28(日) 21:52:38
>>344
その関数を示してくれないとどうしようもないです。

347 名前:344 :2007/01/28(日) 22:01:11
こんな感じ。結構省いてるけど
関数に投げられた時点でハンドルが無効になっとる
hTabCtrlの値は0x03030303だった気がする。
値は関係ないよな・・。

static HWND hTabCtrl; /* タブコントロールハンドル */
hTabCtrl = GetDlgItem(hDlg, IDC_TAB);
SetSheetPos(hDlg, hTabCtrl, &hTabSheet[0], i);

VOID SetSheetPos(HWND hDlg, HWND hTabCtrl, HWND *hTabSheet, SHORT index)
{
RECT rc; /* サイズ取得様 */
LPPOINT pt; /* LPPOINT構造体 */

/* 初期化 */
pt = (LPPOINT)&rc;
/* タブクライアント領域取得 */
GetClientRect(hTabCtrl, &rc);
/* タブコントロール領域計算 */
TabCtrl_AdjustRect(hTabCtrl, FALSE, &rc);
/* 座標空間へマップ */
MapWindowPoints(hTabCtrl, hDlg, pt, 2);
/* ウィンドウサイズ変更 */
MoveWindow(*(hTabSheet + index), rc.left, rc.top,
rc.right - rc.left, rc.bottom - rc.top, FALSE);

return;
}

348 名前:344 :2007/01/28(日) 22:05:08
>>345
staticにしてるとまずいとか何かあったっけ?

349 名前:デフォルトの名無しさん :2007/01/28(日) 22:06:40
>>344
>GetClientRectやると何故かハンドルが無効のエラー(1400)が出るんだが
そのエラー値はどこから出てきたの?

350 名前:344 :2007/01/28(日) 22:07:59
GetLastError

351 名前:344 :2007/01/28(日) 22:08:42
あれだ、staticって関数内でしか使えないから
別関数に渡したりすると値はあるけど使えないとかそんなのか!?

352 名前:デフォルトの名無しさん :2007/01/28(日) 22:11:43
*(hTabSheet + index)

353 名前:344 :2007/01/28(日) 22:15:00
アドレスの取られ方がちげええええええええええええ


354 名前:デフォルトの名無しさん :2007/01/28(日) 22:26:32
>>350
GetClientRectは0を返してるの?
成功してるんならGetLastErrorの値に意味はないが。

355 名前:344 :2007/01/28(日) 22:30:40
あー、成功してる。
でもなんでRECTの値が入らないんだろう。

リソースがまずいのか

356 名前:344 :2007/01/28(日) 23:09:51
タブコントロールプロシージャの初期化で領域破壊が起こってた。


357 名前:デフォルトの名無しさん :2007/01/28(日) 23:43:49
>>341
そういうツールはまっとうな会社が出すんだろうから証明書を買えばいいだけ

358 名前:デフォルトの名無しさん :2007/01/29(月) 12:37:16
LoadBitmapでビットマップの画像を読み込んで、
リソースとして使えるようにしようとしてるんですが、WM_CREATE:で、
hdc1 = CreateCompatibleDC(hdc);
hBmp=LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance,TEXT("BMP_1");
SelectObject(hdc1, hBmp);
という感じで順番に画像を読み込んでいってるんですが、
この繰り返しを4つ以上くらいに増やした段階で、どういうわけか
コンパイルが通らなくなるんですけどどうしたらいいですか

359 名前:デフォルトの名無しさん :2007/01/29(月) 12:46:23
>>358
くりかえしもなにも、コピペされたそのソースの段階でおかしいが?
>hBmp=LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance,TEXT("BMP_1");
閉じ括弧たりないよ。

360 名前:デフォルトの名無しさん :2007/01/29(月) 13:12:00
コンパイルが通らないならコンパイルエラーを見ればよかろう

361 名前:デフォルトの名無しさん :2007/01/29(月) 14:49:26
>>359
すいません、それはコピペミスです。
コンパイルエラーは、
”問題が発生したため、Turbo Incremental Linker を終了します。
ご不便をおかけして申し訳ありません。
作業途中であった場合、その情報は失われた可能性があります。”
のウインドウが表示されます。
画像データ読み込みの処理が三つまではうまくいくのに、4つ目を追加したらだめになります。
ソースコードのコンパイル自体は通っていて、
brc32でリソース読み込みの処理が実行されたときに上のウインドウが表示されて
コンパイル手順が中断になります。

362 名前:デフォルトの名無しさん :2007/01/29(月) 15:04:18
そりゃコンパイルの問題じゃなくて、リソースに4枚目のビットマップを入れたから出たエラーだろ
C++のソース関係ないじゃないか。

bccのスレみると、「リソースだけのDLLを作れ」とあったが・・・

363 名前:デフォルトの名無しさん :2007/01/29(月) 15:10:46
>>361
それ、コンパイルエラーって言わないw

364 名前:デフォルトの名無しさん :2007/01/29(月) 15:48:43
>>361
リンカじゃねーか!!

365 名前:独り言 :2007/01/29(月) 16:41:17
CreateProcessWの第2引数はL""で直接書くのは駄目なんだな

366 名前:デフォルトの名無しさん :2007/01/29(月) 17:00:52
そうとう頭わるそう

367 名前:デフォルトの名無しさん :2007/01/29(月) 17:37:09
シグネチャみればわかる話

368 名前:デフォルトの名無しさん :2007/01/29(月) 18:09:15
LoadBitmapの第2引数は、MAKEINTRESOURCE・・・

スネーク、忘れてくれ

369 名前:デフォルトの名無しさん :2007/01/29(月) 18:19:11
GetFileInformationByHandle
で得られるファイルIDはシステムの状態に依存せず常に同じ値なのでしょうか?

370 名前:デフォルトの名無しさん :2007/01/29(月) 18:31:26
>>369
nFileIndexHighとnFileIndexLowのこと?
MSDNに詳しく書いてあるぞ。

371 名前:デフォルトの名無しさん :2007/01/29(月) 18:33:46
質問です。

WM_PAINTの処理を BeginPaint〜EndPaint ではなくて ValidateRect を利用して
処理しようと考えています。
GetDC にて DC を取得するタイミングはどので行うべきなのでしょうか?
WM_SIZE WM_WINDOWPOSCHANGED とかでしょうか?

372 名前:デフォルトの名無しさん :2007/01/29(月) 18:38:59
いつでもいい

373 名前:デフォルトの名無しさん :2007/01/29(月) 18:39:52
>>372
WM_NCCREATE 内はまずいんでない?

374 名前:デフォルトの名無しさん :2007/01/29(月) 18:45:55
>>371
ほんとにそんな処理が必要なのか?

GetDC呼ぶタイミングは、いつでもおk

375 名前:374 :2007/01/29(月) 18:48:36
リロードすべきだった・・・orz

いつでもとは言え、常識の範囲内で頼むw
ウィンドウ出来る前とか、ウィンドウ破壊したあととかは勘弁なwww

376 名前:358 :2007/01/29(月) 18:55:10
うーん、うまくいかない。プログラムで使用する画像を一つにまとめて、
画像の読み込みを一回だけにしてもだめでした
容量の小さい画像が2,3回の読み込みだったらうまくいくのに。
画像を減色したりいろいろしたけど、どうもある容量を超えるとエラーが出るようになってるみたい。
画像は外部から呼び出す仕組みままにしとくか…

377 名前:デフォルトの名無しさん :2007/01/29(月) 18:57:24
>>376
だから、C++Builderのリソースコンパイラの仕様なんだろ。
リソースコンパイラを代えるか小さいサイズで収まるように
するしかないんだろう。

378 名前:デフォルトの名無しさん :2007/01/29(月) 18:58:03
とにかく、Win32APIは関係ないから

379 名前:371 :2007/01/29(月) 19:24:39
WM_NCCREATE 以外で呼び出すといいんですね。ありがとうございます。


380 名前:デフォルトの名無しさん :2007/01/29(月) 19:26:27
すごく馬鹿だと思います

381 名前:デフォルトの名無しさん :2007/01/29(月) 19:33:55
うおおおVS.NETでやったらうまくいきました!
今日朝起きてからずっと12時間近くこれに悩んでました。
コンパイラの仕様だと教えてくれたかたありがとうございました。
これで先に進める。
それとBorland C++Compilerはbcc developerと共にごみ箱にポイしよう

382 名前:デフォルトの名無しさん :2007/01/29(月) 20:22:23
有償の開発環境くらい買えよ

383 名前:デフォルトの名無しさん :2007/01/29(月) 20:28:34
あした新宿か池袋行って買うことにします ありがとうございました

384 名前:デフォルトの名無しさん :2007/01/29(月) 21:43:21
VistaのShellExecuteHooksで質問した>>250だけど、
なんかGoogleにやっと引っ掛かった

http://groups.google.com/group/microsoft.public.platformsdk.shell/browse_thread/thread/8b174e5f5fbe20a9/5fc035caca36b168?hl=en#5fc035caca36b168

レジストリのPoliciesに値作らないと駄目なのね。
やっぱセキュリティ上の問題か。
実質的にVistaじゃ使えないってことだな。。。。。

385 名前:デフォルトの名無しさん :2007/01/29(月) 22:40:22
今、圧縮ソフトを作っているのですが、
処理が終わった後に自分自身を消去するプログラムって作れますか?
自己解凍形式を作りたいのですが。

386 名前:デフォルトの名無しさん :2007/01/29(月) 22:49:55
>>385
MoveFileEx(プログラムファイル,NULL,MOVEFILE_DELAY_UNTIL_REBOOT);
確か、こんなんでおk。

387 名前:デフォルトの名無しさん :2007/01/29(月) 22:53:54
ただし再起動が必要

388 名前:385 :2007/01/29(月) 22:56:04
ありがとうございます。
再起動が必要なのですか。
ちょっと微妙ですね。

389 名前:デフォルトの名無しさん :2007/01/29(月) 23:01:15
>>388
小汚い手段でもいいならバッチファイルでも使いなされ。

390 名前:385 :2007/01/29(月) 23:08:34
うーん、やっぱりユーザーに削除してもらうことにします。
ありがとうございました。

391 名前:デフォルトの名無しさん :2007/01/29(月) 23:29:04
再起動のいらない自己削除の方法なら何度か過去ログに出てるよ

392 名前:デフォルトの名無しさん :2007/01/29(月) 23:30:06
>>385
プロセスは重いからスレッド

393 名前:デフォルトの名無しさん :2007/01/29(月) 23:38:13
質問です。

他プロセスが作成したMutexをクローズする処理はどのように行えばよいでしょうか?
OpenMutexで取得したハンドルをCloseHandleで閉じても、自プロセスでのMutexがクロー
ズされるだけで、他プロセスのMutexは閉じれません。

カーネル関係のAPIでカーネルが管理している各オブジェクトハンドルが取得できるらし
いのですが…

394 名前:デフォルトの名無しさん :2007/01/29(月) 23:39:50
>>393
DuplicateHandle

395 名前:393 :2007/01/30(火) 00:00:00
>394
DuplicateHandleですね? 試してみます。
ありがとうございました。

396 名前:デフォルトの名無しさん :2007/01/30(火) 00:04:46
http://support.microsoft.com/kb/190351/ja

ここのサンプルで、CreateProcess後に、
CloseHandle(pi.hThread)をしている理由がわからん。

必要ないとしても、何で?

397 名前:デフォルトの名無しさん :2007/01/30(火) 00:12:13
閉じない限りいつまでもプロセスハンドルテーブルに残り続けてハンドルリークするから。

398 名前:デフォルトの名無しさん :2007/01/30(火) 00:16:18
>>397
んじゃぁ、pi.hProcessの有効範囲をWaitFor〜関数でチェックし、
そのタイミングで消しても別におk?

399 名前:デフォルトの名無しさん :2007/01/30(火) 00:22:41
>>398
もちろんおk
つーかWaitFor〜使う予定なら閉じたら逆にまずいだろ

400 名前:デフォルトの名無しさん :2007/01/30(火) 00:23:59
>>399
了解。
ありがとお

401 名前:デフォルトの名無しさん :2007/01/30(火) 09:43:35
mouse_eventを使えばアクティブウィンドウにマウスカーソル移動のメッセージを送ることができますが,
カーソル座標をアクティブウィンドウ内の座標系で指定するにはどうすればよいでしょう?

402 名前:デフォルトの名無しさん :2007/01/30(火) 10:00:43
ClientToScreen() とか ScreenToClient() とかの話?

403 名前:401 :2007/01/30(火) 10:05:08
>>402
まさに探し求めてたものずばりです
即レス感謝!

404 名前:デフォルトの名無しさん :2007/01/30(火) 12:51:57
OSの入力バッファ(DirectInput、Windowsメッセージより上位)に直接登録するのって、
どんなAPIとかでやるんでしょ。
まったく想像がつかないので、ヒントとか読むべきところとかもらえないでしょうか。
もしかして、ドライバとか?

405 名前:デフォルトの名無しさん :2007/01/30(火) 12:56:26
入力装置を自作

406 名前:デフォルトの名無しさん :2007/01/30(火) 12:57:02
SendInput?

407 名前:デフォルトの名無しさん :2007/01/30(火) 13:01:40
HIDドライバ
HIDフィルタドライバ
SendInput (keybd_event)

また自動実行マクロか

408 名前:デフォルトの名無しさん :2007/01/30(火) 13:25:51
>>405-407
ありがとう。ちみたちあいしてる。
読んでみます。

>>また自動実行マクロか
正解。ゴーストリプレイというソフトの存在を知って、すげーと思い、どうやって実装しているのか試してみようとおもった。
まずはキー入力制御から。Webアプリの自動テストとかにつかえそうだし。
業務アプリとかしかつくってない自分からするとカーネル領域への書き込みとかなんか聞くだけですげーし、
プロセス隠蔽機能/ステルス機能とか業務アプリとかでも役立ちそうだし、イイ勉強ネタだとおもったんで。
お返事、ありがとう。

409 名前:デフォルトの名無しさん :2007/01/30(火) 13:31:51
業務アプリのプロセス隠蔽なんて

410 名前:デフォルトの名無しさん :2007/01/30(火) 13:37:33
>>374
遅レス
ハンドラ側はリージョン更新だけで、DirectX で窓内の描画してるんじゃね?

411 名前:326 :2007/01/30(火) 15:09:56
はじめましてm(__)m
よろしくお願いいたします(^^ゞ

リソースから画像を読み込むたびにメモリが溜まっていってしまいます
DeleteObjectで解放しているのですが…、同じ画像を読み込む場合は大丈夫
なのですが、まだ読み込んでいない画像を読み込むとメモリが溜まっていって
しまいます。これはしかたのないことなのでしょうか?もしよろしければ
おしえていただけると幸いです。

こちらはWindows XPでVS2005を使っております
なにとぞよろしくお願いしますm(__)m

412 名前:デフォルトの名無しさん :2007/01/30(火) 15:44:12
ダイアログボックス上の文字列を多言語対応させるために
文字列リソースに各国語毎のストリングテーブルを作って、
表示させたい言語に応じてSetThreadLocale()してから
LoadString()し、これをダイアログ上のスタティックテキストに
SetWindowText()してたんだけど、2000/XPではちゃんと表示されてたのに
Vistaでは言語が切り替わらなくなってる・・・
SetThreadLocale()後にGSetThreadLocale()してみると確かに
ロケールIDは切り替わっているのに、ロードされる文字列は
デフォルト(OSの言語)のまま・・・・・
マニフェストで管理者権限を要するにして実行しても同じ。
同じ経験された方、理由の解る方、おりませんか?


413 名前:デフォルトの名無しさん :2007/01/30(火) 15:52:02
>>411
メモリリークなら、malloc()したのをfree()していないか、newしたのをdeleteしていないか。
DeleteObjectしなくて溜まるのはGDIオブジェクト。

414 名前:326 :2007/01/30(火) 16:12:05
>>413
ありがとうございますm(__)m
メモリリークなのですがmalloc()もnewも使ったことがないから多分
違うと思います。HBITMAP型の変数に上書きしていっていることに
何か原因があるんでしょうか?

415 名前:デフォルトの名無しさん :2007/01/30(火) 16:17:03
もうちょっと状況を詳しく
いったい何を持ってメモリが溜まると判断してるのか、溜まると何が困るのか。
LoadBitmap()使ってるならそう書け

416 名前:デフォルトの名無しさん :2007/01/30(火) 16:18:49
>>413
GDIオブジェクトがメモリを消費しない、みたいな言い方で誤解を招くな
それなりのサイズのHBITMAPをリークすれば、メモリも消費するべ

>>414
おい、ちゃんと上書きする前にDeleteしてるんだろうな・・・

417 名前:デフォルトの名無しさん :2007/01/30(火) 16:20:39
>>414
とりあえず、タスクマネージャでGDIオブジェクトの数が増え続けてないか確認しろ

418 名前:326 :2007/01/30(火) 16:22:14
>>415
すいません、LoadBitmap()を使っていてHBITMAP型の変数に上書き
するたびにタスクマネージャのメモリ使用量が増えていっているため
です。そのあとDeleteObjectで解放をしていますが次の画像を表示
するたびにメモリ使用量が1.37MBづつ増えていってしまうのです。

419 名前:326 :2007/01/30(火) 16:26:36
>>417
タスクマネージャでGDIオブジェクトの数が増え続けています。

420 名前:デフォルトの名無しさん :2007/01/30(火) 16:27:58
SelectObjectしたままDeleteObjectしてるとか。

421 名前:デフォルトの名無しさん :2007/01/30(火) 16:31:11
うんこしたままおしっこしてるとか。

422 名前:326 :2007/01/30(火) 16:31:26
>>420
それはないです、戻り値に0以外の数字を確認しました(DeleteObjectの戻り値)


423 名前:326 :2007/01/30(火) 16:34:06
>>421
??どういうこと??


424 名前:デフォルトの名無しさん :2007/01/30(火) 16:35:11
上書きしちゃったらDeleteObject()できないと思うんだが・・・

425 名前:デフォルトの名無しさん :2007/01/30(火) 16:40:12
最終後始末のことを考えなければ
DeleteObject(dc, SelectObject(dc, LoadBitmap()))
差し替えなんてこんなもんだろ?

426 名前:デフォルトの名無しさん :2007/01/30(火) 16:45:18
hbmp = LoadBitmap(・・・);
SelectObject(hdc, hbmp);
hbmp = LoadBitmap(・・・);
SelectObject(hdc, hbmp);
  ・
  ・
  ・
DeleteObject(hbmp);

↑な順番でやってるならGDIの基礎から勉強しなおしてこい。

hbmp = LoadBitmap(・・・);
hbmpold = SelectObject(hdc, hbmp)
SelectObject(hdc, hbmpold);
DeleteObject(hbmp);

こうするのが正解

427 名前:デフォルトの名無しさん :2007/01/30(火) 16:45:44
それは元の質問者の HBITMAP型の変数、が出てこないから

428 名前:デフォルトの名無しさん :2007/01/30(火) 16:46:27
>>427>>425宛て

429 名前:デフォルトの名無しさん :2007/01/30(火) 16:49:14
質問者とは関係ないと思うが、こんな話しもあってガグブルw
>Windows XP を実行するコンピュータ上で
>MFC アプリケーションを実行すると GDI オブジェクトでメモリ リークが発生する
http://support.microsoft.com/default.aspx?scid=kb;ja;319740

430 名前:326 :2007/01/30(火) 16:53:06
>>427,425
426の方の正解の方法をとってました。
が425の方法に変えてやって見ましたが、やはりタスクマネージャーの
メモリ使用率が増えていってしまいます。


431 名前:デフォルトの名無しさん :2007/01/30(火) 16:53:46
>>430
で、増えると何か困るのか?

432 名前:デフォルトの名無しさん :2007/01/30(火) 16:55:34
LoadLibraryされた時に走る関数内(例えばDLL内アプリケーションクラスのInitInstance等)で
デバイスアクセスっぽいAPI(例えばwaveOutGetNumDevs)呼ぶのって、何か問題ですか?

XPだとうまくいくのに,Vistaだとうまくいかない(0が返ってくる)。。

教えて下さい。

433 名前:326 :2007/01/30(火) 16:59:48
>>431
はい、画像枚数が少ない間はそれでいいんですけど
増えていった時に困るでしょう(;_:)

434 名前:326 :2007/01/30(火) 17:02:03
>>429
すいません、MFCはまだ勉強できておりませんので、
しかしわざわざありがとうございますm(__)m

435 名前:デフォルトの名無しさん :2007/01/30(火) 17:04:01
ウィンドウプロシジャ内で break; 付け忘れてるとかいうオチはないだろうな?

case xxx: 差し替え側コード;
case xxx: 生成側; break;

# 昔はまったことがあるw

436 名前:326 :2007/01/30(火) 17:06:53
>>436
確認しましたがそれは無いようです(^^ゞホッ

437 名前:デフォルトの名無しさん :2007/01/30(火) 17:15:32
>>437
それはないわ

438 名前:326 :2007/01/30(火) 17:18:18
>>437
それはないと言いますと、この手順で間違いがないということでしょうか?

439 名前:デフォルトの名無しさん :2007/01/30(火) 17:35:36
タスクマネージャのメモリ使用量ってアレだな。
リソースがディスクからデマンドページングで読まれても
増えるんだっけか?

440 名前:デフォルトの名無しさん :2007/01/30(火) 17:36:38
>>433
別に困らんが?
システムの動作に文句つけたいんならもうちょっと調べろ矢

441 名前:326 :2007/01/30(火) 17:38:43
すいません。ありがとうございました

442 名前:デフォルトの名無しさん :2007/01/30(火) 18:09:32
ワーキングセットサイズから物理メモリと仮想メモリを見てメモリリークを確認
ハンドル数をチェックしてハンドルリークを確認
メモリリークチェッカーでリーク箇所があるかをチェック
MSのサイトからランタイムがリークするネタをチェック。同様にOSがリークするネタを同様にチェック
ローディングされているモジュール一覧からIME等DLLを注入してくる系統をすべて排除
グローバルフック、CreateRemoteThread系でDLLを後から打ち込んでくるものを排除
英語版Windowsでチェック、ドライバをデフォルトのものにする

443 名前:デフォルトの名無しさん :2007/01/30(火) 18:19:41
もしかしてGetDCとReleaseDCの予感

444 名前:326 :2007/01/30(火) 19:20:43
>>442
ワーキングセットサイズ自体の見方がわかりません(~_~;)


445 名前:デフォルトの名無しさん :2007/01/30(火) 19:54:51
最小限のコード組んで何処で増えているのか、或いは減るべきところが減っていないのか調べろ。

446 名前:デフォルトの名無しさん :2007/01/30(火) 20:02:01
PrivateProfile系のAPIは、セクション名やキー名の途中に半角スペースが含まれていても
環境に依存せず正常に動作するでしょうか

447 名前:デフォルトの名無しさん :2007/01/30(火) 20:11:51
>>446
ためせばわかる

448 名前:デフォルトの名無しさん :2007/01/30(火) 20:46:55
環境っていったいなんの環境なのか

449 名前:デフォルトの名無しさん :2007/01/30(火) 21:20:14
>>446
http://support.microsoft.com/kb/150291/ja

450 名前:326 :2007/01/30(火) 21:40:31
>>445
case WM_LBUTTONDOWN:
hdc = GetDC(hWnd);
DeleteObject(SelectObject(hdc2,(HBITMAP)LoadImage(hInst,(LPCWSTR)IDB_BITMAP1,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION)));
InvalidateRect(hWnd,NULL,FALSE);
ReleaseDC(hWnd,hdc);
break;
case WM_RBUTTONDOWN:
hdc = GetDC(hWnd);
DeleteObject(SelectObject(hdc2,(HBITMAP)LoadImage(hInst,(LPCWSTR)IDB_BITMAP2,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION)));
InvalidateRect(hWnd,NULL,FALSE);
ReleaseDC(hWnd,hdc);
break;
こんな感じで組んでます。やはり画像を出した後タスクの
メモリ使用量が増えていってしまいます。

451 名前:326 :2007/01/30(火) 21:46:30
>>451のつづき
こんな感じで最小限に小さくしました。
減ったところはありません

452 名前:デフォルトの名無しさん :2007/01/30(火) 21:49:02
>>451
hdc2ってなに?
SelectObject前のビットマップはどこへ?

453 名前:デフォルトの名無しさん :2007/01/30(火) 21:50:23
SelectObjectの戻り値をDeleteObjectしてるわけだが、LoadImageしたhBitmapはどこでDeleteObjectしてるかと…

454 名前:デフォルトの名無しさん :2007/01/30(火) 22:06:53
SelectObjectより

解説
この関数は、指定されたのと同じタイプで、それまで選択されていたオブジェクトを返します。
アプリケーションは新しいオブジェクトを使い終えたら、必ず元の(既定)オブジェクトに置き換えるべきです。

hdc2がキャッシュだったら重要じゃないかもな

455 名前:デフォルトの名無しさん :2007/01/30(火) 22:19:05
hdc2ってのがWM_PAINTで画面に描画するメモリDCなわけね。
んで新しいのをSelectObjectしたときに、前のをDeleteObjectしてる、と。
GetDC / ReleaseDC は要らないけど、害も無さそう、と。

初回はLoadImageしてないのを DeleteObject してるので、そこはマズそう。
2回目以降は別に問題ないんじゃない?
hdc2 の生成と破棄のあたりを曝してみては?

456 名前:デフォルトの名無しさん :2007/01/30(火) 22:19:22
僕ハッカー

457 名前:326 :2007/01/30(火) 22:25:12
>>452,453
すいません、今組みなおしました、
case WM_LBUTTONDOWN:hdc = GetDC(hWnd);
hBitmap = SelectObject(hdc2,(HBITMAP)LoadImage(hInst,(LPCWSTR)IDB_BITMAP1,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION));
BitBlt(hdc,0,0,800,600,hdc2,0,0,SRCCOPY);
DeleteObject(SelectObject(hdc2,hBitmap));
ReleaseDC(hWnd,hdc);
break;
case WM_RBUTTONDOWN:
hdc = GetDC(hWnd);
hBitmap = SelectObject(hdc2,(HBITMAP)LoadImage(hInst,(LPCWSTR)IDB_BITMAP2,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION));
BitBlt(hdc,0,0,800,600,hdc2,0,0,SRCCOPY);
DeleteObject(SelectObject(hdc2,hBitmap));
ReleaseDC(hWnd,hdc);
break;
こんな感じに直しましたが結果は同じでした。
hdc2はメモリディバイスコンテキストです。

458 名前:326 :2007/01/30(火) 22:30:07
>>455
hdc2の生成はこんな感じで↓
hdc2= CreateCompatibleDC(hdc)
破棄のときは↓
case WM_DESTROY:
 DeleteDC(hdc2);
PostQuitMessage(0);
break;
こんな感じでやっております。

459 名前:デフォルトの名無しさん :2007/01/30(火) 22:34:31
hdc2= CreateCompatibleDC(hdc)はWM_CREATEあたりでやってるのかな?

460 名前:デフォルトの名無しさん :2007/01/30(火) 22:36:50
ちなみにWM_PAINTは?

461 名前:326 :2007/01/30(火) 22:39:57
>>459,460
hdc2= CreateCompatibleDC(hdc)はWM_CREATEでやっております
WM_PAINTは
case WM_PAINT:
 hdc = BeginPaint(hWnd, &ps);
    BitBlt(hdc,0,0,800,600,hdc2,0,0,SRCCOPY);
    EndPaint(hWnd, &ps);
break;
こんな感じです。

462 名前:デフォルトの名無しさん :2007/01/30(火) 22:46:48
面倒だ。全部どっかのアプロダにUpしろ。

463 名前:デフォルトの名無しさん :2007/01/30(火) 22:48:20
お前のプログラムのメモリ消費より
くだらんことでスレが消費される方が痛いわ

464 名前:デフォルトの名無しさん :2007/01/30(火) 22:56:11
>>412
うまくいかない理由は知らないけど、
回避策として FindResourceEx でリソースから文字列をロードしたら?
これなら言語を明示的に指定てきる。

465 名前:デフォルトの名無しさん :2007/01/30(火) 23:00:42
>>461
WM_CREATEのhdcはどっから生成?

hdc2= CreateCompatibleDC(hdc);
こんときのhdcは有効な値?

466 名前:デフォルトの名無しさん :2007/01/30(火) 23:08:27
俺はベタで言われたとおりコピペったが?
普通に動くし

467 名前:デフォルトの名無しさん :2007/01/30(火) 23:28:07
http://mata-ri.tk/up5/upload.html
ここの5M5135.zip

DLはxs5l

>>326よ、これとなぬが違う?

468 名前:326 :2007/01/30(火) 23:43:18
>>467
すいません、動きませんでした。なんかアプリケーションを最初から
インストールしてくださいみたいなのがでて、実行できませんでした。

469 名前:デフォルトの名無しさん :2007/01/30(火) 23:52:32
やっていることが滅茶苦茶だ。
リソースは必用なときに選択して、使い終わったら元に戻せ。
選択しっぱなしにしたり、管理が曖昧な状態でタイミングで削除するな。

470 名前:デフォルトの名無しさん :2007/01/30(火) 23:53:15
>管理が曖昧な状態のタイミングで削除するな。

471 名前:デフォルトの名無しさん :2007/01/30(火) 23:54:13
>>468
Visual Studio 6?

472 名前:326 :2007/01/31(水) 00:08:34
>>467
すいませんなんとか動きました、
しかしこれも新しい画像を読み込むと
メモリ使用量が増えますよね。

473 名前:デフォルトの名無しさん :2007/01/31(水) 00:11:27
bitmapの描画って普通はメモリDCにSelectObjectしてから
BitBltとかでメモリDCからスクリーンに転送するんじゃないの?

474 名前:デフォルトの名無しさん :2007/01/31(水) 00:12:55
C言語+APIでWinプログラミング始めたんですが、
デバイスコンテキストがやたら出て来るんですけど、
デバイスコンテキストがわからねー、何なのこれ?????

475 名前:326 :2007/01/31(水) 00:14:39
>>469
リソースを元に戻すとはどのようにですか?
すいません、ほんと質問ばかり。
>>471
Visual Studio 8です。



476 名前:デフォルトの名無しさん :2007/01/31(水) 00:31:35
>>474
グラフィック・デバイス・インターフェイスを抽象的に扱う【対象】。

例えば、
『▲に叩かれる』とした場合、
▲に相当するものが、姉,妹ならば、
『姉,妹は俺を叩くことができるコンテキスト』となる。

んで、『俺を叩くこと』を『描画する』に、
『姉』はディスプレィ,『妹』を『プリンタ』にそれぞれ変換するとだな

477 名前:デフォルトの名無しさん :2007/01/31(水) 01:49:44
>>476
どうもです、超入門レベルでスマソですが、
抽象的に扱うがなんなのか?なんです。
デバイスコンテキストで描画に関する何を管理(管理という言葉が正しいか?)してるのか?なんです。
描画対象のHWNDが分かれば、HDCは不要な気がするのですが...

478 名前:デフォルトの名無しさん :2007/01/31(水) 01:57:52
「抽象的に扱われるなにか」を隠蔽してエンドユーザー(API利用者)が
HDCやHWNDやHANDLEという単純な「型」だけを意識すればいいようにする仕組み
なにが抽象化されているかは公開されていないから考えないのがオトナ

あとHWNDからHDC取れるけどプリンタとかその他の要素もHDCを介するから
HWNDイコールHDCで考えるのは間違い

479 名前:デフォルトの名無しさん :2007/01/31(水) 02:13:49
質問です

子ウィンドウを動かす際に、

GetWindowRect(子ウィンドウハンドル,rect);
MoveWindow(子ウィンドウ,rect.left,rect.top,幅,高さ,TRUE);
とすると、繰り返すことでどんどん下に下がって行きます。

GetWindowRectの座標の原点が親のウィンドウのフレームを含めた左上に対して、
MoveWindowの原点が親のウィンドウの描画領域の左上なことは分かりました。

この差を吸収するAPIはありますか?
それとも事前にフレームとの差を保存しておくしかないでしょうか?

480 名前:デフォルトの名無しさん :2007/01/31(水) 02:19:41
>>479
GetWindowRectが返すのはスクリーン座標だから、親のウィンドウは関係ない。
スクリーン座標からクライアント座標への変換はScreenToClient

481 名前:デフォルトの名無しさん :2007/01/31(水) 02:50:01
親のハンドルでScreenToClientすることでできました

ありがとうございました

482 名前:デフォルトの名無しさん :2007/01/31(水) 02:52:12
test

483 名前:デフォルトの名無しさん :2007/01/31(水) 07:34:07
>326
描画せずに、LoadBitmap直後にDeleteObjectしてみれ。
それで現象が変わらないなら、>439じゃねーの。

484 名前:デフォルトの名無しさん :2007/01/31(水) 08:12:13
>>439
例えば、ビットマップ表示後にウィンドウを最小化して再び最大化したら、
メモリ量は解消されているのかな?

485 名前:デフォルトの名無しさん :2007/01/31(水) 09:15:02
OS側でメモリの解放さぼってるだけだろ
頻繁にやっても効率わるいだけだし

486 名前:デフォルトの名無しさん :2007/01/31(水) 09:15:53
とりあえず、>>419だそーだから、リークしてるのは確かぽくね?

487 名前:デフォルトの名無しさん :2007/01/31(水) 09:24:47
>>467のやつだとほとんど変化なしだったよ

488 名前:デフォルトの名無しさん :2007/01/31(水) 09:28:17
そんなに気になるんならタイマーかなんかで何回も繰り返してみりゃいいじゃん
HDBENCHみたいな感じで

489 名前:デフォルトの名無しさん :2007/01/31(水) 09:30:36
同じビットマップだと変化しないそうだから、ビットマップリソースに限られるんじゃね
で、確かにDestroyしてるっつーんなら、OSが後回しにしてるだけだべ

490 名前:デフォルトの名無しさん :2007/01/31(水) 10:17:04
ShellExecuteでエクスプローラを使ってC:を開こうとして

 ShellExecute(NULL, NULL, "C:\\", NULL, NULL, SW_SHOWNORMAL);

と書くとちゃんと、一見何の問題もなく開けるんですけど、デバッグウィンドウに

 例外処理 (初回) は ***.exe (KERNEL32.DLL) にあります: 0x000006BA: (名前がありません)。

と出ます。書き方おかしいのかな?
SDKのドキュメンテーションにも

 ShellExecute(handle, NULL, <fully_qualified_path_to_folder>, NULL, NULL, SW_SHOWNORMAL);

と書いてあるし間違ってはいないと思うんだけど…
第一引数を与えても出ます。何でか分かる人いますか?

Visual Studio 6.0
Platform SDK February 2003
WindowsXP SP2
です。

出ても問題ないような気もするけどなんとなく気持ち悪い…

491 名前:デフォルトの名無しさん :2007/01/31(水) 11:59:15
中で例外使った処理してるだけだろ。
仕様だろうから諦めるしかないんじゃね。

492 名前:326 :2007/01/31(水) 15:03:43
>>484
最小化して元に戻したらメモリ使用量は結構減りました。
なんでだろ??

493 名前:デフォルトの名無しさん :2007/01/31(水) 15:05:38
>>492
>>485

494 名前:デフォルトの名無しさん :2007/01/31(水) 15:12:15
webからphpを利用してサーバ内でcmdプロンプトを立ち上げ、サーバのモニタ上に表示させるようにしたいと思ってるのですが、
system()でcmdを実行してもプロセス(cmd.exe)は立ち上がっているのですが、ウインドウが非表示になってしまいます。
表示で起動する方法はありますか?

495 名前:デフォルトの名無しさん :2007/01/31(水) 15:16:10
>>494
ありません。他の方法を考えましょう(デスクトップと対話可能なサービスと通信するとか)。

496 名前:デフォルトの名無しさん :2007/01/31(水) 15:17:16
Webサーバは何をどうやって動かしてるの?

497 名前:デフォルトの名無しさん :2007/01/31(水) 15:20:40
>>495
レスありがとうございます。
デスクトップと対話可能なサービスって、例えばなにかご存知でしょうか?

環境はApache/2.0.54 (Win32) PHP/4.4.2 で、
WEBから起動し、リモートデスクトップ見た時にウインドウが立ち上がっていることを確認したいのです。

498 名前:デフォルトの名無しさん :2007/01/31(水) 15:43:23
いやだからそのWebサーバはどうやって起動してんのかと
サービス?

サービスだったら、サービスの設定で対話可能にするチェック入れてみ
自分でサービス書いたほうが楽だとは思うが、
それよりも、Syslog を導入してそれ使うのがいいと思うよ

499 名前:490 :2007/01/31(水) 15:46:15
>>491
中で例外使ってるといっても正しく呼び出してるのに何で例外になるのかと思って
何が気に食わないんだろう

500 名前:デフォルトの名無しさん :2007/01/31(水) 15:49:23
何が気に食わないんだろう


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