スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんやお姉さんたちが答えてくれるかも。
過去スレ、関連リンクは
>>2-5 くらい。
■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(
http://msdn.microsoft.com/library/ )の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで
プリンタとFAXを開くのは、 >CreateProcess()で"c:\windows\system32\control.exe printers"をキックる でできました。 次に、デフォルトプリンタの印刷設定プロパティを開く方法を教えて下さい。
>>7 うっきききー!!
(DocumentProperties関数じゃないっけ?)
9 :
7 :2006/11/13(月) 12:44:19
DocumentProperties関数でやったところ、Windowsに保存されませんですた。 で、あきらめて、シェルのコマンドラインでWindowsに起動&保存を丸ごとお願いしようかな、と。
10 :
7 :2006/11/13(月) 12:45:46
>>7 またそれか
printui.dll PrintUIEntryでできるんじゃないの?
12 :
7 :2006/11/13(月) 13:57:31
>printui.dll PrintUIEntry ファイル名を指定して実行、で上手く動きません><
>>7 rundll32 printui.dll,PrintUIEntry /e /n"(標準のプリンタ名を取得してここに入れる)"
罵倒と煽りは面倒なので省略
UNICODE や _UNICODE 定義済でコンパイルされたバイナリ(W系API使ってるって意味?)は 9xでは起動すらしないんでしょうか? よく「対応していない」って表現されてるんですがもってないのでよくわからないです
>>14 CreateFile関数の場合#defineでCreateFileAとCreateFileWを振り分けている。
意図してCreateFileWを利用すると起動時にDLLエラーが出ると思う。
16 :
7 :2006/11/13(月) 15:25:20
17 :
デフォルトの名無しさん :2006/11/13(月) 15:26:21
複数あるWindowからIEのWindowを絞り出し、そのHTMLDocumentを抜き出すという 事をしたいのですが、その方法で煮詰まっています。 public static bool IECallBack(IntPtr hwnd, IntPtr lParam) { StringBuilder sbClassName = new StringBuilder(256); GetClassName(hwnd, sbClassName, sbClassName.Capacity); if( sbClassName.ToString().StartsWith("IEFrame")) { Form1.al.Add(hwnd); } return true; } // EnumWindows でIECallBack へさせる。 EnumWindows(new EnumWindowCallBack(Form1.IECallBack), IntPtr.Zero); こんな感じでWindowのハンドルは取得できるのですが、Window内のオブジェクトを取得する 方法が分からなくて困っています。 どなたかご教授していただけませんでしょうか?よろしくお願い致します。 ※板違いだったらすいません。。。
>>15 サンクス
9xのDLLはW系をエクスポートしてないってことか
>>14 >>18 エントリポイントはあるので、プログラムの起動はできる。
しかし中身がなく、W版関数を呼び出すと失敗となって帰ってくる。
GetLastError()を呼ぶとERROR_CALL_NOT_IMPLEMENTEDが返ってくることがある。
Programming WindowsかAdvanced Windowsのどっちかでは、
MessageBoxWが9xにも実装されていることを使って、RegisterClassが失敗したら
MessageBoxで9xに対応していないというメッセージを表示するというコードを使っていた。
また、Microsoft Layer for Unicodeを使えば、9xでもW版APIを使えるようになる。
実態は文字列を変換してA版APIを呼ぶラッパだったと思う。
なんで9XはW系サポートしないの? あほじゃね?
つまらない質問だが 今画面に A B C D と表示されてるとする 設定によってはCとDは不必要なのでSetWindowPos()を使って画面サイズを変更して 見えてる 隠れている A B | C D として隠して無かったことにして処理を続けてしまうのはテクニック的に有り?
ヒント:ダブルディスプレイ
ヒントの意味がわからない orz
25 :
23 :2006/11/13(月) 17:25:42
ごめん、画面の位置を右にして画面からはみ出させるのと勘違いした。 サイズ変更なら大丈夫かも。 変だけど
>>23 やっぱり変か・・・
ダイアログベースなのだが
WM_CREATE:のタイミングで設定用ダイアログを出して、
その内容によってメインウィンドウのダイアログの内容を変えるって可能?
>>22 俺ならShowWindow(SW_HIDE)で隠す。
ダイアログの実サイズってフォント設定によって違うから 動的にウィンドウサイズいじるのは面倒なんだよね。 俺は外見を切り替えるときは、ダイアログそのものを 切り替えるようにしている。
>>28 フォントによって表示が変わるのか・・・
エントリポイントでCreateDialog()したダイアログの内容を途中から切り替える方法
もしくはそれ以前に設定値を入力できる方法
ってありますかね・・・?
> 9xでW系 MSLU使えばいろいろ問題はあるけど一応動くよ。
もう面倒だからCHtmlDialogでいいじゃないか、と。Win32APIじゃないが。
CreateProsecceでできたプロセスIDから OpenProsecceでハンドルは取得できないの?
>>32 貧乏言うなー!って、俺は20じゃねぇけど、未だに Win98 や WinMe 使ってるヤツって結構居るらしいぞ。
一般的なコンシューマなユーザはウェブブラウザとメーラが使えりゃそれで充分だしなぁ。
で、そういうマシンがボットネットの温床と化していたりもするらしい。
名前とかに予防線貼ってあるあたり 余程喰らいつきたかったんだろうから そっとしておいてあげなよw
ウィルス対策ソフトも、9x系は非対応になってきてるしなあ。 早くLinux陣営がそういうユーザを取り込んでくれればいいのに。もっと頑張れ。
>>36 あれ、ハンドル??
ハンドルだったの?
確かに、
BOOL TerminateProcess(
HANDLE hProcess,
UINT uExitCode
);
とかって、ゆってるけど、よく見るとハンドル?!
すっげぇ衝撃だ!
つっこむところなのか?
40 :
764 :2006/11/14(火) 00:13:40
>>37 最近のLinuxはカーネルだけじゃなくていろんなもんがごてごてしすぎて、
9xの代わりにはならなそう。
42 :
567 :2006/11/14(火) 05:53:02
| | { ! _,, -ェェュ、 | ィ彡三ミヽ `ヽ ,ィハミミミミミミミミミヽ、| 彡'⌒ヾミヽ `ー /ililハilミilミliliミliliミ. | ヾ、 /iiiiイ!ヾヾミ、ミニ=ー-ミ | _ `ー―' i!ハ:.:.\\_::::::::::::::/:.| 彡三ミミヽ i! ヽ:.:.:.:冫': : :::/,,∠| 彡' ヾ、 _ノ i!::: ̄二ー:: : ::::ソ ・ ,| `ー ' {ヘラ' ・_>シ;テツ"''''"| ,ィ彡三ニミヽ __ノ ヽヘ`" 彡' 〈 | 彡' ` ̄ `\ ー-=ェっ | _ __ ノ {ミ;ヽ、 ⌒ | ,ィ彡'  ̄ ヾミミミミト-- ' | ミ三彡' /⌒ / ̄ ̄ | : ::::::::::| ィニニ=- ' / i `ー-(二つ ,ィ彡' { ミi (二⊃ // / l ミii ト、二) 彡' __,ノ | ミソ :..`ト-' / | ミ{ :.:.:..:|
私鉄?
44 :
デフォルトの名無しさん :2006/11/14(火) 10:07:58
オーバーレイ周りはおいといて 拡張子ごとではなくファイルごとにアイコンが変化しうるものって .lnk .exe .ico, フォルダ以外にありますか? また、これのリストを厳密に取得することは出来ますか?
はい はい
46 :
デフォルトの名無しさん :2006/11/14(火) 13:47:34
適当にいってみるとdeleteのタイミングが怪しい
delete 後に値参照かましてるな。 |delete pIn; ........ |width=pH->biWidth;
49 :
デフォルトの名無しさん :2006/11/14(火) 14:22:51
そうでした。 47,48の人ありがとう!
deleteに[]つけなくていいんだっけ?
この場合は結果的にセーフだろうけど… [] つけるべきだろうな。
質問者があほしてるんじゃなくて、サンプルソースに非があるケースってのも珍しいな('A`)
入力データは用済みってコメントの次の行で使ってるからな・・・
配列をnewするようなソースは古い。
>>54 STL と WinAPI 相性悪そうな組み合わせだけど、実際のトコロどうなん?
このネタスレ違いだろ
STLは内部でnewしてるしな newせず動的にメモリー確保する新しい方法って何だ? gcnew?
おや?アロケータの存在を知っていれば、 「STLは内部でnewしてる」などという(ry
黙ってLoadImage使っとけってこった
>>55 std::basic_stringが文字列を受け取るバッファに使えないのが痛い。
気にせずstd::vector<TCHAR>でGO
>>44 他にもいろいろあります。
調べる方法としてはレジストリのDefaultIconキーとshellex¥IconHandlerキーをチェックします。
「DefaultIconキーに%1が*含まれて*いる」もしくは「shellex¥IconHandler キーがあれば」、
ファイル毎にかわるもんだと思っていいです。
モーダルダイアログ内でキーボードフォーカスを持つコントロールを調べるAPIってありませんか? GetFocusはNULLが帰ってくるので・・・
>>63 > GetFocus returns the window with the keyboard focus
> for the *current thread's* message queue.
これにひっかかってるとか?
> To get the window with the keyboard focus on the
> foreground queue or the queue of another thread,
> use the GetGUIThreadInfo function.
GetFocusだが。
66 :
デフォルトの名無しさん :2006/11/15(水) 04:48:00
1000バイトのファイルがあるとして、先頭の100バイトを削って 900バイトのファイルにしたいんですが、どうやるのが最もよいでしょうか? お願いします。
切り取り線を入れる
68 :
66 :2006/11/15(水) 05:36:23
SetFilePointer()で一発でできたらうれしいんですが無理ですよね。
読んで書くだけ
70 :
66 :2006/11/15(水) 07:32:56
すいません。もうひとつ質問があります。 WriteFileでファイルに書いている際、PCが落ちた場合、元のファイル がどの程度まで壊れているかの情報ってありますでしょうか? それとも全部壊れたとみなすべきでしょうか? 少なくとも、すでに存在していたファイルの場合で、そのファイルに 追加書き込みしていた場合、元のファイル分までは壊れてないと みなしていいのでしょうか?
俺には解答が分からないが 俺なら作業用のテンポラリファイル作って、作業が終わったら上書き保存する。
ntfsなら壊れない
まぁ その時書いてた部分までは残ってるわな
WriteFileしただけじゃ、バッファに書かれただけで、 実際にディスクに書かれてるかどうかは分からんけどナ
>>72 NTFSはメタデータのジャーナルしか取らないよ。
だからファイルシステムが矛盾しないことは保証されるけど
ユーザーデータが壊れてないかどうかまではNTFSの関知するところではない
ホントダー
結論:NTFSは屑(pgr
_beginthreadを使用しているコードはWM_CREATEを処理する時に_beginthreadを呼び出しているみたいですが、 ウィンドウプロシージャでスレッドを作成しないとダメなんでしょうか。
そんなことはない。 そのプログラムではたまたまWM_CREATEのときに作る必要があっただけだろう。
>>80 そのサンプルがたまたまWM_CREATEの処理中に _beginthread を使ってるだけ。
基本的にはどこでやってもええよ。
どこでもいいわけではない。 DllMainや一部のコールバックでは制限されている。
スレッドで実行してる長いループはちゃんと1000msでSleep呼び出してるのに、 肝心のWinMainがスレッド作成から動いていない・・・何故だ・・・。
きぼんぬ!出た!きぼんぬ出た!得意技!きぼんぬ出た!きぼんぬ!これ!きぼんぬ出たよ〜〜!
89 :
デフォルトの名無しさん :2006/11/16(木) 01:14:04
XPまではデスクトップのlistviewのLVITEM.lParamにpidlが入ってたのに Vistaじゃ入ってない?
MSDNにそんなこと書いてあった?
記憶が確かならCOM関係の本で見かけたような。 具体的にはDLLを動的にロードしたあとDLL側が勝手にスレッドを作ったりして作られたスレッドが走ってる最中にアンロードされたりすると・・・ だったような・・・ ・・・でCOMでスレッドを作りたい場合はプロセス内サーバは避けろとかあったような。 (とりあえずEffective COMの項目32で確認)
Win32Apiの勉強をかねてVC2005EEでランチャーソフトを作ってます。 ボタンを押し、その状態のままボタン外へマウスをドラッグさせ、マウスのボタンを放すと ボタンに登録したアイコンを消す。 という動作をさせようと思い "WM_LBUTTONDOWN" / "WM_LNCBUTTONDOWN" / "WM_LBUTTONUP" / " WM_LNCBUTTONUP" で処理を書いてみたのですが。 どうもメインフォーム上でのみ反応し、ボタン上では反応しませんでした。 ボタンを対象に何かをしなくてはならないとは思うのですが 良い方法が思い浮かびません。アドバイスをお願いします。
つ SetCapture/ReleaseCapture
97 :
デフォルトの名無しさん :2006/11/16(木) 13:48:00
はじめまして、 C++Builderで画像処理ソフトを作っているものですが、 VideoForWindowsで動画をチャプチャしております。 そこで質問なんですが、 1.bmpを介さずに直接メモリにチャプチャする方法 2.動画の描画を行わずに画像を取得(表示すると遅くなるため) を教えていただけませんか。 いろいろ調べてみたものの解決に至っていません。 DirectShowはちょっと難しかったので使っていません。 どうぞよろしくお願いいたします。
DirectShowの方が圧倒的に簡単。
帰れ低脳 使える使えないを語る以前の問題じゃ
101 :
99 :2006/11/16(木) 20:33:25
自己解決したわ。そのサイトだけっぽい。 猫のとこなら.cppだったわ・・・
絶対、注意書きの意味を理解してないな
apiの勉強する前に C/C++の基本を勉強する方が先みたいだな
禿do
CをC++でコンパイルするとパソコンが爆発するよ。
マジで?やべーな・・・
C++を学ぶと頭が禿げると聞いたのですが?
そりゃコンパイラ開発者がアレだからなぁ
109 :
デフォルトの名無しさん :2006/11/17(金) 00:01:04
Delphiばかりやってると馬鹿になると聞いたのですが?wwww
俺はC++勉強し始めて10年後くらいから薄くなってきた。
デルポイ
>>110 勉強しなかった場合と比較できないので科学的実験結果としては有意でないと考えられる。
113 :
デフォルトの名無しさん :2006/11/17(金) 12:57:59
カレントディレクトリに指定したファイル名のファイルが 存在するかを調べる関数がありましたら教えてください。 CreateFileとかで失敗したらとかでもできると思いますが、 正規のがありましたら教えてください。
SearchPath FindFirstFile 好きな方でどうぞ
普通はopenでやっちゃうと思う。
116 :
113 :2006/11/17(金) 15:16:46
絶対パスを相対パスに変換するAPIがあったら教えてください。
118 :
デフォルトの名無しさん :2006/11/17(金) 16:42:27
PathMakeRelative
PathRelativePathTo で出来そうです。 本当にありがとうございました。
>>113 PathFileExists というズバリな関数がある
>>120 知らなんだー
GetFileAttributes使ってた。
おらもだ
一応書いておくが、shlwapi.dllの関数で要IE4以上。
#pragma comment(lib, "SHLWAPI.lib");
shlwapiは便利だね wsnprintfとかワイルドカードでのマッチングもたしかあの中だったよね?
APIらしくGetProcAddressを使うんだよ! やったことないけどさ なぜかPath〜系は未だにMSDNが日本語じゃないんだよな 8月版になったからといって更新されるわけもなし
ウィンドウズプログラムで質問したい事があります。 ググったのですがいまい解決できそうなページがありませんでした。 作っているのはアナログ時計です。 開発環境はVC++6.0 Proです。SDKで作っています。 丸いリージョンで表示した時計のウィンドウがあります。 ウィンドウのクライアント領域はマウスでドラッグして移動できるように 細工をしております。 アナログ時計のウィンドウをデスクトップ領域の上端より超えて移動すると ウィンドウのキャプションが隠れるあたりでマウスのボタンを離すと 自動的にキャップションが少しだけ見える位置に移動してしまいます。 ウィンドウのクライアント領域でのマウスの移動が出来るのでできれば デスクトップの上端から上へキャプションが隠れてもそのままウィンドウが 移動できるようにはできないでしょうか。 よろしくお願いします。
>>127 よく分からんけど足りなさそうな情報を質問。
細工ってヒットテストにキャプションって返すやつ?
129 :
127 :2006/11/18(土) 02:46:30
ヒットテストでクライアント領域はキャプションとして返してます。 それによりウィンドウのクライアント領域をドラッグしてウィンドウを移動できます。 例えると以上の設定をして、普通のウィンドウのクライアント領域をドラッグして、 ウィンドウのキャプションをデスクトップの上端より隠れるように ウィンドウを移動させると自動的にウィンドウがキャプションを少しだけ表示した状態に なってしまうのです。それを移動してキャプションが隠れるようにしたいのです。
130 :
デフォルトの名無しさん :2006/11/18(土) 07:25:34
ダイアログ上にグループボックスを配置し、その上辺に重なるように チェックボックスを置いています。 表示すると、グループボックスのほうが上に来てしまうんですが、 どうすればチェックボックスを上に持ってこれますか? たぶんZオーダーの問題だと思うんですが、以下のようにしても うまくいきませんでした。 SetWindowPos(groupbox, checkbox, 0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
132 :
130 :2006/11/18(土) 10:06:29
逆にしたらできました。orz
今読んでる本には 『CreateSolidBrushで得たHBRUSH型変数は、不要になればDeleteObjectで破棄してください』 と書いてあるんですが、その本のサンプルプログラムでは破棄していないみたいなんです。 プログラムが終了すれば自動的に破棄されると考えれば、そのサンプルプログラムが破棄しないのも納得がいくのですが、 自動で破棄されるんでしょうか。
プロセスが終了すると、そのプロセスが握っているリソースはすべて解放されるよ 他プロセスと共有している場合は参照カウンタが1減り、0になったらOSにより解放される 現存するメジャーなOSのほとんどはこうなってるよ
プロセスが終了するか、DeleteObjectで明示的に破棄しないと解放されないから プロセスが走ってる間にいくつも作っては捨てをする場合は要らなくなったらDeleteObjectした方がいいね 1個2個作ってそのままくらいなら、プロセス終了時のリソース解放に任せてもいい
HFONTからLOGFONT取得って可能ですか? CreateFontIndirectの逆のことしたいんですけれども
GetObject
ぉぅぃぇ盲点だった orz ありがとう
>>136 いちおう念を押しておくとWM_PAINTは再描画のたびに呼ばれるからな
ウィンドウを作成して、タスクバーにそのウィンドウを表示させないように したいのですが、どうしたら良いのでしょうか・・・ ツールウィンドウ を使うしか無いのでしょうか>< 教えて下さいエロい人
2つのpathが同じかどうか簡単に調べる方法はないでしょうか?
GetVolumePathNameとGetVolumeInformationでボリュームが同じかどうか調べて (同じボリュームでなければ当然同一パスでもない) GetFileInformationByHandleでファイルIDを比較する。
>>145 PathSearchAndQualifyとかPathCanonicalizeが使えないかな?
148 :
デフォルトの名無しさん :2006/11/19(日) 07:32:00
ここかどうか分からないですが ISUファイルの作り方ってどこかに載っていませんか?
149 :
デフォルトの名無しさん :2006/11/19(日) 07:33:15
>ここかどうか分からないですが 質問がここで良いかどうか分からないという意味です。
150 :
145 :2006/11/19(日) 09:27:15
>>146 ,147
ありがとう。API調べてみます。
>>148 一般的にアンインストール情報ファイルに付加される拡張子、らしいね。
インストーラ作ってるメーカに問い合わせてみれば?
インストーラ作ってるメーカーって、ありゃMSインストーラ・・・
153 :
デフォルトの名無しさん :2006/11/19(日) 11:08:39
再起動しないでアンインストールする方法がないかと思いまして。 BATファイルは自分自身を削除できますが、コマンドプロンプトが表示されてしまいます。
154 :
Kioo :2006/11/19(日) 11:22:32
Dialogにあるエディットボックスの内容を入手して、char[]又はstringにいれたいのですが、 どうすればいいのでしょうか
156 :
Kioo :2006/11/19(日) 11:34:35
すいません言語書き忘れました。 C++です。
そのダイアログってのはどのダイアログなんだ
158 :
Kioo :2006/11/19(日) 11:42:36
RCファイルで作ってあるダイアログで、 IDD_ADD DIALOG DISCARDABLE 0, 0, 240, 75 EXSTYLE WS_EX_DLGMODALFRAME STYLE WS_POPUP | WS_THICKFRAME | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | DS_SETFONT CAPTION "Form" FONT 8, "MS 明朝" { CONTROL " ID:", IDC_LABEL202, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 12, 12, 45, 6 CONTROL "", IDC_EDIT_ID, "EDIT", WS_CHILD | WS_DLGFRAME | WS_VISIBLE | ES_AUTOHSCROLL, 54, 12, 111, 6 } IDC_EDIT_IDのエディットボックスです。
>>153 DELETE_ON_CLOSE付きCreateFileで
Tmp辺りにアンインストーラをコピーしてそれを起動する、だったと思う。
「アプリケーションの追加と削除」が微妙な動きをした記憶もあるけど(w
そうそう、削除する時は自分のアプリ関連のファイルのみを対象にする事。
誤って他のアプリやデータが入ったフォルダにインストールしていたら、
目も当てられない状態に。というか昔やっちゃったよ orz
>>159 なるほど、目に付かない場所に作って後で消すように設定すれば同じですね。
>>158 MFCのCDialogの派生クラスでなら
CWnd* pWnd = GetDlgItem(IDC_EDIT_ID);
char buff[256];
CString str;
pWnd->GetWindowText(buff, 255);
pWnd->GetWindowText(str);
CStringとcharの配列に文字列が入ります。
ダイアログ表示中以外のタイミングですか?
>>158 エディットボックスの内容が書き換えられた時に
GetWindowTextLength(GetDlgItem(IDC_EDIT_ID));で文字列の長さを取得
それに+1したサイズで、new char[]なりGlobalAllocなりでバッファを確保
GetWindowTextで文字列を取得する
stringが使いたかったら、さらにバッファからstringへ代入すればいい
エディットボックスの入力できる文字数は最大255バイトとか制限あったっけ?
163 :
Kioo :2006/11/19(日) 12:25:51
>>160 今はまだありませんが、ダイアログの下部にボタンをひとつおき、それが押されたら、文字列を変数に入れてダイアログを閉じるようにする予定です
GetDlgItemText()ってのもあるよ
const int len = GetWindowTextLength(hEdit) +1; TCHAR* pszText = static_cast<TCHAR*>(HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len*sizeof(TCHAR))); GetWindowText(hEdit, pszText, len*sizeof(TCHAR)); // std::string(pszText); /* 処理 */ HeapFree(GetProcessHeap(), 0, pszText); 半ば定型文
あ、stringのとこおかしいや コンパイル通してないから気付かんかったorz
コンパイル通さんでも気付くような間違いだがよw
>>159 FILE_FLAG_DELETE_ON_CLOSE だったんですね。ちょっと気が付きませんでした。
PlaySoundで.wavを1回でも再生したプログラムを 終了する時についての質問です。 通常の閉じるをクリックしての終了、 右クリックした時にWM_CLOSEを投げての終了はうまくいくのですが、 ESC(WM_KEYDOWN)が押された時にWM_CLOSEを投げての終了が、 ウィンドウが閉じられるまでに、 CPU率が高くなった状態ですこし止まってしまいます。 原因はどこにあるのでしょうか。 PlaySound(NULL, NULL, 0);はいれています。 また、なぜかMessageBeep(MB_OK);を 抜ける直前に挟むと、ちゃんと終了できます。
171 :
153 :2006/11/19(日) 17:58:24
>>159 を試してみましたが、作った実行ファイルによるプロセスが先に終了する場合しか
ファイルが削除されません。
何か継承しなければいけないのでしょうか?
>>171 FILE_FLAG_DELETE_ON_CLOSE法はうまくいかない。
たぶんみんな試さないで書いてると思う。
漏れが昔ここで聞いた方法
1. rundll32で削除用dllを起動する。
2. 削除用dllからアンインストーラの終了を待って消す。
3. FreeLibraryしてから自分自身を消すコードをヒープにコピーして呼び出す。
(ヒープにPAGE_EXECUTEをつけるのをお忘れなく)
> このとき、SYNCHRONIZEでオープンし、分身モジュールにハンドルを継承できる > ようにする。 これがポイントか?
>>174 よくわからんけどそれはハンドルを共用するためだろう。
ハンドルは何で共用する必要があるかというと、
分身起動→本体終了→分身により本体削除
のシーケンスを同期をとって実行するため。
176 :
153 :2006/11/19(日) 20:04:41
SYNCHRONIZEフラグはNT系のみ使用できるようです。
>>173 試してみたけどやっぱり消えないぞ。
むちゃくちゃコードを補う必要があったからどっかでミスってるのかもしれんが
178 :
153 :2006/11/19(日) 21:09:01
>>172 3. FreeLibraryしてから自分自身を消すコードをヒープにコピーして呼び出す。
(ヒープにPAGE_EXECUTEをつけるのをお忘れなく)
LPVOID pMem = (LPVOID)GlobalAlloc(GMEM_FIXED, size);
DWORD nID;
pMem = VirtualAlloc(pMem, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
// pMemにコードをコピー
CreateThread(NULL, 0, pMem, pMem, 0, &nID);
return:
DWORD WINAPI ThreadFunc(LPVOID pMem)
{
// 待ち処理
// 削除
VirtualFree(pMem);
GlobalFree(pMrm);
return 0;
}
こんな感じでしょうか?
> LPVOID pMem = (LPVOID)GlobalAlloc(GMEM_FIXED, size); > pMem = VirtualAlloc(pMem, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE); 上のGlobalAllocは何のためにあるんだ?
ちょwwwVirtualAllocwwwww
181 :
153 :2006/11/19(日) 21:41:02
PAGE_EXECUTEを受け付ける確保がVirtualAllocだけのようなので。 GlobalAllocは必要ありませんでしたか。
API以前にC言語の基本からやり直せ
そのレベルじゃ
>>172 のコードを書くのは無理
CD/DVD焼ソフトみたいにCD/DVD挿入時の自動再生を 一時的に無効にする方法を教えてください。 OS は Windows MeとXPです。
RegisterWindowMessage("QueryCancelAutoPlay"); なメッセージを処理して1を返す
185 :
デフォルトの名無しさん :2006/11/19(日) 22:06:24
俺も新人にCやDOSコマンドを教えた事があるが、理解できなかった時は常に教えた側に 問題があったぞ。 >FreeLibraryしてから自分自身を消すコードをヒープにコピーして呼び出す この手段に対して何も触れてないじゃないか。
>>185 そもそもそんなとこから教えなきゃならん事態が既に間違ってるってことはわかってるか?
GlobalAllocで割り当てたメモリが入ってるpMemを黙って上書きしてるのも 教えた側の責任か? それ見てこれ以上付き合う気なくしたんだが。
ここはあくまで善意の質問箱であり プログラム教室ではない
×俺も新人にCやDOSコマンドを教えた事があるが、理解できなかった時は常に教えた側に 問題があったぞ。 ○俺も新人のときCやDOSコマンドを教わった事があるが、この俺様に理解できなかった のだから常に教えた側の問題に決まってる。 ×この手段に対して何も触れてないじゃないか。 ○とっとと手段を教えろよ情報を小出しにしやがって使えねーパソヲタども つーか本当にそこが問題でできないなら聞き返してさえこない時点でオhル
テンプレすら読めない人がデカい顔してるスレはここですか? >・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
191 :
デフォルトの名無しさん :2006/11/19(日) 22:20:54
GlobalAllocにGMEM_FIXEDフラグを入れれば直接アドレスが返ってくるのも知らんのか。 格下に聞いちまったようだな。
触らない方がいいのかな
193 :
デフォルトの名無しさん :2006/11/19(日) 22:28:02
>知らないから答えられません。 って素直に言えばいいのによ
知らないから答えられません
知ってても答えません
本当は知らないんだけど、知らないっていうの癪だから 知ってるけど、教えてやらない。
> GlobalAllocにGMEM_FIXEDフラグを入れれば直接アドレスが返ってくるのも知らんのか。 そんなことぐらい誰でも知ってる。 問題はそこじゃねーよアホ。メモリリークという言葉も知らんのか > 知らないから教えてください って素直に言えばいいのに
>>197 全然関係ない。
つーか
>>172 でコピー先がヒープであることは本質的じゃない。
別にVirtualAllocでもいいから(むしろMSの推奨はそっちだった気がする)
>>180 が何を笑ってるのかよくわからん。
問題は意味もなくGlobalAllocしてメモリリーク起こすようなコードを平然と書く奴に
手取り足取り教えてられるほど暇じゃないってこと。
つーかコードをメモリ上でコピーするやり方はAdvanced Windowsに載ってるんだから
マジで読んでくれ
推奨はVirtualってか、Virtualは仮想メモリに直接確保、Globalはプロセスのヒープに確保じゃなかったかいの? MSがGlobalよりこっち使えって言ってるのは確かHeapAlloc
>>198 嘘吐け、俺が教えてやったから言えるんだろうが。
最初は頭下げてただろうが下衆野郎。しらねーくせに威張ってんじゃねえよ。
>>199 最初から本でも書いときゃ良いだろうがよ。暇じゃない割に2chにへばりついてやがんな。
>俺が教えてやったから言えるんだろうが
ここでおかしな流れをぶった切って・・・
>>153 WSHなら自分自身を削除できるし、コマンドプロンプトも出ない。
var fso = WScript.CreateObject("Scripting.FileSystemObject");
fso.DeleteFile("c:\\test.js");
これでアンインストーラを作ったことはないがなw
>>203 簡易的には使えそう。
どうせならバッチファイルで
>>203 98以降には一応装備されているから、バージョンが古いけど簡単な操作なら充分かもしれない。
どうしても駄目なら「BATファイルで御免なさい」ですね。
>>200 WinXP SP2から、VirtualAllocでPAGE_EXECUTE付けて、
その領域のコードを実行できるようにせんと
アクセス違反になるんじゃなかったけ?
たしか、バッファーオーバーフローで任意コードを実行されるのを防ぐためとかだったはず。
ただのデータ置き場ならGlobalAllocでもいいけど。
>>204 や、バッチファイルだとコマンドプロンプトが出てしまうって話でそ?
まあバッチファイルでも、CreateProcess()でDETACHED_PROCESSで起動すれば
コマンドプロンプトは出ないはず。
208 :
デフォルトの名無しさん :2006/11/20(月) 00:43:53
ショートカットを右クリックして「リンク先を探す」を実行すると、 エクスプローラが立ち上がって、当該ファイルが選択されますが、 これと同じことをするにはどうすればいいんでしょうか? お願いします。
>>201 > 最初は頭下げてただろうが
誰に言ってるの? 頭大丈夫?
> 最初から
>>1 に書いてるが何か?
> しらねーくせに威張ってんじゃねえよ。 鏡に向かって話すのが好きなんですね
>>206 GlobalAllocでもHeapAllocでもスタックでもVirtualProtectでPAGE_EXECUTEを
付けてやれば実行できるようになる。
当然同じページにある周囲のメモリも巻き込まれるのであまりよろしくないけど
> 教えてやったから言えるんだろうが いやあ仮にそのとおりだとしても 返すものがハンドルだろうがポインタだろうがメモリリークしてることに変わりないし そもそもGlobalALlocを呼び出す意味自体一切ないと教えてあげてるのに 理解しないばかりか逆切れしてるどっかのバカには負けますよw
(´・ω・`) n ⌒`γ´⌒`ヽ( E) ( .人 .人 γ ノ ミ(こノこノ `ー´ )にノこ(
intを戻す関数の中で、return 0;を書く位置が早いとちゃんとreturnされるが、 遅い(関数の最後)だと エラーがでる。 少しずつreturn 0をずらして書いてみると、ある位置より早ければちゃんとreturnされる。 コンパイル時はエラー0となってて実行時に メモリがreadになれませんでした。となる。 関数のなかで、他の関数を呼びまくってるから呼び出し元がどこだったかを忘れてるのでしょうか? どうすればいいのやら??
APIと何の関係もないな
んな馬鹿な。単に「他の関数」とやらで落ちているのだろ。 その原因は呼び方の間違いだろうがな。
>>216 も同じ意味かもしれんが、returnで落ちるなら
呼び出し規約とかシグネチャが違うとか?
a(); return 0; ← 正常に戻る b(); return 0; ← 落ちる だと、明らかに b() の中で落ちてるだろ
相手してくれてありがとう。 int Kansu{ MessageBox(NULL,"1","めっせじ",MB_OK); //return 0; //ここならもちろん戻る。 //中略 //中略 MessageBox(NULL,"2","めっせじ",MB_OK); // ここまでの処理は全部やってくれてるのに・・ return 0; //ここで落ちる。"0x33333231"の命令が"0x33333231"のメモリを参照しましただって・・ } 下記のようにダイアログベースのボタんから読んでるだけの超単純なものなのに。 中略部分がややこしいことしてるのでソースは書けないです。 ------------------------------------------------------- case IDC_BUTTON1: Kansu(); MessageBox(NULL,"もどったよ","よびだしもと",MB_OK); return TRUE; ------------------------------------------------------- わからん。 いままでこんなことなかったのに・・。ねるしかないか・・
デバッガ使えば
デバッガ使い方わかんないです。 messageboxをはさみまくってたしかめる方法でいままでがんばってきました。 お笑いですね。。
> 中略部分がややこしいことしてるのでソースは書けないです。
明らかにそこのせいだろ。
>>217 も言ってるが呼び出し規約が怪しい
悪いことは言わんからデバッガの使い方学習して来い。 もう一度言うけどWin32 APIぜんぜん関係ないので
解決しました。構造体のメモリ確保が1個分足りないのが原因でした。 デバッガは学習してきます。圧倒的初心者のお相手ありがとうございました。 すみませんでした。
225 :
デフォルトの名無しさん :2006/11/20(月) 03:16:17
途中の関数でスタック壊してるんじゃ舞か そしてとんでもないアドレスにリターンしようとしているのでわ
>>224 1回使い方分かっちゃえばめっさ楽になるからガンバレ
ウィンドウメッセージの数値から、 WM_**の文字列で取得するAPIがありましたら教えてください。
取得するもなにも switch( message ) で case WM_***: やってると思うけど
231 :
227 :2006/11/20(月) 10:06:05
以前に、EXE自分自身を削除するプログラムを作ることがあって、 いろいろ見つけたサンプルを元に FILE_FLAG_DELETE_ON_CLOSE を試行錯誤してみたが、うまくいかなかった。 (例) 98系と2000系で挙動が違う (すまん、どう違ったかは覚えてない) (例) EXEがネットワークドライブ上だとうまくいかない で、結局、俺は以下のようにした。 (1) 削除用プログラム(自分自身)を「<GetTempPath()のディレクトリ>\DeleteMe.tmp」にコピー (2) (1)をMoveFileEx( MOVEFILE_DELAY_UNTIL_REBOOT )で削除予約。 (3) (1)をCreateProcess()、自分自身は終了。 (1)はユーザーがリブートするまで消えないが、ユーザーの目に触れなきゃOK!
試さずに書くが・・・・・
(スマン、234はしくじった) 試さずに書くが・・・・・ バッチ(command.com/cmd.exe)をSW_HIDEでCreateProcessしては?
>>233 その方法も良いと思います。
>>234-235 少なくとも ShellExecute ではうまくいきました。
皆さんお世話になりました。お騒がせしました。
238 :
デフォルトの名無しさん :2006/11/20(月) 20:31:37
メインのGetMessageをまわしているループとは別のスレッドから、 SendMessageでWndProcへ構造体をわたそうと思っています。 wParamか、lParamにポインタ入れて。 この構造体を入れる領域をHeapAllocでとって、そこに値を入れてSendMessageで渡した後、 WndProcで処理した後、HeapFreeで開放してやりたいのですが、 開放するタイミングはWndProcしかないのでしょうか。 WndProcへwParamとか、lParamでわたってくるマウスの情報とかは、 WndProcで開放しないのでなんかお作法みたいなのがあるように思えますが、 なにか標準のお作法がありますでしょうか。 お作法、または、ドキュメントへの道しるべ等お教えいただけないですか。
239 :
デフォルトの名無しさん :2006/11/20(月) 20:36:47
もしかして、SendMessageを呼び出した後は、 イベントがWndProcで処理されるまで戻ってこないので、 −メモリ確保 −SendMessage(ここから投げたスレッドはブロック) −−メインのGetMessageで取得されて、WndProcで処理される −SendMessageから戻ってくるのでメモリ開放 といった形になるのでしょうか? とりあえず、AdvancedWindowsの第26章をみてます。
SendMessageで送信したメッセージの処理内でしか使わないのなら SendMessageから帰ってきたところで消せばいい ちなみにSendMessageはGetMessageで取得じゃなくて、SendMessageが直接プロシージャを呼ぶ
241 :
デフォルトの名無しさん :2006/11/20(月) 20:51:19
>240 >SendMessageで送信したメッセージの処理内でしか使わないのなら >SendMessageから帰ってきたところで消せばいい ありがとうございます。 確信がなかったのですが、自信が持てました。 >ちなみにSendMessageはGetMessageで取得じゃなくて、SendMessageが直接プロシージャを呼ぶ AdvancedWindowsをちゃんとよんでみたら書いてありました。 スレッド間でのSendMessage呼び出しは複雑だと知り、勉強になりました。 ご指摘、ありがとうございました。
>メインのGetMessageをまわしているループとは別のスレッドから、SendMessage する状況なら、 >ちなみにSendMessageはGetMessageで取得じゃなくて、 >SendMessageが直接プロシージャを呼ぶ は間違いだよ。それは同一スレッドの時限定。
でもそんな感じだと思っていて構わないと思う。 Advanced Windows読むまで知らなかった。
実は16bitWindowsの頃からGetMessageで取得していた
245 :
デフォルトの名無しさん :2006/11/21(火) 10:07:07
ヘッダ見てるといろんな構造体にbiSizeとかcbSizeとか構造体のサイズを設定するところがありますがこれって何のためですか? 構造体を渡す側はsizeof(構造体)でこのセットするサイズわかるし渡される側も構造体がわかってるからsizeof(構造体)でとれますよね
>>245 後で拡張されてサイズが増える場合があるから
>>245 最後に char hoge[1] みたいな可変長メンバのプレースホルダがあったりして
sizeof では正しいサイズを得られない場合があるから。
構造体によっては、コンパイル時の_WIN_VERの値で使用可能なメンバの数が変わったりする そうなると当然構造体のサイズも変わる おk?
でも、NOTIFYICONDATAとか結構ぐだぐだだよな。 同じ名前を流用するより、 OSVERSIONINFO/OSVERSIONINFOEXみたく、 個別に構造体を定義したほうがスマートに見える。
まぁ、俺らがここでそれを言っても MSがそれに気付いてやってくれないとどうにもならないからな・・・
>>246 >>248 その場合はコンパイル環境とターゲット環境が一致している限りは問題ない。
sizeof自体が役に立たないのは、BITMAPINFOみたいな可変長メンバを含む場合。
253 :
デフォルトの名無しさん :2006/11/21(火) 17:01:43
>>251 お客さんのPCのGDI32.DLL の類がどんな環境で
いつコンパイルされたかなんか普通わからんと思うぞ。
>>254 >何の話してるのかね。
Win32 API のヘッダで構造体のメンバに構造体のサイズを設定するフィールドがあるのはなぜ、という話で、
「後で拡張されてサイズが増える場合があるから」という答えに対して
「コンパイル環境とターゲット環境が一致している限りは問題ない」とアフォな返しをする奴がいたので、
ターゲット環境がわかるケースは一般的ではないと指摘してみたんだが・・・
257 :
245 :2006/11/21(火) 17:55:20
>>246-256 ビットマップをいじるプログラムをさわったらなんとなくわかってきました。
教えてくれて、ありがとう。
あと、C言語ポインタ完全制覇という本に構造体の一番後ろで拡張するタイプの話がのってたので、
そっちも読んで理解してみます。な〜んでだろっていうのがすっきりして助かりました。
>>257 ヘッダを開いて、それぞれの構造体の宣言部を見てみるのもいいと思うぞ
#ifdef _WIN_VER〜#endifとかあるから
質問です。 C言語をベースに勉強していて、 テキストエディタを作っています。 コモンダイアログの「検索」を出して、 エディタ内の文字列を探す所まではなんとかできたのですが、 その結果をエディタに表示する方法がよくかりません。 エディタの内容をchar配列に移して、 そこからstrstrで検索して、 見つかったら戻り値のポイントを調べて、 SendMessage(MyDataGet_hEdit(), EM_SETSEL,[戻り値], [戻り値 + 検索文字数]); で結果を明示しようとしています。 見つかった文字列がエディタ内に表示されている状態ならば、 これでもよさそうなのですが、 表示されていない場合、スクロールを自分で動かして、 どこが選択されているか調べないといけないという、 検索した意味のない状態になってしまっています。 どうしたら普通の検索のように、 検索結果(選択状態の文字列)まで、 画面表示を自動スクロールさせられるのか、ヒントをください。
>>255 ターゲット環境が「分かる」必要なんか無いだろ。
ターゲット環境は「作るときに決める」物なんだから。
「ターゲットを決めうちする限りは問題ない」とする回答に「ターゲットが分からない」と
返す方がよっぽどAFOだと思うが。
なんでおまえの限定の話に乗っからないといけないんだよ
>>245 biSizeは言ってみれば構造体のバージョンナンバー。
BITMAPINFOHEADER, BITMAPV4HEADER, BITMAPV5HEADERのように
構造体が拡張された場合に、API側がbiSizeを見てどの構造体なのか
判断している。
これのおかげで、BITMAPINFOHEADERを要求するAPIにV4やV5の
構造体を渡すことができる。
>>261 ターゲットが分からないなんてのもお前限定の話だろ。
客のターゲットも調べないで要件を定義するのか?
264 :
259 :2006/11/21(火) 19:50:09
流れ無視してゴメンなさい。自己解決しました。 SendMessage(HANDLEエディタ, EM_SCROLLCARET, 0, 0); 基本的なメッセージ関連を勉強しなおしてきます。orz
ターゲットを限定しないとバージョンアップのたびに金を取れないだろ。
>>262 >biSizeは言ってみれば構造体のバージョンナンバー。
同意同意。
本当はマズいんだと思うんだけどね。
過去バージョン互換とか考えるとなー。
ビットマップ等の場合、渡されるOS側がサイズを確定できないのだから仕方が無い Windows3.0以前から一応ソースレベルの互換性を維持してきたツケだな
ここでGDI+の質問してもOKでしょうか? FillRectangle + LinearGradientBrushを使って四角形を描画すると Rectのサイズによってはグラデーション開始位置に、グラデーション終了色が 出ます。(LinearGradientModeVerticalモード時は上1行だけ) これはどうやれば防げるんでしょうか?
どういうコード書いてるかも言わずに解るわけないだろ
270 :
268 :2006/11/22(水) 13:50:10
失礼しました。以下のコードです。 Graphics g(hdc); Rect rect(10, 10, 100, 11); LinearGradientBrush brush( rect, Color(255,255,0,0), Color(255,0,0,0), LinearGradientModeVertical ); g.FillRectangle(&brush, rect); 四角形の上が赤、下が黒になるはずなんですが、一番上の行が黒になってしまいます。2行目以降は 正常です。Y座標を変えると全て正常に表示されることもあります。
GetMessageの戻り値が負になるのはどういう時でしょうか。 終了の0の時は、閉じるボタンorWM_CLOSEをPost、 WM_CLOSEはDefWindowProcで処理、 WM_DESTROYが来て、そこでPostQuitMessage(0)、 WM_QUITが来た時、同時にGetMessageの戻り値が0になり メッセージループを抜けるという感じだと思うんですけど。
>>271 わん わん わわわん わん わん くんくん
(GetMessage関数は、WM_QUIT以外のメッセージを取得した場合は、TRUEを返すんだよ)
わん わん わわわん わん わん
(また、WM_QUITメッセージを取得した場合は、FALSEを返すんだよ)
わん わん くーん?
(わかったかな?)
275 :
271 :2006/11/22(水) 16:21:50
ありがとうございます。
>>223 エラーが発生した場合、-1が返ると書いてあります。
しかし、それで戻り値がintでなくBOOLなのがなぞですが。
WM_CLOSE、WM_DESTROY、WM_QUITを経由して
-1を返してくるか、いきなり-1を返すのかが分かりません。
実験しようにも-1戻り値エラーが発生したことがありませんし。
typedef int BOOL;
そういやさ、MSDNのGetMessageの解説には、 GetMessageは「0、-1、other」の3種類の戻り値が有るから「while (GetMessage(lpMsg, hWnd, 0, 0))」は良くないって書いてあるけど VCが自動生成するメッセージループって「while (GetMessage(lpMsg, NULL, 0, 0))」なんだよな これってどうなんかねw
>>275 > それで戻り値がintでなくBOOLなのがなぞですが。
GetMessageの戻り値は以前はTRUEとFALSEだけだった。
GetMessageのウィンドウハンドルの引数に無効な値(削除されたウィンドウのハンドルなど) を渡すと-1が帰ってくると聞いたことがある。
>>279 そうか、そういう場合に失敗するのか。
いや、いままでGetMessageが失敗したことなんて無いもんだから。
面倒だから、こういうやり方してしまっているけど
while ( GetMessage( &msg, NULL, 0, 0) > 0 )
{
}
つか、MSDNの警告に従えば、GetMessageはwhileの条件式に書かないほうがいいってことだから while(true)とかで回すことになって、益々ヤバイことにならんか
282 :
271 :2006/11/22(水) 18:30:03
>>279 なるほど。
こわいですが、わざと変な値を使ってエラーさせて実験してみます。
283 :
デフォルトの名無しさん :2006/11/22(水) 18:48:41
他のプログラムの出しているウィンドウへのキー入力もフックに引っかけたくて、 DLLを記述して、 hhk = SetWindowsHookEx(WH_KEYBOARD,// フックタイプはキーストローク hHOOKKEY, // フック処理プロシジャへ hInstDLL, //フックプロシジャは同一ファイルで記述 NULL); // 対象スレッドはすべて if (hhk == NULL) MessageBox( NULL,TEXT("フックかけられない"),TEXT("Error"),MB_OK) と記述したところ、フック設定は毎回うまく行っているように見えるのですが、 自分で作成しウインドウへの入力は拾えても、他のプログラムの出した窓への入力 は拾えません。「グローバルフック」はキーロガーのように全部拾ってくれる と思っていたのですが、こんなもんなんでしょうか。 WinXP,VisualC++2005 です。
>>283 拾えるのはDLLの注入されたプロセス自身だけ
他のプロセスのメッセージを拾いたいなら、
何らかのプロセス間通信を使って自分のプロセスに送らないと駄目
>>283 グローバルフックを仕込んだdllをパスの通ったディレクトリに置く。
フックプロシージャでメッセージを受け取るウィンドウのハンドルを取得することはできないのでしょうか? フックの種類はWH_CBTです
289 :
287 :2006/11/22(水) 22:21:17
>>288 MSDN見たら書いてありましたorz
nCodeによってはwParamとかに入ってるんですね
スレ汚ししてしまってすみませんでした
290 :
デフォルトの名無しさん :2006/11/23(木) 00:02:42
SetStdHandleでググって見つかるサンプルって子プロセスの標準出力等を親からReadFileで読み出す感じなのが大半だと思うのですが 自プロセスでputsとかで出力したものをコンソールに出力せずあとでReadFileでまとめて取得したくて下記のようなコードを書いたのですがうまくいきません int main() { SECURITY_ATTRIBUTES sa; HANDLE hRead, hWrite; sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; if(!CreatePipe(&hRead, &hWrite, &sa, 0)) { puts("error CreatePipe"); return 1; } if(!SetStdHandle(STD_OUTPUT_HANDLE, hWrite)) { puts("error SetStdHandle"); return 1; } const char msg[] = "Hello from new stdout"; puts(msg); // 新しく設定されたstdoutに出力 fflush(stdout); FlushFileBuffers(hRead); FlushFileBuffers(hWrite); char buf[1024] = {0}; DWORD read = 0; ReadFile(hRead, buf, sizeof(buf)-1, &read, NULL); if(strcmp(buf, msg) != 0) { puts("failed"); return 1; } return 0; }
>>290 的外れだったらすまんが
CreateConsoleScreenBuffer
関連を使えばバックバッファを作成できるけど
292 :
290 :2006/11/23(木) 03:18:04
>>291 レスありがとうございます
CreatePipeのくだりを消して
HANDLE hWrite = CreateConsoleScreenBuffer(
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
CONSOLE_TEXTMODE_BUFFER,
NULL);
SetConsoleActiveScreenBuffer(hWrite);
を追加したのですがReadFileではなにも読めませんでした
rubyで実現できたのですがこれをWin32APIでもやりたいです
下記は標準出力を横取りしてフィルタリングや整形などを行えます
$stdout_sv = STDOUT.dup # STDOUT を保存
class MyOut < IO
def write(str)
return $stdout_sv.write("-->" + str) #デコレーションして本物の標準出力に
end
end
STDOUT.reopen(MyOut.new(0)) #フィルタ設置 (ファイルディスクリプタ適当
puts "Hello from new stdout\n"
STDOUT.flush
STDOUT.reopen($stdout_sv)
rubyのソースを読めば方法がわかる予感。
ていうか標準関数を使うべきかと 以前、win32アプリでAllocConsoleを使ってコンソールを作成した後標準出力をコンソールスクリーンに割り当てる って事をやったんだけどAPIでやるとcoutやprintfは機能しなかった。 だけど標準関数(たしかfreopen)を使うとちゃんと出力されたし、 GetStdHandleを使って調べてもちゃんとスクリーンのハンドルが返ってきた ちなみにcoutを開き直すのは駄目でした(coutはちゃんと出力できたけどprintfとかが駄目)
あと入出力の関数は標準関数かAPIかで統一した方がいいと思う
そもそもAPIで標準出力の出力先を変更しようというのではなく、 プログラム内で出力先を選べるようにしたほうが楽だと思う。 C++ならstd::ostreamを引数にとって、呼ぶ側が必要に応じて std::ostringstreamのオブジェクトを渡すようにするとかさ。
297 :
デフォルトの名無しさん :2006/11/23(木) 19:37:22
質問があります。 拡張子がrtfのファイルに関連するアイコンデータがプログラムから ひつようなのですが、レジストリエディタで確認すると "%ProgramFiles%\Windows NT\Accessories\WORDPAD.EXE",1 になっていました。 このリソースIDは何番にしたらいいですか?ワードパッドみても リソースIDが一番のアイコンはありませんでした。 よろしくお願いします
標準のスタティックコントロールが自動折り返しの設定になっているときに、 複数行の文字列が表示される領域を正確に知りたいのですがどうすればいいでしょうか? GetTextExtentPoint32だと折り返しがある場合に位置がずれてしまうのです。
>>297 正の値 : 0から始まるアイコンのインデックス
負の値 : リソースID(ex. -3 -> リソースID 3)
300 :
297 :2006/11/23(木) 20:14:53
>>299 理解できました。
ありがとうございました。
fopen fout と CreateFile WriteFile は どっちが速い?
>>301 foutが何かは知りませんが、大き目のファイルを一気に書くような用途では
ストリームを使ってもAPIを直接使っても大して速度は変わらないと思います。
∵一般的にI/Oに時間が掛かりますから。
根拠なしに適当いうと たぶんfopen()とかはCreateFileで実装されてる
それ以外でどう実装しろと
直にディスクアクセスする方法がある。 って結局ドライブ自体かvwin32をCreateFileで開かないといけないわけか。
隠しAPIがあるとか
NtCreateFileとかZwCreateFileとか
Cランタイムのソースコードは誰でも見れるだろ。 正解は304
解放し忘れたメモリもプロセスが終了するときに解放されると聞いたことがあるのですが、 同様にLoadLibraryで読み込まれたDLL内で確保したメモリがFreeLibraryで解放されるのでしょうか?
>>311 レスありがとうございます
解放されないんですね、気をつけます
されないのか、知らんかった ・・・考えたら、されたら困るよな・・・
COM最強杉とだけ言っておこう
なのは最強
最強はケンイチ
318 :
デフォルトの名無しさん :2006/11/24(金) 01:55:46
アニメーションを行うためにタイマーイベントでWM_PAINTを発行して、 WM_PAINT内に以下の記述をしています。 draw() // OpenGLの描画関数 SwapBuffers(wglGetCurrentDC()); HDC hdc = BeginPaint(hwnd, &ps); 〜マウスドラッグによる四角の描画〜 EndPaint(hwnd, &ps); すると、マウスドラッグで描かれた四角の部分がチラついてしまいます。 このチラツキを防止するにはどうすればよろしいでしょうか。
画面に直接書かずバックバッファのほうに書け
320 :
318 :2006/11/24(金) 02:25:33
>>319 どうも。以下にようにしてもチラつきました。
何か間違ってるでしょうか?
HDC hdc_bkbuf = CreateCompatibleDC(hdc);
HBITMAP hbmp = CreateCompatibleBitmap(hdc, width, height);
HBITMAP hbmp_old = (HBITMAP)SelectObject(hdc_bkbuf, hbmp);
〜hdc_bkbufに四角を描画〜
BitBlt(hdc, posx, posy, width, height, hdc_bkbuf, 0, 0, SRCCOPY);
SelectObject(hdc_bkbuf, hbmp_old);
DeleteObject(hbmp);
DeleteDC(hdc_bkbuf);
WM_TIMERの代わりにWM_MOUSEMOVEで更新するとか SendMessageじゃなくPostするとか
323 :
318 :2006/11/24(金) 02:44:33
>>322 draw(); // OpenGLの描画関数
SwapBuffers(wglGetCurrentDC());
HDC hdc = BeginPaint(hwnd, &ps);
〜320のコード〜
EndPaint(hwnd, &ps);
SwapBuffers(hdc);
てな具合です。
>>321 すみません。いまいちよく分かりませんでした。
それじゃまったく意味ないだろ。 OpenGLの裏画面ってGDIじゃ描画できないんだっけ?
325 :
318 :2006/11/24(金) 03:00:17
そうですね。意味ないですね…。 > OpenGLの裏画面ってGDIじゃ描画できないんだっけ? GLとGDIでコンテキストを分けてそれぞれ独立に描画できれば 自由度があって便利なんですが、やり方がよくわからず。
326 :
321 :2006/11/24(金) 03:00:32
case WM_TIMER ・・・ WM_PAINを発行 を case WM_MOUSEMOVE if(ドラッグの最中){ PostMessage(自分,WM_PAINT・・・) } な具合。
WM_PAINTって自分で送るものじゃないんじゃないの?
328 :
318 :2006/11/24(金) 03:11:08
>>327 InvalidateRectでいいですよね。
>>326 それだとドラッグの最中に四角が描画されて、
同時にタイマーでアニメーションが描画されて、結局チラついちゃう気が…。
GL側で全部描こうかなぁ。
半透明とか楽だし…。
> GL側で全部描こうかなぁ。 GDIで書く方法が不明ならそれが一番いいかと。
そもそもWM_PAINTで描くからチラつくんだが WM_PAINTはあくまで再描画するためのイベントだ それ以外の描画は他タイミングで描け つか、タイマー使ってんならWM_TIMERで描きゃいいじゃないかよ
WM_ERASEBKGNDで描けばいいんじゃね
332 :
298 :2006/11/24(金) 15:23:54
API組み合わせたら、たぶん自己解決しました
腰痛い
ダブルバッファリングでちらつくのは InvalidateRect(hWnd, NULL, TRUE);ってやってるからじゃないかな 最後FALSEでやっていろいろ調整するといいかも その前にマウスドラッグで四角書くのにタイマー使う必要があるのかが謎だけど
335 :
デフォルトの名無しさん :2006/11/24(金) 17:59:40
LoadLibraryEx()でDLLのインスタンスハンドル入手した後 どうやって解放すればいいですか? どなたかお願いします。
>>335 ハンドルというかただのアドレスだ。開放する必要はない。
DLLの開放という意味ならMSDNを見れ
>>324-325 OpenGL のレンダーターゲットを BMPイメージonメモリDC にして そっちを GDI 描画
WM_PAINT はBMPを(BitBlt で)可視化 で多少融通が利くよ
ハードウェアアクセラレーション利く環境少ないけどな。
339 :
デフォルトの名無しさん :2006/11/24(金) 19:21:01
ウィンドウプロシージャをC++のクラスでうまくラッピングしてるライブラリってない? JavaのWindowListenerみたいな感じのが欲しいんだけど・・
ライブラリを求めるんならMFCでも使っとけば? 他人が作ったライブラリを中途半端に使うより、自分で必要な機能を盛り込んで作った方がいいけどな
windowsx.h
342 :
デフォルトの名無しさん :2006/11/24(金) 19:28:36
MFC・windowsx.hはイベントハンドラ定義するのにマクロ使うんで 個人的に好みじゃないんだよな・・ 適当に作ってみるか。レスありがとう。
バッチファイルをアプリを起動することなく、 (すなわち自分のプロセス内で)実行する方法って ありますでしょうか?
>>343 バッチファイルを実行するコードを全部自分で書く。
cmd.exe/command.comを介入させたくないのか、 バッチの中に書いてあるコマンドも内蔵させる必要があるのかだな。 あるいは単にコンソールウインドウを不可視にしたいだけのかな?
>>342 .NET FrameworkのWindows Forms。
あとMS発祥といえばATL/WTL。こっちはマクロ使うけど。
Qt4はどうよ
348 :
343 :2006/11/24(金) 22:53:39
シャットダウン中にバッチファイルを実行したいんです。 WM_QUERYENDSESSION?かなにかが飛んできたときはもう 新規実行はできないと思うので、自分でやりたいのです。
>>348 直接の答えではないけれど、ログオフスクリプトではだめか?
mem_bmp = CreateCompatibleBitmap(hdc, 800, 800); mem_hdc = CreateCompatibleDC(hdc); SelectObject(mem_hdc, mem_bmp); int a = GetDeviceCaps(mem_hdc, HORZRES); int b = GetDeviceCaps(mem_hdc, VERTRES); aとbの値が800にならないんだけどなんでだろう
実際にはどうなるんだよ
354 :
デフォルトの名無しさん :2006/11/25(土) 00:08:29
言語スレ行って質問したらWin32APIのほうが質問場所は良いって
言われたので来ました。
ttp://support.microsoft.com/kb/403844/ja PGが起動してるときだけスクリーンセーバが動かないPGを作ってるんだけど
リンク先のやり方だとパスワード保護されてるとうまく動かないんです
パスワード保護の時って発行されてるメッセージって違うみたいですが
どうすればフック出来るか知りたいんですが
355 :
352 :2006/11/25(土) 00:09:53
>>353 実際にはデスクトップ領域の解像度が入った
1600と1200みたいな
>>352 解像度が800x800のディスプレイを接続すればいいと思うよ。
>>352 対象がビットマップじゃなくてデバイス(スクリーン)だから
358 :
352 :2006/11/25(土) 00:37:44
>>357 スクリーンと互換のデバイスってことでスクリーンの値を取得してるのか・・・
ビットマップの値を取得する方法はないですか?
361 :
352 :2006/11/25(土) 00:47:37
ありがとう GetBitmapDimensionEx(mem_bmp, &sz); でいけた
初めて知った<GetBitmapDimensionEx。
363 :
352 :2006/11/25(土) 01:18:04
と思ったら2回目以降使えなくなった あらかじめSetBitmapDimensionExでサイズを設定しておかなきゃいけないらしい なんで初めだけ取得できたんだろ・・・?
セイント聖矢のジェミニを思い出したのは俺だけで良いはずだ
>>361 それで得られるサイズの単位はピクセルじゃないぞ
どうせユーザ定義なんだから何でも良いんじゃね?
>>359 で答えが出てるのに、何悩んでるんだろう?
ここで聞くべきかDirectXスレで聞くべきか COMスレで聞くべきか迷ったのですが… FrapsやGameCamなどのDirectX乗っ取り型のキャプチャソフトなんですが どうもキャプチャ動画を見たところDirect3Dのフロントバッファ(かバックバッファ)を 直接取得して録画してるみたいなんですが、どうやって取得しているのかその挙動が良く分かりません。 最初はSetWindowsHookEx()で全プロセスにdllをマッピングして、PEヘッダを見て Direct3Dの初期化関数(Direct3DCreate8()等)を見つけたらフックして、 出てきたインターフェース(IDirect3DDevice8等)のGetFrontBufferData()を呼び出して フロントバッファをコピーしているのかと思ったのですが、PEヘッダが暗号化されて INTにDirect3DCreate8等が存在しないゲーム(具体的にはMaster of Epicというゲームです)でも ちゃんと録画が可能な上に、この方法だとゲーム起動前にキャプチャプログラムを 起動しないといけない(Direct3DCreateをゲームが呼び出す前にフックしないといけない)ので ゲーム起動後に起動してもちゃんと動作するFraps等では違った技法を使ってると思うのですが、 その方法がどうしても思い浮かびません。漠然とですがもしかしてIDirect3DDeviceには メモリ検索で探せるような特定のメモリパターンがあるのかな?と思ったりするのですが… ご存知の方いらっしゃいましたら是非ご教授お願いしたいです。 しかし…見返してみると…長文杉でホント申し訳ないorz
>>368 CLSID乗っ取って、アプリとDirectXの間に一枚噛ませてるんじゃね?
370 :
デフォルトの名無しさん :2006/11/25(土) 11:10:56
371 :
デフォルトの名無しさん :2006/11/25(土) 11:13:18
エクスプローラでファイルを自ウィンドウにD&Dして、フォルダパスを取得することはできるのですが、 逆に自ウィンドウからD&Dして(Spy++のファインダツールのように)エクスプローラを指定→ フォルダパスを取得する方法はどのようにすればいいですか? アドレスバーから取得する方法を試してみたのですが、 非表示の環境の場合に取得できないのでうまくいきませんでした。 CabinetWClass -WorkerW -RrBarWindow32 -ComboBoxEx32 -ComboBox -Edit ←ここにWM_GETTEXTを投げてみました
>>371 無理じゃね?
DnDのファイルコピーとかのオペレーションは受けとり側が操作するから。
ターゲットソースは受け取り側にファイル名渡すだけ。
373 :
デフォルトの名無しさん :2006/11/25(土) 13:00:10
イベントの飛ぶ順序ってどの本に載ってるの? 例えばダイアログをリサイズしたときに、 どういうイベントがどういう順番で飛ばされるのか、などを知りたいのだけど
374 :
371 :2006/11/25(土) 13:02:15
>>368 全く同じことしようとしている人がいて驚愕>MoE
378 :
デフォルトの名無しさん :2006/11/25(土) 16:02:34
簡単なサンプルプログラムをコンパイルするのに、 >cl test.c user32.lib gdi32.lib みたいに*.libっていうファイルをリンクしないとエラーが出るんですが、 これって静的リンクになっちゃってるってことですか?
そのLIBはDLLへの参照を含んでいるインポートライブラリ。 静的ライブラリがリンクされているわけではない。
>>379 なるほどそうなんですか。
.libファイルをインポートライブラリ・スタティックリンクライブラリと
見分ける方法でもあるのかな??
>>380 dumpbinでどうよ?詳しく使った事無いけど。
>>381 dumpbinは有料のVS買わないと付いてこないみたいですね。
.libの中でも、
インポートライブラリというのはシンボルテーブルだけのオブジェクトファイルのアーカイブ
静的リンク用ライブラリは実コードも入ったオブジェクトファイルのアーカイブ
ってことで、arなんかのツールでファイル取り出してobjdumpして確認するのがいいみたいですね。
他のプロセスで作ったメモリデバイスコンテキストのハンドルを自分に渡して 自分からメモリデバイスコンテキストを使うことはできる? フックと併せて作ったんだけどローカルではできてもグローバルでは失敗する・・・
HDCはローカルなハンドルなのでHDCを操作するのも対象のプロセス内で行う必要がある。
>>385 なるほど。SendMessageで自分のウィンドウで処理した方が良さそうだな・・・
388 :
デフォルトの名無しさん :2006/11/25(土) 21:33:50
389 :
デフォルトの名無しさん :2006/11/26(日) 01:10:58
C#で遊んでるんですが、
参考にしているソースに"CCFree"って関数がでてきたんです。
これはなんでしょう?
http://bcbjournal.com/free_issue/June03-01.htm のコードの一部です
// global PIDL, use CCFree()
ITEMIDLIST* pidl = static_cast<ITEMIDLIST*>(hMem);
if (pidl != NULL)
{
ITEMIDLIST* pidlcopy = shutils::ILClone(pidl);
shutils::CCFree(pidl);
return pidlcopy;
}
相当するWin32APIとかマネージAPIとかありましたら教えてください
PIDLを解放するのに使っているから、CoTaskMemFreeやMarshal.FreeCoTaskMemに相当するものだと思う。
いまさらVS6が欲しくても もう売ってない どうすればいいの?
Javaの関係でMSDNからも削除されてたな
エアーVS6でガマンする
>>368 メモリにロードされたあとにも暗号化されてるのか?
395 :
名無しさん :2006/11/26(日) 03:50:46
マルチポストだめもとで、投稿しますすみません。 現在、WindowsXP Pro+ VS2005 Proを使って開発中です。 1を入力されるとIMEがONになって、'あ' と表示するプログラムの作成中です。 以下のコードではIMEがONになってくれなくて、'a' と表示されます。 ご指摘お願いします。 void fnConvert(MSG *pMsg) { static int iCnt= 1; if( (pMsg->wParam == 0x31) && (pMsg->message == WM_KEYDOWN) ) { pMsg->wParam= 0x41; break; } }
>>395 IMEをオンにするコードはどこにあるんだよ
397 :
395 :2006/11/26(日) 04:06:23
395です。
>>396 さん
IMEをONにするコードがわからないのですが、、、
ご教授尾根がいします。
while(1){ MessageBox(NULL, "IMEをONにしてください", "", MB_OK); if(MessageBox(NULL, "IMEをONにしましたか?", "", MB_YESNO | MB_ICONQUESTION) == IDYES) { break; } }
>>397 というか最初からそれを聞けよwwwwww
IMEの操作なら
>>4 の猫でもわかるをみとけ
401 :
395 :2006/11/26(日) 04:22:14
所詮、マルチ厨なんてこの程度か
>>369 CLSID乗っ取り…というのが良く分からないのですが、
IDirect3DDeviceのCLSIDを書き換えるという感じでしょうか?(超適当)
実はCOMはバイナリ互換のコンポネートモデルであるという程度しか
知識が無いもので、お恥ずかしながらその辺りの応用に疎いのです。
>>377 なんと同じ事をしようとしている人が居るとは!
プログラム自体はキャプチャプログラムをMoEに限定するならd3d8.dllクローンを作って
偽Direct3DCreate8を作れば簡単にMoEのフロントバッファは取得出来るのですが、
Fraps等はどうやって認識しているんだろうな〜という知的好奇心から質問させてもらいました。
>>394 ちょっとグレーな話になるんですが、ゲームはASProtectで圧縮されてるみたいで、バイナリ自体を見ても
インポートされてる関数が明らかに少ないのです(おそらく元インポートテーブル展開用ルーチン)。
そしてロードされた後(正確にはゲームウィンドウが出た時)のメモリ上のヘッダでは、
INTが消されてIATがあるだけという状態になっています。もちろんIATがあるならd3d8.dllの
Direct3DCreate8をGetProcAddressでアドレスを取得し、アドレスを決め打ちで書き換えてもいいんですが、
どうもIATの展開が終わった時には既にD3Dの初期化は完了しているみたいで、
IATを書き換えた所でDirect3DCreate8を呼び出される事はありませんでした。
また長文で申し訳ない。
もっと簡潔に書けないのか自分はorz
404 :
389 :2006/11/26(日) 11:45:34
>>390 レスありがとう
pidlはいつもCoTaskMemFreeで解放するものなんですか?
DDEってまだ使えるのかね
>>403 >CLSID乗っ取り…というのが良く分からないのですが
CoCreateInstanceとかはレジストリを見てCLSIDから必要なdllやexeをロードするわけだから
DirectXのCLSIDに自分のモジュールを登録しておくの。
やったことないし、できるのかもわからんけど。
>>409 NetDDE が使用不能になるってのは見つけたが、DDE そのものが使用不能になるって記事が見つからんのだが。
DDE使えなくなったら動かなくなるアプリが大量にでないか?
もともと動かなくなるアプリ大量にあるから問題なくね?
今ちょっと試してみたら、
VistaのエクスプローラのフォルダウインドウじゃDDE使ってないみたいね
レジストリ(HKEY_CLASSES_ROOT\Folder)もなくなってる
>>389 も無駄な技術になったか
>>410-411 実際、Vistaで動かしてみそ。ほとんど動かないから。(DDEサーバーがほぼ使えない)
ただ、中途半端にスダブが残っているので、その機能だけなら動くけど
もしかすっとIE7にDDEでURL渡せないとか?
>>408 DLL Injecttionで相手先のIDirect*インターフェースの
vtable乗っ取りしてるっぽいね。やっぱりこれしかないか
めんどくさいなぁ。 いくつか書き直さないといけなくなるな。
DDEって良く分からんが、何のためにあるの?
お気楽プロセス間通信と理解している
IPCは ・DDE ・window message ・named pipe(NT系) ・DCOM が用意されてるんだが DCOMはレジストリがウザい named pipeは98系で使えない ってことでwindow messageかddeになるのよね 他にあったら教えてたもれ
socket mailslot RPC 後者2つは使ったこともないが
名前なしのパイプ メールスロット RPC (メッセージの一種だけど)WM_COPYDATA
これこれ、共有メモリを忘れていますよ
>>424 名前付きイベントと組み合わせれば・・・
>>406 成程、CoCreateInstanceはレジストリのCLSID見てモジュールをロードするんですか、勉強になります。
しかしDirect3Dに関してはCOMで作ってるクセにDirectX8からCOMを逸脱しているらしく
CLSIDが登録されていない(=CoCreateInstanceでインスタンスを作れない)みたいです。
なんでこんな仕様になったのか理解不能なんですが、ともあれCLSIDからの乗っ取りアプローチは
Direct3D8に関しては無理みたいです(´・ω・`)
>>408 おお…これは、すごい。動画処理をVfWでやってるのが多少残念ですが(僕のプログラムでも
最初の実装ではVfWでしたが、処理が遅い+マルチスレッドを想定していないらしく、
プログラミングしづらい上に、2GB制限等のユーザー側の利便性を損なう欠点が多々見つかった事から、
DirctShowへの乗り換えを検討しています。)参考になりそうな部分はとても多いです。
実は僕C++は始めたばかりで、テンプレートクラス等個人的に見慣れない部分はありますが
がんばって解読してみようと思います。情報有難うございました。
そろそろ長引いちゃってアレなのでこの辺りで消えます。
付き合ってくださった皆さん本当に有難うございましたm(_ _)m
つまりwin9xしねばいいのにってことだな
>>413 Firefoxでフォルダ開くとどんどん新しい窓ができるのはそのせいカー
今SetWindowPosを使ってWindowを常に最前面に出しているのですが フルスクリーンのゲームなどより前に出てきません。 フルスクリーンより前に持ってくることはできるのでしょうか?
>>430 ゲームがフルスクリーンになったあとに最前面にもってくる
>>431 ゲームを起動した後に起動するということですよね?
それをしても負けてしまうのです;
>>432 タイマーで定期的に最前面にもってきてもだめか?
誰一人、ゲームが再描画の度に最前面に持ってきているのでは という事に、ツッコミを入れない件について
>>433 タイマーで呼んだらきました。WM_CREATEでつくってそれっきりでした。
ありでした
>>434 そんなコード誰も書かないだろ
常識的に考えて
プログラマの常識的に考えて〜〜しない そんな風に考えて(ry まあ、解決したようでなによりだけどな
すまんな SetWindowPosで最前面にできないなら、ゲーム側で 何かしているとしか、考えられない。 それに、ベクターにいけば、そんなウンコアプリなんて いくらでも存在してるから、恐ろしいのだよ。
Createじゃタイミングが悪いんじゃないの? まだウインドウないんだし
いやフルスクリーンのゲームもまた最前面ウィンドウなんだから 最後にアクティブになるゲーム画面が前面に出ちゃうでしょ だからフルスクリーンになった後に最前面化させないと出てこない
ゲームのウィンドウをオーナーに指定すれば必ず手前に出る
DirectXのフルスクリーンだと、どうしようもないんじゃね?
フルスクリーンだとGDIのクリッピングを無視するから ゲームの描画で上書きされる可能性はあるけど ウィンドウマネージャ的には手前に出せる
Vistaはまた挙動が違うんだろうなあ・・・
445 :
デフォルトの名無しさん :2006/11/26(日) 21:12:10
ウィンドウズプログラムで質問したい事があります。 開発環境はVS2003です。SDKで作っています。 リストビュー(レポート)の中でドラッグの開始位置と終了位置のアイテムとサブアイテムを取得するために、 リストビューをサブクラス化してWM_LBUTTONDOWNとWM_LBUTTONUPを受け取ろうとしたのですが、 WM_LBUTTONDOWNは通知されるのに、WM_LBUTTONUPはプロシージャに通知されず困っています。 WM_LBUTTONUPを取得する方法を教えていただけないでしょうか?
VistaのAeroモードでウィンドウの内容をBitBltすると 画面外の情報もちゃんと取れたのにちょっと感動
447 :
445 :2006/11/26(日) 21:24:58
補足します。
ダブルクリックの後にはWM_LBUTTONUPが通知されました。
プログラムはこのHPのサンプルを書き換えました。
ttp://wisdom.sakura.ne.jp/system/winapi/common/common15.html WNDPROC DefListProc;
LRESULT CALLBACK ListProc(
HWND WH_Window,
UINT msg,
WPARAM wp,
LPARAM lp)
{
switch(msg)
{
case WM_LBUTTONUP:
MessageBox(WH_Window,"","",MB_OK);
break;
}
return CallWindowProc(DefListProc,WH_Window,msg,wp,lp);
}
hList = CreateWindowEx(0 , WC_LISTVIEW , 0 ,
WS_CHILD | WS_VISIBLE | LVS_REPORT ,
0 , 0 , 10 , 10 , hWnd , (HMENU)1 ,
((LPCREATESTRUCT)lp)->hInstance , NULL);
DefListProc = (WNDPROC)GetWindowLong(hList,GWL_WNDPROC);
SetWindowLong(hList,GWL_WNDPROC,(LONG)ListProc);
よろしくお願いいたします。
試しにSpy++でマイコンピュータのリストビューのメッセージを見てみたが ちゃんと、LBUTTONDOWN→MOUSEMOVE→LBUTTONUP来てたがね まぁ、何かやってることがおかしいんだろうけど・・・
フルスクリーンうぜぇ。 画面全体を有効に使っているならまだしも、 黒いスペースが埋められているだけだし。 せめてタクスバーを残してくれ。
450 :
445 :2006/11/26(日) 22:18:17
>>448 問題のプログラムをSpy++で覗いた所WM_LBUTTONUPは発行されていました。
ためしに
return CallWindowProc(DefListProc,WH_Window,msg,wp,lp);
↓
return DefWindowProc(WH_Window,msg,wp,lp);
に変えてみたところ、WM_LBUTTONUPメッセージを取得できました。
リストビューのプロシージャが悪さをしているようなので、調べてみます。
ありがとうございました。
教えてください。 CreateWindowExで拡張ウィンドウスタイルを使わないようにするには CreateWindowを使えばいいんですがExのみを使うっていう前提の場合、 CreateWindowEx(NULL,・・・);でいいんでしょうか?
>>451 イエス。拡張ウィンドウスタイルは(普通のスタイルもそうですが)スタイルを示すビットフラグの
論理和で示されるので、全てのビットが0=NULLを指定すれば拡張ウィンドウスタイルは無効になります。
正確には、なると思います。実際やって見た事がないので。
453 :
451 :2006/11/27(月) 00:08:22
>>452 ありがとうございます。
WS_EX_LEFT
WS_EX_LTRREADING
WS_EX_RIGHTSCROLLBAR
の定義も0x00000000なんですがこれはデフォルトでそうなってると解釈しました。
>>453 その通り。それらは拡張スタイルを指定しなくても自動でそうなっているスタイル、
要するに拡張スタイルの指定と対比させるために敢えて定義された定数です。
>>451 細かいことと思うかもしれないが、NULLはポインタ専用だ。そこには0使え。
457 :
451 :2006/11/27(月) 00:28:33
>>455 その辺はワーニング対策で#define DF_NULL 0x00000000を定義してそれ使ってます。
CreateWindowは0Lを渡してるな。
ものすごく見当違い名事をいってたらすいません この先、microsoftが提供する開発環境って platform sdk が無くなって、.net flameworkだけになるってことはありますか? ちょっと疑問に思っただけなんですが
Platform SDKと.NET Framework SDKはすでに統合されてWindows SDKになったけど 従来のPlatform SDKの内容(+Vistaの新API)は今のところそのまま入ってる。 将来的には(かつてのWin16 APIみたいに)Win32 APIはWDKに追いやられて ユーザーモードアプリはWinFX API一本になるということもあるかもね
CreateWindowも実は、CreateWindowExのマクロだからな・・・ ウィンドウ関係のAPIラッパクラスを作ってる時にはじめて知ったわ
>>445 LVN_BEGINDRAGでメッセージループを廻しているかDoDragDropしているのか
463 :
デフォルトの名無しさん :2006/11/27(月) 12:38:15
354と似た話になりますが、スクリーンセーバーのパスワード保護の チェックが付いているかどうかって、レジストリから確認できるの でしょうか。
>>463 HKEY_CURRENT_USER\Control Panel\Desktop\ScreenSaveActive
466 :
465 :2006/11/27(月) 14:16:37
>>463 間違えた・・・・
HKEY_CURRENT_USER\Control Panel\Desktop\ScreenSaverIsSecure
だ。
質問いたします. クリップボード内のデータの履歴を取り,再利用するものを想定しています. テキストだけでなく,画像やリンクなどを含めたデータをクリップボードから取り出し, 保存するにはどのようにしたらよいでしょうか?
調べたらわかりそうな気がするんだけど
>>467 取り出すのはOpenClipboard, EnumClipboardFormats, GetClipboardDataなど。
保存は御自由に。
わからない事をもっと具体的に端的に質問することをお勧めします。
そういう問題じゃ無いと思うが
じゃあどういう問題なんだ?
FtpGetFile()でのダウンロード処理って途中で中断できないんでしょうか。 他にFtpでのダウンロードを中断する方法があったら教えてください。 お願いします、ほんとに。 環境はWinXP+VS2005のMFC+SDKです。 Win2000以降のみ対応できればよいです。
NULLはOSによっては0じゃない場合もあると昔聞いた事がある。-1も有りうると。記憶が頼りだけど。
NULLが実行環境に依存するのか? コンパイラによって、ならまだ解るが。
折角Win32APIスレなのに
実行環境には依存しないがな コンパイル環境によっては0じゃない場合もあるのは確か
が、うまくゼロであるとみなせるようにすることが規格として求められてる。 <NULL
C と C++ でも違うんじゃなかったっけか
ぬるぽの話題ここまで
■━⊂( ‘ー‘)☆彡 ガッ☆`Д´)ノ
>>460 大変遅くなって申し訳ありませんがレスをいただきありがとうございました。
恥ずかしながらWindows SDKやWinFX APIというのは意味をよく知りませんでしたので
勉強になりました。ありがとうございます。
>>475 内部表現の話とごっちゃにしてる。ここはWin32 APIスレだし。
それともWin32sではヌルポインタをアクセス違反にするためWin32アプリから見える
アドレスとVxDから見えるアドレスが64KBずれてるなんてトリビアを話したいのか。
Win32環境だと0番地でいいけど、セグメンテーションだかの関係で0じゃない環境もあると聞いたな。
NULLは、あくまでも無効(?)番地であって。数値の0をマクロで使えるようにしたものじゃない。 目的と手段を逆に取り違えている奴が世の中多すぎ。
NULLが0なのではなく、0がNULLなのです。
どうでもいい
某流出ソースの中見てみたら数値の0として使ってますよ。
「Half Life 2」のソース?
HOGE* p = 0; は、ヌルポインタの値が0でなくても、コンパイラによってその型のヌルポインタの値に変換される と聞いたことがある。 だからC++ではNULLと0は等価らしい。
MSDNのsdkのサンプルでこんなのが見つかるけど FONTEDIT\FONTEDIT.C(566): (HWND)NULL, /* no parent */ FONTEDIT\FONTEDIT.C(567): (HMENU)NULL, /* use class menu */
おまえらぬるぽ好きだな
>>474 Wininetよく知らないからなんともいえないけど、
FtpOpenFileとInternetReadFileでやるんじゃない?
もしGUIアプリ作ってるんなら、これをスレッドでやる方法と
内部でメッセージループでやる方法があると思う。
結構大変だよ。
>>496 SDKは空ハンドルにもNULL使うよな
>>499 それとは別に INVALID_HANDLE_VALUE も使うし ややこしい
単なる仕様概念の違いやん
ES_NUMBERを付けた単一行エディットコントロールに文字列をクリップボードからペーストするとしっかり文字列が入っちゃうんですが、 CM_TEXTCHANGEでチェックするしかないんでしょうか‥‥
ダイアログでエディットを数個配置して エンターキーで次のエディットにフォーカスを移動 させようと思っています。 サブクラス化されたウィンドウプロシージャでイベントを 捕まえてSetFocusで移動はできるのですが、 TABキーを送ってまとめて処理したいです。 TABキーの送り方を教えてください。
504 :
デフォルトの名無しさん :2006/11/28(火) 12:55:27
>>496 ハンドルはOSが内部で確保する構造体へのポインタだからなんだよ。
>>496 DWORDの引数にNULLを渡すのはおかしいという話題なのに、
なぜいきなりポインタであるハンドルの話を出してきたのか。
506 :
デフォルトの名無しさん :2006/11/28(火) 14:44:11
質問させてください、 COM風のDLLを作ってるときに、 void IHOGE::Release() { // あらかじめ保存しておいた、exe側のWinAPIのFreeLibrary()のアドレスと BOOL (WINAPI *fpFreeLibrary)(HMODULE) = m_fpFreeLibrary; // DLLのハンドルをローカル変数にコピーしてから、 HMODULE hLibrary = m_hLibrary; // 自殺して delete this; // DLL解放 fpFreeLibrary(hLibrary); } なんてやろうとしたんですが、DLL解放のところでバグってしまいました。 以前VC6でやっててうまくいってたんですが (実行時にDLLの方がDLL解放の処理を書いてないバージョンのままだった可能性はあります・・・) VC2005Expressでやるとダメでした。 こんなことせずに自前で解放すれば大丈夫なのですが、 DLLから得た関数の中でDLLを解放することはそもそも原理的にダメなのでしょうか? そのあたりの理屈が知りたいので、よろしければ教えてください。
>>506 そのDLLを解放するコードIHOGE::Releaseは、解放しようとしているDLLにあるわけで。
列車が走ってるレールを破棄するようなもんだ。
>>503 WM_NEXTDLGCTL使えば楽できる。たぶん。
>>506 やるとしたら、一時的にスレッドを作って(そのスレッドはDLL内の関数で良い)、
そこでFreeLibraryAndExitThreadを呼ぶという方法がある。
ちなみに本物のCOMでは、COMがDLLを管理している。
(ある程度はDLL自身も制御できるが、直接FreeLibraryを呼ぶという事態はない)
FreeLibraryAndExitThreadって初めて見たとき、 こんなもん何に使うんだよwwwwwってなるよな。
>>509 FreeLibraryAndExitThread呼ぶスレッドをIHOGE::Release()で作っても
FreeLibraryAndExitThreadが呼ばれる前にIHOGE::Release()から抜けて
EXE側のコードに戻らないとダメだな。
>FreeLibraryAndExitThread 関数は、次のように実装されています。 >FreeLibrary(hModule); >ExitThread(dwExitCode); こんな感じで実装されてるってだけのことだろうが酷い説明だな
俺も510と同じだった。 でもAdvanced Windowsにはきちんと使い方が書いてあったよ。
514 :
デフォルトの名無しさん :2006/11/28(火) 17:57:40
モーダレスダイアログに付いて質問なのですが
メニューバーからダイアログの表示
ShowWindow( hDlg, SW_SHOW )
を使用すると何故か↓の様に、ダイアログから下の部分が更新されていません。
http://gamdev.org/up/img/8238.jpg ダイアログが親?ウィンドウより外側に持って行くか
キーボードを押してSW_SHOWを呼び出す様な処理の場合は
問題なく全体を更新します。
メニューバーまたはメッセージに何かしらあるのでしょうか。
>>514 WM_PAINTの処理がおかしいだけじゃない?
BeginPaint使わないで、ValidateRect(hWnd, NULL)してるとか。
516 :
デフォルトの名無しさん :2006/11/28(火) 18:19:51
あれってバスジャックとか異常事態がないかの合図じゃないの? それはそれで表示板にそういうのあるんだっけ?
518 :
514 :2006/11/28(火) 19:01:47
>>515 WM_PAINTは使ってないですが
ちょいと調べてみます。有難うございます。
現在のメッセージ処理
if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
{
if( !DialogMessage( &msg ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
else
{
Update();
Render();
Sleep( 1 );
}
520 :
デフォルトの名無しさん :2006/11/28(火) 21:18:18
Visual Studioでデバッグするとき使える「ステップアウト」は Win32API的にはどのように再現できるでしょうか?
return
522 :
514 :2006/11/28(火) 21:43:43
WM_PAINTに持って行きましたが、結果は変わらず。 メニューバーに触れると、SSの様な事態になるので メニューバーの使用をやめるか、モーダルダイアログにするなりしてみます。
523 :
520 :2006/11/28(火) 22:12:13
>>521 確かに自プロセスならreturnでことたりるのですが
Visual Studioのような他プロセスがどうのような方法で
ステップアウト等の処理をしてるか分かりません
君には無理。
そもそもVSはOSの製造元が作ってるわけで
526 :
520 :2006/11/28(火) 22:45:34
>>525 でもボーランドのIDEでも同じようなことできますよね?
528 :
デフォルトの名無しさん :2006/11/28(火) 23:08:43
>>523 驚いたことに最近はね、プロセッサ例えばPentium(というかi386からだけど)
の中にはデバッグレジスタ(DRレジスタ)なるものが存在するんだよ。
どう使うのかは知らんw
さわらぬ神にタタリなしww
>>476 例えばだけど、0番地付近がシステムで予約されている場合とかさ。
そういう環境用のコンパイラはきっとNULLを-1とかにするんだろうね。
>>529 内部表現が-1でもC/C++のソース上は常に0。
ああ、C言語だと (void*)0 な場合もあるな。 でも 0 の部分がほかの数値になることはない
だとすれば、数値の0として使えるのか。
(void*)0 な実装の存在を考えると NULL を数値の 0 として使うのは移植性がない。 ただしポインタであるべき文脈で 0 を使ってもいいことは保証されてる。
>>528 デバッグレジスタへのアクセスはリアルモードなどの状態でしか許されていない
そのかわりWaitForDebugEventとかいうAPIが提供されてるがどう使うか分からん
どっちにしろさわらぬ神にタタリなしww
( ´∀`)<ぬるぽ
C#でPInvokeするとき、NULLを渡したいとき IntPtr.Zero渡していいのかな? C#はよく知らんが
538 :
デフォルトの名無しさん :2006/11/29(水) 00:33:55
>>535 OllyDbgは余裕でハードウェアブレークポイント提供してますが何か?
>>537 Win32の世界に限ればNULLは内部表現も0であると決め付けてまったく問題ない
>>538 MS純正のi386kdにもあると思う
実際Microsoftでのサンプルコードでも0として使われてるから
NULL使っててもいいんじゃないか?
>>539 がいうように"Win32の世界に限れば"な
>>536 どさくさに紛れやがって・・・・
ガッ!!!
数値としての0を定義するマクロってあるかな?ZEROとか? とりあえず開発環境で定義されている、MB_OK辺りでも使っとくか。 ポインタよりは、数値の定義という点でマシだから。
hWnd=CreateWindowEx(MB_OK, "MyWndClass",… テラワロス
if(a-b == MB_OK) DrawText((hdc, MB_OK, MB_OK, "かんべんしてください",10);
for( i=MB_OK; i<10; i++) for( j=MB_OK; j<10; j++) for( k=MB_OK; k<10; k++) …
そもそもCでは10進数の0を表現できる手段がないのがいけない。
NULLとかMB_OKだと、0以外の値にする必要が生じても定義を変えられないわけだから、 そんなものを使う意味は無いよな。独自定義か、そのまま0でおk。
>>514 ダイアログのCS_SAVEBITS。Saveされた絵を無効にすればいい。
それと、メニュー表示時は518のメッセージループを通らない。
あと、WM_PAINTハンドラはあった方がいい。
551 :
506 :2006/11/29(水) 16:47:53
遅レスですみませんm(_ _)m なるほど、ちゃんと方法があるんだなぁ・・・ と、思ったもののなかなかDLL側だけでどうこうというのは 難しいですね(´・ω・`) 少しSleepでもさせてからFreeLibraryAndExitThreadを呼ぶとか そんな方法しかないかなぁ(->Release()だけで済ませたいなら)。 色々やってみます、ありがとうございました。
554 :
520 :2006/11/30(木) 01:43:58
> pdb弄ぶライブラリ なんて卑猥なライブラリなんだ
>>512 亀だがwine検索してみたら
/***********************************************************************
* FreeLibraryAndExitThread (KERNEL32.@)
*/
void WINAPI FreeLibraryAndExitThread(HINSTANCE hLibModule, DWORD dwExitCode)
{
FreeLibrary(hLibModule);
ExitThread(dwExitCode);
}
_, ._
( ゚ Д゚) マジで?
>>556 バロスwwwwwwww
なんだこの関数wwwwwwwww
イカスw
DLL内で同じ事をするとFreeLibraryから帰ってきた瞬間に死亡するから有用なAPIだよ
>>556 いや、そのコードで正しいんだよ。
>>559 氏も書いているが、FreeLibraryAndExitThread()が
kernel32.dll内にあることに重大な意味がある。
FreeLibraryAndExitThreadFreeLibraryAndExitThread. ロード済みのダイナミックリンクライブラリ(DLL)の参照カウントを 1 減らし、 ExitThread ... VOID FreeLibraryAndExitThread( HMODULE hModule, // DLL モジュールのハンドル DWORD dwExitCode // スレッドの終了コード); ... www.microsoft.com/japan/developer/library/Jpwinpf/_win32_freelibraryandexitthread.htm - 4k -
空気が読めない奴はこれだから
空気は読むもんじゃない。 吸うもんだ。
>>556 AdvancedWindowsでも、kernel32.dllの中で次のように実装されているといって、
全く同じコードが載せられている。
FreeLibraryでエラーでたらどうすんの?
>>560 ああ成程。kernel32からFreeLibraryとExitThread投げてくれるから
ちゃんと解放してくれるわけか。勉強になった。
567 :
デフォルトの名無しさん :2006/12/01(金) 00:37:17
Sleep(INFINITE) で質問なのですが INFINITEで無制限待機になったスレッドを起こす方法はないのでしょうか? javaや.NET Frameworkのスレッドメソッドだと sleep,join,wait 状態を解除するinterruptメソッドがあるのですが・・・ linux系の一部実装だとwakeupとかかな・・・? ともかく、これに相当するようなWin32 APIはないのでしょうか。
>>567 WaitForSingleObjectとかで待機させろよ
>>567 SuspendThreadとResumeThreadってのがるけど、
あれ?自分をsuspendって出来るんだっけ?
>>569 SleepとかWaitForSingleObjectとかしてちゃ何もできんだろ・・・
>>567 は他スレッドから待機を終わらせる方法を聞いてるんじゃないのか?
WaitForSingleObjectでいいだろ、常識的に考えて
572 :
567 :2006/12/01(金) 01:30:09
WaitForSingleObject,timeout=INFINITEで ハンドルはセマフォ(1,1)あたりを渡す方法ですかね?
createEvent
574 :
569 :2006/12/01(金) 01:50:53
>>570 Sleepする代わりにSuspendThread(自分)ってやったら
他スレッドから起こすことが出来るかな?と思って。
今、試せないからどうなるのか分からないので。
でもまあ、スレッド間で同期を取ることを考えると、
普通にWaitFor〜がいいとは思うけど。
俺は普通に使ってる>Suspend自分
待機だけじゃなくて、非常脱出もみたいから WaitForMultipleObjects で 寝るようにしてるな
逆にSuspendって自分以外に使うの怖くない? 今何してるか分からん奴を突然止めてしまうのは気持ち悪い。
ハァハァ、今ナニしてるの・・・?
手術中の医者をSuspend 着陸直前のジャンボのパイロットをSuspend
あの娘をSuspendしていろんな事を
気づいたときにはTerminate
>>578 \(
∧_∧ ハァハァ
シコ ( ´Д`/"lヽ
/´ ( ,人)
シコ ( ) ゚ ゚| | オナヌーしてます
\ \__,| ⊂llll
\_つ ⊂llll
( ノ ノ
| (__人_) \
reader/writer lockってvista以上でサポートかよ。 2000でもサポートしてくれよぉ。
584 :
デフォルトの名無しさん :2006/12/01(金) 22:55:02
RSSチェッカーやメールチェッカーなどのプログラムでよく実現されていますが、 起動時(とか復元時)にウィンドウを表示しつつも そのウィンドウがアクティブにならないで最前面に表示されるソフトは、 どういうやり方をしていますか?
>>584 TopMostで表示して、ユーザーが触ったら元に戻す
とかすればええんちゃう?
>>584 書き方が悪くて申し訳ない。
ただ、作業中のソフトから入力カーソルを奪わないで起動したかっただけなのです。
いろいろ試しているうちに、
SetWindowPosにSWP_NOACTIVATEというフラグがあるのを発見しました。
どうやら、これでうまくいきそうです。多分。
587 :
586 :2006/12/01(金) 23:21:34
レスアンカー間違えた・・・
>>585 でした。レスありがとう。
588 :
デフォルトの名無しさん :2006/12/02(土) 01:04:38
あるウィンドウに貼り付けられてるコントロールを別のウィンドウにコントロールのハンドルを維持したまま 移動することって可能ですか?
SetParentは試してみました?
590 :
デフォルトの名無しさん :2006/12/02(土) 01:43:06
>>583 Vistaってそういうカーネルレベルの改良意外と多いんだよね。
Win板とか行くとみんなAeroくらいしかないと思ってるみたいだけど
Win板の連中は表面しか見ない(見えない)からね〜。
よく分からないんだけど、 System.Threading.ReaderWriterLock プラットフォーム Win98以上 ってのがあるようだ。 スレ違いだけど。
それ.NET Framework
595 :
デフォルトの名無しさん :2006/12/02(土) 11:05:03
質問です。C# でタイトルバーの縦幅のピクセル数をAPI取得したいんですが ───────────────── using System.Runtime.InteropServices; ───────────────── [DllImport("coredll.dll")] private static extern int GetSystemMetrics(int nIndex); private int titlebar { get{ return (GetSystemMetrics(SM_CYCAPTION)); }} ───────────────── これで実行すると「SM_CYCAPTIONはクラスまたは名前空間に存在しません」 と出てしまいます。まだ何かたりないのでしょうか。初心者な質問ですいませんがお願いします。
NTではRtlAquireResourceExclusive/RtlAquireResourceSharedがあったようですが。
>>595 SM_CYCAPTIONをconstで宣言しろ。
>>595 Win32のヘッダファイルを漁って、SM_CYCAPTIONの定義を見つけて
自分でconstとかで定義する。
>>595 そもそもC#というか、.NET Frameworkの
System.Windows.Forms.SystemInformation.CaptionHeight プロパティ
じゃ駄目なのか?
リストビューを作ったんですけど、水平スクロールバーを消すにはどうすればいいですか?
そのリストビューのスタイルからWS_HSCROLLを除外すればいい
自分で作ったプログラムからメモ帳とかIEを開くにはどうすればいいですか?
ShellExecute or ShellExecuteEx
>>602 具体的にはどのようにすれば良いのですか?
すみません、また分からないところが… 自分で作ったプログラムから、 指定したcppファイルを指定したコンパイラでコンパイルするプグラムを作りたいのですが、 ShellExecuteをつかって、コンパイルするところまではできたのですが、 コンパイラからのメッセージ文(エラーが出てコンパイルできなかったとか、正常にできたとか)を、 どうやって自分のプログラムに取り込めばよいのかがわかりません。 使っているコンパイラはbcc55なので、 ShellExecute( NULL, NULL, TEXT("bcc32"), TEXT("test.cpp > message.txt"), NULL, SW_SHOWNORMAL); という感じにすれば、 message.txt で取れるかと思ったのですが、できませんでした。 どうしたらいいのか、なにかヒントを教えてもらえると助かります。
>>606 ちったぁ自分で調べるってことしろや
>>1 にも書いてあろうがよ
「ウィンドウスタイル 変更」でググるだけでいくらでも参考になりそうなものが出てくるぜ?
>>607 「>」とか「2>」はcmd.exeの機能だからcmd.exeを実行してやる必要がある。
611 :
610 :2006/12/02(土) 19:26:46
書いてて自信がなくなってきたが
>>609 >>610 ありがとうございます。早速ググッて見たのですが、説明が難しかったので、勉強してきます。
>>612 >>610 は"cmd.exe /c bcc32.exe -h > message.txt"
614 :
607 :2006/12/02(土) 22:55:19
まだパイプについてはよく分からないのですが、検索した結果、 下のように作ったら、思ったように動かせました。 ありがとうございました。 BOOL MyFunc_CreateProcess (LPSTR lpszCommandLine, LPSTR lpszFilePath) { HANDLE hFile; STARTUPINFO si; PROCESS_INFORMATION pi; hFile = CreateFile(lpszFilePath,GENERIC_WRITE,0,NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); ZeroMemory(&si,sizeof(si)); ZeroMemory(&pi,sizeof(pi)); si.cb=sizeof(si); si.dwFlags=STARTF_USESTDHANDLES; si.hStdOutput=hFile; CreateProcess(NULL,lpszCommandLine,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi); WaitForSingleObject(pi.hProcess, INFINITE); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); CloseHandle(hFile); return TRUE; }
615 :
607 :2006/12/02(土) 22:57:29
>>613 リロード忘れてました。orz
そ、そんな簡単にできるんですか……orz
でも9xにcmd.exeは無い罠。 607のようにプログラムでリダイレクトしてやるほうがいいと思う。
じゃぁ,command.comでいいじゃん。
%comspec%を知らないやつがこんなにいるとは・・・
>>618 完全に忘れていた。%ComSpec%
思い出させてくれてありがとう。
スクリプトの話しなどしていない罠
うん。スクリプトの話なんか誰もしてないね。
スプリクトの話はしてもいい?
625 :
デフォルトの名無しさん :2006/12/03(日) 01:22:22
Win32でXMLを扱うことができるAPIはありませんか?
ありがとう。SDKを導入しないといけないのですね。。 チョイ仕事では済みそうにないですね。 とにかくサンキュー
628 :
デフォルトの名無しさん :2006/12/03(日) 01:38:05
先生、%ComSpec%の使い方を教えてください! マジで!
英語版のプロパティシートを作ったんですが、 それを実行すると日本語環境と英語環境でプロパティシート のサイズが変わってしまいます。中身のサイズは同じよう です。 何が原因かわかりますでしょうか?
fontはダイアログプロパティにてms sans serif 9に しています。 実際に表示されるフォントが違うかどうかは確認して ないんですが、中身のサイズは同じようなので 違うと思ってたんですが。
いや、親ウィンドウのフォントが違うんじゃないかと思ったんだけど。
>>633 プロパティシート自体がトップウインドウなんです。
FontLinkの影響か? 影響を受けないフォント(Arialとか)にしてみたらどうだろう。
>>635 Arialにしてみましたが、だめでした。
Arialにすると、英語windowsで内部がはみ出してしまいました。
SDKのプロパティシート関係を真面目に読んでみた。 1. ページの大きさは互換性の関係で、 指定フォントではなく'MS Shell Dlg'を基に計算される。 2. Windows2000以降では、 DIALOGEXテンプレートでDS_SHELLFONTスタイルを指定した時、 指定フォントに基づいて計算される。 訳が間違っていたらすまん。
同じ MS Sans Serif でも日本語Windowsと英語Windowsでは(更に言うなら中国語他も) フォントが違うよ。 プロパティーシートにする前に、普通のダイアログで試してみそ。 よって、プロパティーシートの親ウィンドウのサイズは決め打ちではNG。
ページのそれとシートのそれとは関係が無い。 シートのDLGTEMPLATE中のそれは日英で異なる。 DLLを覗くか、シートのフォントを調べられたし。
>>638 ,639
ありがとう。いろいろやってたらできたみたいです。
PROPSHEETHEADERのフラグにPSH_USEPAGELANGを追加したら
シートの大きさが同じになりました。
ただタブのフォントが若干ちがくなりましたが、
これはOKとします。
CreateFileの引数にFILE_FLAG_NO_BUFFERING | FILE_FLAG_OVERLAPPEDを指定して、 セクタサイズが4KByteだけど1001KByteのファイルを作成したい場合は 最後の1KB書き込むときにはCloseHandleしてCreateFileしなおすか 最初からFILE_FLAG_NO_BUFFERINGを諦めるしかないんでしょうか
>>642 日本語でおk
とりあえず、セクタサイズは通常512byte、MOとかDVD-RAMとかで2KBの場合あり。
4KBなんてものは普通はないが。
644 :
642 :2006/12/04(月) 00:07:29
>>643 すみません
セクタサイズではなくクラスタサイズでした
MSDNには、FILE_FLAG_NO_BUFFERINGフラグを指定した場合
書き込み&読み込みサイズと、バッファーのアドレスと、ファイルの書き込み&読み込み開始位置が
ディスクのクラスタサイズと一致してなければいけないと書いてありました。
そのため、クラスタサイズが4KBのディスクに1001KBのファイルを作ろうとすると
最後の1KBが書き込めなくなってしまうので
1、FILE_FLAG_NO_BUFFERINGを諦める
(このフラグを指定すると非同期書き込みのパフォーマンスが上がると書いてあったので、できれば諦めたくない)
2、一度ファイルを開き直してから書き込む
(わざわざ開き直すのは面倒でスマートではない気がするので、他にいい方法があるなら避けたい)
この二つ以外に方法は無いのかと思って質問させていただきました
アロケーションユニットサイズのこと?
>>642 やったことないのでおおはずしかもしれないが、ダミーで埋めて 1004KB まで
書き込んでから、SetFilePointer() と SetEndOfFile() で余分なところを切
り捨てるんじゃだめ?
つーか、そんな小細工したってしなくたって、メディアの速度は変わらないよ。
書き込みの境界さえあってれば、サイズは可変でいけた気がする。 ちなみに、大抵の場合パフォーマンスが低下するので使用はお勧めしない。
650 :
642 :2006/12/04(月) 00:40:31
>>647 MSDNに思いっきりセクタサイズって書いてありましたねorz
>>646 SetFilePointerもセクタサイズ単位でしか移動できないようです
>>648 それはわかってるんですけどOSがバッファリングしなくなるので
その分早くなるのかと思いまして
>>649 >書き込みの境界さえあってれば、サイズは可変でいけた気がする。
やってみたところ、WriteFileがエラーを吐きました
GetLastErrorしてみたらエラーコードは0x57で「パラメータが間違っています。」だそうです
セクタサイズの整数倍にした場合はエラーになりませんでした。
>ちなみに、大抵の場合パフォーマンスが低下するので使用はお勧めしない。
そうなんですか・・・
こういうのはあまり詳しくないのでMSDNの記述を鵜呑みにしてました
勉強してちゃんと理解できるようになるまではFILE_FLAG_NO_BUFFERINGを諦めることにします
>>643-649 ありがとうございました
最適化(と本人は思ってる)に凝る時期が俺にもありました。
Win32触った奴なら、NO_BUFFERINGに夢見てしまう事が一度はあるだろうな。
>>650 NO_BUFFERINGは、ディスクキャッシュをあまり汚さずに済むのが唯一の利点かな。
FFCとかは使ってるのかもしれない。
>>650 DBMSのように自前でバッファリングしてI/O回数の最適化を意識した処理を作っているのでなければ、
NO_BUFFERINGを使うメリットなんてないだろう。
通常のアプリくらいならやらないほうがいいと思う。
ISOディスクイメージファイルの仕様が見つかりません。 ISO-9660ディスクの仕様なら見つかるのですが・・・
583 名前: デフォルトの名無しさん [sage] 投稿日: 2006/12/01(金) 13:44:42
reader/writer lockってvista以上でサポートかよ。
2000でもサポートしてくれよぉ。
591 名前: デフォルトの名無しさん [sage] 投稿日: 2006/12/02(土) 02:50:20
>>583 Vistaってそういうカーネルレベルの改良意外と多いんだよね。
Win板とか行くとみんなAeroくらいしかないと思ってるみたいだけど
592 名前: デフォルトの名無しさん [sage] 投稿日: 2006/12/02(土) 09:09:33
Win板の連中は表面しか見ない(見えない)からね〜。
ntdll内で実装されているのでカーネルレベルの変更ではない。
目糞鼻糞だな。
わざわざコピペしてまで言いたかったんだね。
658 :
デフォルトの名無しさん :2006/12/04(月) 14:58:17
リバースエンジニアリングを行わないとntdll内で完結しているとは断言できないな
>>654 スレ違いだが、まずは手元の適当なISOイメージが、そのISO-9660ディスクの仕様と一致しているか確かめろ。
一致しているならそれで良し、違ったらお前のググり方が悪い。
なんか一人暴れてる馬鹿がいるな
ド素人の質問で悪いんだが reader/writer lockってどんなの? APIの名前じゃ無さそうだが
・誰かが書き込み中なら、読み込み要求は待たされ ・誰かが読み中なら、書き込み要求は待たされ ・皆読み中での、読み込み要求は待たされずにすんなり通る をプロセス/スレッドまたいで、うまく解決できるようにする機構
どうも
>>654 とりあえずISOディスクイメージファイルって何ぞやってことだな.
自分用語だから誰もそれが何なのか分からない.
CD-ROM及びDVD-ROMは1セクタにつき2048バイトをデータとする論理構造を持ち
一般的にはそれの1トラックの連結ストリームをイメージファイルとするけど、CD-R
では本来の補助情報を含めた2352バイトを物理的に焼きこめることもあって、各ソフト
毎に好き勝手に独自フォーマットを持っている. (DVDはRAW焼きはできません)
また、TOC情報とかもイメージに取り込んでいるのもあるな.
ので、一般的にisoイメージと呼ばれているものはその実はそれが何なのかは、
それだけでは分からない. 一番可能性が高いのは1セクタ2048バイトなシングル
トラックイメージというだけ.
MSDN マジオススメ
GetWindowLong()で、GWL_WNDPROCとDWL_DLGPROCの違いがわからない。 ウィンドウとダイアログの違いって?(^^;
>>620 ExpandEnvironmentStringsの話ならおk?
>>596 Vistaに限らずNT系の新APIに見えるものは実はntdllの非公開APIに公開の皮を
かぶせただけ、ってパターンも結構あるな。
Win9x切り捨てたので遠慮する必要がなくなったんだろう
672 :
デフォルトの名無しさん :2006/12/05(火) 10:15:18
初歩的な質問ですみません。 VisualC++ 2005 EE を使い始めたのですが、 VisualC++ 6.0と違ってリソースエディタがありません。 なので、無理矢理コントロールをウインドウに貼り付けて処理したいと思うのですが、 どのように貼り付ければ良いのか、参考となるサイトなど教えていただけないでしょか?
>>672 VC6のリソースエディタなりサードパーティ製リソースエディタ使えば?BCCFormとか。
ダイアログのWindowProc(DefDlgProc)はこんな感じ。 LRESULT API DefDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { BOOL result = FALSE; hwnd->DWL_MSGRESULT = 0; if(hwnd->DWL_DLGPROC && (result = CallDlgProc(hwnd, message, wParam, lParam)) { //メッセージに応じてDWL_MSGRESULTかresultを返す return DWL_MDGRESULT or result; } else { switch(message) { /*さまざまなメッセージハンドラ*/ case WM_XXXX: return 何とか default: return DefWindowProc(hwnd, message, wParam, lParam); } } } DlgProcはダイアログのWindowProcのフロントエンドなので、 DlgProcでデフォルト処理後に独自の処理を加えるのはメンド臭いです。
675 :
672 :2006/12/05(火) 11:14:36
>>673-674 迅速なレス有難う御座います。
方法すら見当もつかなかった自分としては、お二方のご指南本当に有難いです。
やはりソースコードで全て処理するとなるとやや時間もかかり、
面倒かもしれませんが、頑張ってみようと思います。
ドラッグ・アンド・ドロップで DragQueryFile関数を使いパスつきのファイル名が取得できますが パスなしのファイル名が取得できる関数はあるのでしょうか?
パス削ったらいいがな(´・ω・`)
PathFindFileName
679 :
676 :2006/12/05(火) 11:44:27
>>672 その方法は面倒だが、それだって探せばいくらでも見つかる。
親のWM_CREATEで子をCreateWindow(Ex)すればいいだけ。
WindowsでUSBメモリとかで繋いだときにそのタイミングで 接続されたイベントを取得したい場合どうすればいいでしょうか? ipodを繋いだらitunesが起動するみたいなことがやりたいです。 msdnとかで調べたけどわかりませんでした。 お願いします。
WM_DEVICECHANGE
683 :
デフォルトの名無しさん :2006/12/06(水) 15:19:42
DirectXを利用しているプログラムで 日本語入力をしたいのですが IMEに未確定文字を表示させないようにして 独自で描画することはできますか?
684 :
683 :2006/12/06(水) 15:49:39
すまん、やっぱDirectXスレのほうで聞いてくる。
>>681 SHCNE_MEDIAINSERTEDだな。
ツールバーのあるアプリケーションを ValidateRectで描画を更新しているのですが VC++6.0から実行すると、ツールバーが消えてしまいますが exeから動かすとツールバーが表示されています。 これはどうしようも無いんでしょうか。 BeginPaint〜EndPaintだとVC++6.0の実行でも問題なし
>>686 絶対なんかやってることがおかしい。
あと「ValidateRectで描画を更新」って何だよ?
ValidateRectって「もう描画しなくてもいいよ」って命令じゃなかったぽ?
WM_PAINTする領域に含めなくていいよ、という命令
その逆はそのまんまでInvalidateRect。
691 :
203 :2006/12/06(水) 21:48:28
メッセージは while( 1 ) { if( ::PeekMessage( &msg, NULL, 0U, 0U, PM_NOREMOVE ) ) { if( ::GetMessage( &msg, NULL, 0, 0 ) <= 0 ) return msg.wParam; ::TranslateMessage(&msg); ::DispatchMessage(&msg); } } プロシージャでは GetClientRect( g_hWnd, &wrc ); GetClientRect( g_hTool, &trc ); wrc.top = trc.bottom; を case WM_TIMER: InvalidateRect( g_hWnd, &wrc, TRUE ); UpdateWindow( g_hWnd ); break; case WM_PAINT: ValidateRect( g_hWnd, &wrc ); break; といった感じで処理しています。 たまにツールバーが出現したりして謎です。 ValidateRectの描画の更新は、すいません表現を間違えました。
標準リストビューの行の高さって変更できますか? やり方教えてください。
693 :
691 :2006/12/06(水) 21:50:56
名前欄間違えた。 ×203 ○686
そのビジーループには何か意味があるの?
695 :
692 :2006/12/06(水) 21:51:31
全部の行ではなくて指定した行の高さってことです。
TextOutで@、Tとかの表示の文字化けは大丈夫でしょうか。
Sleep(1)とかしろよ。
698 :
696 :2006/12/06(水) 21:54:44
自分は9x系を使っていて、9x系なら大丈夫みたいですが、 他ののWindowバージョンだとどうでしょうか。
PeekMessageは何の意味が?
IDLE時に何かしたい時にあういうループ組むね ゲーム作ってる時とか
ループなんてどうでもいいが WM_PAINT内の処理がありえないな せっかく描画しようとしてるところを、描画もせずに「もう描画しなくていいよ」なんていや消えるのは当たり前だろ ツールバーも親ウィンドウ上にあるものだぞ?
>>691 は要は
人に「ちょっとこっち来て!」って呼んどいて
来たら「こっち来るんじゃねーよ!」って言うようなもんだな。
704 :
686 :2006/12/06(水) 22:06:39
InvalidateRect と ValidateRect に NULLなりGetClientで得た領域をそのまま渡すと ツールバーが塗り潰されてしまいます。 ツールバーとValidateRectは合わないのだろうか
>>704 つーかあんた、最初の自分の書き込みで最後に結論出してるだろうが
707 :
686 :2006/12/06(水) 22:12:12
>>706 BeginPaint〜EndPaint を使うと
DirectXの
Clear, BeginScene, EndScene, Present使うと
チラチラチラチラするもんで
出来れば ValidateRect を使いたいなと
708 :
704 :2006/12/06(水) 22:12:30
後キミ、InvalidateRectを目が痛くなるまで調べてこい
すごく、ミスです・・・orz
711 :
696 :2006/12/06(水) 22:54:02
文字化けが大丈夫かって、どう大丈夫なのかわかりゃせんし 文字化けするかしないかってだけなら そ ん な こ た ぁ 自 分 で 実 行 し て み り ゃ わ か る だ ろ
そもそも、@とかTとかの文字化けがなぜ起こるのかを知ってたら
>>696 みたいな質問は出てくるわけがないと思うんだが。
丸数字とかはOSの違いによる文字化けじゃなかったか? まあソフトで使う分には、対象言語圏が日本なら心配要らないだろう
そんなに心配ならTextOutW使っておけ。9xでも対応している。
かなり誤解を招きそうなので訂正 丸数字の文字化けを考えないといけないのは違うOSで表示させる場合 (WEBアプリケーションとか)
つ プリンタにフォントが無い この場合も化けはしないけどな
718 :
696 :2006/12/06(水) 23:21:48
みなさまありがとうございます。 参考になりました。
うっかりCreateFontでCharSet(文字集合)がとんでもないものを指定してしまったフォントでは化ける。 勿論丸付き数字どころの騒ぎではない。
タスクバーに表示させない方法はあるのでしょうか?
何を?
天は自ら助くる者をタスク
723 :
720 :2006/12/07(木) 00:41:14
ウインドウが開いているときにタスクバー に表示させない(つかわない)方法はないでしょうか?
ウィンドウのスタイルを変えるかタスクバーのリストビューをフック
WS_EX_APPWINDOWだっけ?
アイコンエディタって何が使いやすい?
俺は Axialis のシェアウェア使ってる。 その他のアイコンエディタをほとんど使ってないから、 他と比べてどうかは知らんが満足してる。
>>704 >ツールバーが塗り潰されてしまいます。
DirectXが塗りつぶしているのなら、DirectXの使う領域を指定する。
単一色で塗りつぶされているのなら、ウィンドウスタイルにWS_CLIPCHILDRENをつける。
または、WNDCLASS(EX)のhbrBackground=NULLでもいいと思う。
それより、DirectX描画用の子ウィンドウをつくり、
WM_SIZEでクライアント領域のツールバーの下に移動する方が簡単。
つーか何ゆえに 別にウィンドウが一旦隠れたわけでもないのに メッセージループ内からWM_PAINT発生させてんのか理解できんのだが そんなことすりゃチラつくのは当たり前だろうと WM_PAINTの存在意味を解って無いだろ
>そんなことすりゃチラつくのは当たり前だろうと BeginPaintせずにValidateRectしてるんだからちらつきましぇん。
732 :
686 :2006/12/07(木) 11:59:59
>>729 有難うございます
WS_CLIPCHILDRENで解決しました。
領域を指定しての最初のValidateRect
は無効領域を残したままだったので
いつまでもWM_PAINTが残っている状態でした。
かといって全領域を指定するとWM_PAINTは消えますが
ツールバーごと塗り潰すといった事態に
DirectXに関してはPresentに
ツールバー分を引いたクライアント領域に
転送(2番目引数)するようにしています。
>DirectX描画用の子ウィンドウをつくり、
>WM_SIZEでクライアント領域のツールバーの下に移動する方が簡単。
その内使わせて頂きます。
>>730 アニメーションやらシミュレーションやらを入れたいと思ったので
WM_PAINTを発生させまくる状況を作ってみました。
Direct3Dを使っていてなぜ アニメーションやらシミュレーションやらを入れるのにWM_PAINT連打せねばならぬのか
C#を使ってプログラミングしてます。 他アプリケーションのDataGridに表示されている値を取得する方法はありますでしょうか? LABELやConboBoxの値はWin32APIを使って取得する方法は分かるのですが DataGrid系に表示されている値の取得方法がどうしても分かりません・・・('A`)
736 :
デフォルトの名無しさん :2006/12/08(金) 01:29:31
マ板で質問したのですが、ム板に誘導されましたので、こちらで質問します。 CD-Rや、DVD-Rなどの光メディアに、プログラムから書き込むことって可能ですか? API名とか、ヒント下さい。
>736 SPTI
739 :
デフォルトの名無しさん :2006/12/08(金) 02:00:54
GetPixel()でDirectX使ったアプリの色情報を取得したいのですが、 どうしても0が返されます。 DirectXアプリ以外のエリアで情報を取得する分には問題ないのですが。 特殊なやり方をしないととれないのでしょうか。
>>737-738 なるほど、こんなのが有ったんですね。
ありがとうございます。助かりました。
文字認識や手書き認識の再利用可能なモジュールってどこかにあるのだろうか?
Win32 APIに?
Tablet PC Platform SDKでは提供されているみたいだけどね。
744 :
kk :2006/12/08(金) 08:51:48
WinAPI + C++で、リソーススクリプトで作った ダイアログのエディットボックスに入力されてる文字列はどうすれば PTSTRなどに入れられるのでしょうか
普通にGetDlgItemText/GetWindowText
746 :
kk :2006/12/08(金) 09:17:28
リソーススクリプトを使用しているので、エディットボックスのHWNDがないのですが。。。
なんで、リソーススクリプトを使用していると、エディットボックスのHWNDが無いと思うの?
748 :
245 :2006/12/08(金) 11:21:04
CreateCompatibleDCで作った場所に、 rectangleで書きこんで一部消去とか(真中だけ抜く)は、 抜きたい部分をXORで合成するしかないでしょうか? 指定したrectの分だけ消去するとかできないもんでしょうか。 CreateCompatibleDCで作った場所に書きこんで、 ほかのDCに書きこんだら、CreateCompatibleDCにrectangleしたところ意外は、 透明でほかのDCに書きこまれるので、rectangleの真中だけ書きこむ前の透明にしたいです。
>>748 日本語でおk
rectangleしたところって意味不明すぎるw
>>746 GetDlgItemTextは親のウィンドウハンドルと子のIDがあれば十分。
GetWindowTextLengthとGetWindowTextのコンビを行いたければ、GetDlgItem使え。
751 :
748 :2006/12/08(金) 12:33:40
// Rectangleするとこ HDC hDC = GetDC(hWnd) HCD hMemoryDC = CreateCompatibleDC(hDC); HBITMAP hBitmap = CreateComatibleBitmap(hDC, 640, 480); SelectObject(hMemoryDC, hBitmap); DeleteObject(hBitmap); SelectObject(hMemoryDC, GetStockObject(GRAY_BRUSH)); Rectangle(hMemoryDC, 0, 0, 640, 480); ClearRect(hMemoryDC, 160, 120, 480, 360);// Rectangleで書いたところの一部を消したい ---------- WndProcでWM_PAINTのところ case WM_PAINT: hDC = BeginPaint(hWnd, &ps); BitBlt(hDC, 0, 0, 640, 480, hMemoryDC, 0, 0, SRCCOPY); EndPaint(hWnd, &ps) ↑みたいな処理で、ClearRectに該当する処理を探しています
753 :
748 :2006/12/08(金) 13:02:33
754 :
748 :2006/12/08(金) 13:11:20
>>751 使っている間は、DeleteObjectしたらあかんという意味ですね。
プログラミングWindowsを読むと、WM_DESTROYでDeleteObject(hBitmap)みたくなっているのが多いので。
755 :
kk :2006/12/08(金) 13:27:56
>>745 >>747 >>750 ありがとうございます。
>>747 そう思ったのは、リソーススクリプトを使用したので
HWND = CreateWindow(--------,---,-,-,.....);
と書かなかったからです。
>>750 GetDlgItemText()で、ちゃんと入力された文字列を取り入れることができました。
ありがとうございます。
>>753 何そのダメすぎるサイト
そんなとこ参考にしてたらキミも終わっちまうぜ
757 :
748 :2006/12/08(金) 15:39:20
オレ・オワタ
758 :
デフォルトの名無しさん :2006/12/08(金) 16:50:47
JavaでいうところのSystem.currentTimeMillisはありますか?
759 :
デフォルトの名無しさん :2006/12/08(金) 16:54:01
途中で投稿してしまいました。 JavaでいうところのSystem.currentTimeMillisはありますか? GetLocalTimeでSYSTEMTIMEとって自分で掛け算ですか?
761 :
デフォルトの名無しさん :2006/12/08(金) 18:57:27
ほかのプログラムにバイナリデータを渡して起動するには どんな方法がよさげ? コマンドラインパラメータ以外で。
量とかどういう処理なのかとかもっと具体的じゃないと検討しようがない。 コマンドライン以外だと渡して起動というよりも起動後通信だな。 pipe、共有メモリ、ネットワーク等。
>>762 量は多くても1KBくらい。
確実に渡せる方法がいいです。
データ受け渡し用ファイルでも作れば?
質問です。 Windowsのエクスプローラの、ファイルやフォルダが表示される部分を 自分で作ったウィンドウに埋め込むにはどうすれば良いでしょうか。
右クリックで警告がでたりするがな。
うさみみハリケーンとか、ねこまんまとか ollydbg とかで メモリマップの表示っていうのありますが、あれはどの API をつかってるんでしょうか? 開始アドレス フラグ サイズ 00010000 -RW- 1000 00020000 -RW- 1000 0011F000 -RW- 11000 .... 77FDF000 -ERW- 1000 77FFE000 -R- 1000 こういうやつです。
VirtualProtectExとかReadProcessMemoryとかそこらへんだと思う。
WinMainをDLLに置くことは可能ですか?
>>771 無理。
スタティックリンクライブラリに置くことは可能。
エントリポイントから自分で書けばできるのではないだろうか。
FindFirstFile()/FindNextFile()で教えて下さい。 ワイルドカード+拡張子でファイルを検索してるのですが、これで引っ張ってくる ファイル名の順番はどういう順で返されるのでしょうか? 最初は名前順かと思ったのですが違うようで…
>775 それは邦訳を読んだけどそれでもイマイチ疑問なのヨ 具体的な例で、検索対象フォルダに名前が"a.txt"と"_.txt"で始まるファイルがあるとき、 explorerで「アイコンの整列->名前順」とすると _.txt a.txt という順で表示されますが、FindFirst/FindNextで検索すると逆に出てくる。 なぜ?('A`) '_' = 0x5f 'a' = 0x61 ってことを考慮するとexplorerの名前表示順がしっくりくるんだけどな…
質問の意図を伝えられなかったようで 回避方法見つけたからもういいわ
ファイルシステムに依存すると書いてあるじゃないか てか自前でソートすれ
>ファイルシステムに依存すると書いてあるじゃないか それを解った上で776を書いたんだが >てか自前でソートすれ そうしたよ
すると何か、FindFirst/FindNext を呼ぶたびに、 内部でファイルを列挙して並び替えて・・・って処理をやってくれというのか?
explorerとFindNextFile()の名前順の解釈が違うのは何故かを聞きたかったのだが >781 誰が何時そんな事を言ったのか言ってみ
つうかexplorerもXPとそれ以前でソートの仕方が違うよね ファイル名に数字がついた時とか
Explorer が
>>779 だからに決まってるじゃないか
>>776 FindNextFileはファイルシステムに物理的に格納されている順番で列挙するんだから。
z.txt
a.txt
の順で格納されていたら。その順で出てくるだけだと思うが。
たぶん、その実験した環境では、
a.txt
_.txt
の順番に格納されていたんだろうね。
explorerは表示する時に、ソートしなおしているんだから、「しっくりくる」順番なのは当然。
見えないリストボックスに読み込めばソートもしてくれると思うんだけど...
12520850.cpx 2052 3076 3com_dmi 6to4svc.dll a15.tbl a234.tbl aaaamon.dll Accesor.dll access.cpl acctres.dll accwiz.exe acelpdec.ax acledit.dll aclui.dll acode.tbl activeds.dll activeds.tlb actmovie.exe actskin4.ocx actxprxy.dll adddrv.exe admparse.dll ADODC.SRG ADODCJP.DLL adptif.dll adsldp.dll adsldpc.dll adsmsext.dll adsnds.dll adsnt.dll 勝手にソートしてんじゃん
789 :
774 :2006/12/09(土) 00:33:39
>787 正にそれで済ませたワケだが >788 先頭に'_'の付いたファイルも検索すれば言ってる事判ると思われ
>>789 b.txt、c.txtも検索すれば皆が言ってる事判ると思われ
取り敢えず名前順といってもAPIとExplorerで一貫してないっぽい 何故か?については誰も答えられない
792 :
デフォルトの名無しさん :2006/12/09(土) 00:43:35
>790 多分一番解ってないのはお前
>>769 GetSystemInfo
VirtualQueryEx
Windowsのファイルシステムドライバがファイル名の大文字小文字の 区別をつけないように組まれていることを考えればわかるだろうに。
>>789 LBS_STANDARDフラグは付けたの?
と、今更解ったような口を利く奴が登場ですよ
つうか
>>774 はどのファイルシステム使ってるんだよ?
NTFSなのかFATなのかくらい書けよ。
知ったかが答えられずに妙な突っかかり方してるようにしか見えんな
例えば、_, a, B, c, D を並び替えた場合、文字コード順にやってしまうと、 B < D < _ < a < c と並び替えられる。 a より B が前に来るのは、直感的に分かりにくい。 そのためエクスプローラでは、いわゆる辞書順に並び替えるため、 おそらくアルファベット大文字を小文字に変換してからソートしている。 _, a, B, c, D → _, a, b, c, d → _ < a < b < c < d → _ < a < B < c < D こうして、アンダーバーは先頭に持ってこられる。 全部予想だけど。
全角のA、aも半角と入り混じって辞書順になるよ 言語の設定を日本語にしてるときだけかもしれんけど
Zipフォルダを、エクスプローラだけじゃなくて 任意のアプリからフォルダのように見えるようにする事は無理なのでしょうか?
エクスプローラで全角スペースで始まるファイル名より前に来るファイル名を探せ
ファイル順がどうのと訳知り顔で囁いてる香具師らはまとめて
>>775 見ろ
>>801 それはAPIの質問なのか?
そのアプリ作った奴に頼め
おはようございます
ExplorerとAPIは同じであるべきだ、という前提が間違っているとは考えないのかな
>>803 英文を読めるような頭を持った人間なら、そもそもここまで話を引き伸ばせません。
NTFS上のソート順は ! < 0 < A,a < _ < α < あ < ア < 亜 < A,a Unicode順で、英字は大小の区別なし(大文字と見なす)、全角半角の区別あり、カタカナひらがなの区別あり といった感じだな。 explorerは、英字は大小の区別なし(小文字と見なす)、全角半角の区別なし、カタカナひらがなの区別なし、 漢字はJISコード順って感じかな。
>>807 本当に知らなくて恥ずかしかったんだろうな
811 :
kk :2006/12/09(土) 10:37:43
GetDlgItemText()で文字列を取得できたと思ったのですが、 うまく取得できてなく、 取得した文字列をatoiでintで変換したときにエラーになります。 エディットボックスに何を入れても、PTSTRにはいるのは「・U駆Qテ・」となっています。 何が原因なのでしょうか。
エクスプローラの順序でファイル名比較をするAPIがshlwapiか何かにあったはず
URLDownloadToFile関数で 返り値が返されるタイミングというのは ダウンロードが完了した時、接続に成功したときのどちらでしょうか?
自分のプロセスがどのくらいメモリを使用しているか取得する API はありますか?
ありますよ
>>815 すいません。教えていただけると幸いです。
PurosesuMemoriDorekurai( PUROSESUHANDORU ph );
>>811 そもそも整数値を取るつもりなら始めからGetDlgItemIntを使ったらどうか。
Process Explorerみたいに他のプロセスの環境変数を取得するには どのAPIをつかえばいいの?
ツリー構造のデータを外部に保存したいんだけど、データが大きいんでINIファイルだと遅くなりそう・・・ というわけでXMLに保存しようかと思うんだけど.NET使わずにXMLにアクセスする手段はありますか? MSXMLとかになるんでしょうか
MSXMLは高機能で便利だけど遅いよ。
iniファイルって64KBの制限があったような。
ありがとう、じゃあINIファイルで一度やってみる INIで木構造を維持するいい方法があったら教えてもらえると助かる
そのぐらい自分で考えろよ
分かった
別に ini にせんでも、独自形式にして タブの個数とかでやってみたら?
車輪の再発明は馬鹿げているので今後ともiniファイルでいきます どうもありがとうございました
ファイルの拡張子がINIということ自体は問題ないけど Get/WritePrivateProfile系APIでの読み書きしてるなら絶対遅いよ。 内部で1行ごとにOpen/Closeされてるだろうし..
試してから言えや
コーディング量が一番少ないのを薦めるよ RUBY最強だけどね
実行環境が問題無いならxmliteという手もある
>>820 ちゃんとしたやり方 or もっとスマートなやり方があるかも知れんけど、
SetWindowsHook系のAPI使うなりなんなりして自前のDLLを調べたい
プロセスにロードさせてやればそのDLLから取得できるべ。
>>829 これは車輪の再発名なんていう問題じゃないだろ。
すべてのソートにバブルソートを用いるとか、
君がツリーで管理しているデータなんかをすべて、たんなる配列で管理するとか、そういうレベルだろうが。
まぁ、スレ違いの質問するぐらいだから その程度の知識しか無いんだろ。
>>824 Delphi/BCBなら64KBの制限なくて早いよ('(゚∀゚∩
839 :
a :2006/12/09(土) 22:28:52
俺にとっては既出じゃないからありがとうと言ってやる
カトラーかと思ったら違うのね
>>820 ちなみにProcess Explorerはドライバをロードしているので
自前でカーネル空間から情報収集していると思う。
843 :
801 :2006/12/10(日) 03:13:03
そうじゃなくて・・・ SUBSTってコマンドとかありますよね。 仮想ドライブにアクセスすると 代わりに実際のフォルダをシステムが提供してくれるわけじゃないですか。 その場合任意のアプリが「だまされる」事になりますよね。 Windows、もしくはデバイスドライバなどの機能でそういった事ができないか、 という質問な訳です。
たぶんできないから、ドライバ書くかAPIフック。
APIフックじゃできない事が大杉。
すなおにドライバ書いた方がよさげ。 ようこそカーネルモードの世界へ。
847 :
デフォルトの名無しさん :2006/12/10(日) 06:02:37
すいません、教えてください。 win32apiを使って、c言語での処理の仕方を一通り学びました。 で、c言語での処理をしていたら、メッセージが来た時にそこに 長々とした処理を書くしか無い(知識不足ですが)ように思うんですが api関数をC++で独自でクラス化していく方法は有るんでしょうか。 mfcのヘッダーを見てたら、afx_msgが付いてる関数と#pragma comment(lib, "・・・")が目に付き で、#pragma commentを見てると、libを#ifdef#undef等で詰め込んでるように 見えます。あとPASCAL形式が気になります。 ついで、afx_msgがmessageに送られるWM_・・・ととらえて良いんでしょうか なぜ、このような質問をするかというと、単純にMFCがとっつきにくいというか マクロ等で、フレームワークとその子ウィンドウ、ツールバー等が最初の設定時点で 作成されてしまい、順序としてはフレーム、ビュー(子ウィンドウ)←→ドキュメント となってるのはわかりますが、マクロや関数が呼ばれていく順序が Cなら、WinMainのHINCTANCEをグローバルで持っておき、WNDCLASSEXで RegisterClassExで登録しウィンドウの生成でならまずNULL指定でオーナーとして存在させ・・・ と順に理解できるんですが、MFCだと、どうしても僕のレベルでは可読できません。 どなたか、このページなら参考になるとか、このオープンソースならわかりやすい と言う物を教えていただけないでしょうか。 初心者の質問でもうしわけありませんが、どなたかお願いいたします。
>>847 まず日本語を勉強しましょう。
言葉を理路整然と書き連ねる工夫をしましょう。
改行を不自然な位置で使用するのをやめましょう。
初心者である事は免罪符になりません。
subst自体は単にDefineDosDeviceを呼んでいるだけ。
もちろん、それで801のやりたいZipをということはできないだろうが。
>>847 > 長々とした処理を書くしか無い
そんなことはない。処理毎に関数を書いて、全てのメッセージの処理を関数呼出だけにすれば、
それだけでウィンドウプロシージャはだいぶすっきりする。
というわけで、とりあえずメッセージクラッカはどうよ。
>>843 いったんどっかの隠しディレクトリに物理的にファイルを展開しておいて
ファイルシステムフィルタドライバでパスをリダイレクトすればできる。
ネットワーク上のファイルをアクセスする時も同じような方法で処理されている。
Windows2000だけどポップアップメニューが馬鹿過ぎる… フォーカスを失っても閉じないことが結構あるんですが何で?
>>851 タスクトレイの話?
だったら、WM_NULL
> ネットワーク上のファイルをアクセスする時も同じような方法で処理されている。 それはオフラインファイルの場合だけじゃまいか
>>853 自分で作ったもんでもなければクラックして動作確認したわけでもないから
違うかもしれんが、少なくとも俺はそう聞いている。なんでも、ネットワーク
上のものだからいつアクセスできなくなるかわかったもんじゃないし、
第一、ファイルI/Oがある度にネットワーク経由のアクセスしてたんじゃ
パフォーマンスが最悪になるとかで、ネットワーク上のファイルが開かれる
場合はとにかくいったんファイル全体をダウンロードしてしまうらしい。
smbではそんな事してない。
VB NETスレで聞いてみたのですが、.NETでの関数では無理なようなのでここで質問させてください 他のアプリケーションプログラムを起動させたりするのはSystem.Diagnostics.Processで可能らしいのですが入力ボックスに自動で入力したり、ボタンを押したりさせるような 関数とかってWIN32APIで準備されているのでしょうか?
用意されてるよ
>>857 サンクス856です
具体的な関数名を教えてもらえませんか
SendMessage
>>847 本ならMFCインターナル、ただしこれはもう古いかもしれない。
それかソース追う。ただし全部把握するのはかなり大変。
ドキュメントビューアーキテクチャーは最初はやめた
法がいいと思う。
>>855 smbがそうなっているってだけで関係ねぇだろ。
ちなみにレドモンド帰りのヤツから聞いた話だ。
smb以外のプロトコルでファイルアクセスですかwww ちなみにレドモンド帰りの知人は何時頃どんな仕事をしていたのですか? 日本人は意外と少ないので知っている人かもしれませんね。
>>863 アホか。プロトコルとしてのsmbの話してるんだったらそれこそ関係ねぇだろ。
クライアント内でファイルをどう扱うかの話なんだから。
MS内ではわりかし有名な人だったみたいだから、本当にドンピシャで誰かわかるかもしれんから教えない。
画像に書かれている文字列をテキストデータとして取り出したいのですが どうすればいいですか?
入力作業のバイト君を雇うために募集広告を出す。
今から院生になって10年ぐらい研究する。
簡単には無理ってことか…
プリントアウトしてからスキャナにかけてOCRで読み込む
直接画像を OCR かけろw
フリーのOCR APIって無いの?
スレ違い
>>864 > アホか。プロトコルとしてのsmbの話してるんだったらそれこそ関係ねぇだろ。
> クライアント内でファイルをどう扱うかの話なんだから。
だからオフラインファイルだけじゃまいかと言ってるのに
> なんでも、ネットワーク
> 上のものだからいつアクセスできなくなるかわかったもんじゃないし、
> 第一、ファイルI/Oがある度にネットワーク経由のアクセスしてたんじゃ
> パフォーマンスが最悪になるとかで、ネットワーク上のファイルが開かれる
> 場合はとにかくいったんファイル全体をダウンロードしてしまうらしい。
とかオフラインファイルの説明そのものだし。
Cマガジンに続きWindowsDeveloperマガジンまで廃刊とは もうだめだ おしまいだ しぬしかない
WindowsDeveloperマガジンは1年で休刊だと思ったんだがなぁ。 なんでここまでもったのか分らん。
そういえば開発系週刊誌とか皆何読んでたりする?
開発系で週刊誌なんかあったか?
>>864 。
> アホか。プロトコルとしてのsmbの話してるんだったらそれこそ関係ねぇだろ。
どのプロトコルでアクセスするかによって処理が違うのですけど、ご存じない?
879 :
820 :2006/12/11(月) 02:40:18
隠しAPIだった、APIを使っているとか聞いたことがあるけど。その資料どこだったか見つけられない・・・。 まあインジェクトしてプロセス情報取得でもいけるから、さほど難しくはないよね。
881 :
デフォルトの名無しさん :2006/12/11(月) 17:29:38
マウスの位置は、GetCursorPosですよね? マウスボタンの状態を得る方法はありませんか? イベントハンドラを捕らえるしかないですか?
882 :
デフォルトの名無しさん :2006/12/11(月) 17:34:30
あ、GetAsyncKeyState(VK_LBUTTON) でいいのか。
883 :
720 :2006/12/11(月) 22:03:49
タスクバーの非表示はWS_EX_TOOLWINDOW を指定しできたのですが ダイアログボックスをメインにするにはどうすればいいでしょうか? ”ファイル名を指定して実行”のウインドウみたいにタスクバーに表示されず ダイアロボックスを表示させたいです。
885 :
720 :2006/12/11(月) 22:43:14
モーダルダイアログではメインにできないですか?
886 :
デフォルトの名無しさん :2006/12/11(月) 23:04:30
gimpとかオープンソースを参考にする と言おうと思ったけど ペイントならMSDNのサンプルにあったような気がする
マウスキャプチャって他のプロセスにはできないんですか?
890 :
デフォルトの名無しさん :2006/12/12(火) 10:45:53
プログラミングWindows 上下 Advanced Windows MSDNライブラリ 以外でWin32API、SDKプログラミングを学ぶ上で日本語なおすすめ良書教えてください。
猫
猫はWebで十分な気が。 てかプログラミングWindowsで何の不満が‥‥ あとはMFCやVCLのソースくらいじゃないか?日本語じゃないけど。
>プログラミングWindows 上下 >Advanced Windows >MSDNライブラリ これだけやったらあとは自分で判断できるだろう その本持て余すようだったら向いてないからあきらめた方がいい。
894 :
デフォルトの名無しさん :2006/12/12(火) 11:09:06
>>892 猫シリーズも読みました
丁寧な本だとおもった
>>893 えらく厳しいですね
ほかになんかイイ本ないかなーとおもってきいてます
ある程度読んで実践できるようになったから
ある程度読んで実践できるにしては質問が漠然としてる。
>>894 基礎はできてるみたいだから作りたいもの作れ
その都度MSDN等を参照しつつ覚えていけばいい
たぶん本に書いてある範囲ならできるけど、自力では何も作れないタイプ
899 :
890 :2006/12/12(火) 11:39:33
>>895 みたよ
Amazon見てたときは
Windows Server2003完全技術解説
インサイドMicrosoft Windows
Win32システムサービスプログラミング
とかをよもうとおもいましたがどんなもんでしょ
>>896 みんなどんなのよんでんのかなーとかいうレベルの質問ですよ
>>897 やっぱそうなりますよね
通勤長いんで(90分)本読むんですが、そのとき読みたいなーというかんじ
>>898 想像におまかせ
>>899 批判じゃないけどなんか漠然としてるんだよね
俺も楽しい本探すことが半ば趣味だからこの手のレス書いてみたいともったことはあるし
でも
>>892 の言うとおりで、ある程度知識吸収すると、
もうテクニック的には適当なソース読むのぐらいしかないんだよね
で、WTLとかWineとかおもしれーぞ、と
始発で座れるならノートにソース落としておくと退屈しねーぞ、と
通勤途中で見るとかなったら、後はアルゴリズム本とか開発系雑誌なんじゃね?
Robbinsのデバッグ本
実践的なことができるようになったなら本はそろそろ卒業したら? 何か実用的なプログラムのソースコードを読むのはどうかな。 数百〜数千行がいいかな。 きっと本を読んだ程度じゃスッと理解できない事が出てくるよ。 本のサンプルには載らないようなテクニックとかも学べそうだし。
基礎が終わったなら、コーディングスタイルとかの思想的な 部分の勉強もいいいけどスレ違いだな。
>みんなどんなのよんでんのかなーとかいうレベルの質問ですよ 本は読まないよ。 本に載る程度の簡単な内容ならネット上にごろごろ解説サイトがあるし。 詳しさを求めるならMSDN読むし。
>>900 さんの見てふと思った。
このソースは読んどけ、みたいなお勧めはありますか?
自分のレベルに合ったソースじゃないと意味がないし 何のためにプログラムを勉強するのかにもよる 目的すら無いならやめちまえ
半年前の自分のソースを読むといいってのをスラドで見かけた。
勉強中だと半年前の自分のソースって見てて恥ずかしくなるよね。
勉強初めて3ヶ月余りの俺は(ry
WinMainにシューティングゲームのソース1万行を全て書いていた俺
913 :
デフォルトの名無しさん :2006/12/12(火) 21:33:12
目くそが鼻くそをばかにしててワロタ
↑のどくそ
>>912 俺と同じ事してる奴がいるとはwwwwwwwwww
引数付関数なんてほとんど作ってなかった俺wwwwwwwww
>>912 メッセージの処理をどうやってたのか疑問
>>916 自前でループ回して
GetAsyncKeyStateとか使ってたんじゃないのw
WM_CLOSE拾えないから少なくともクローズボックスは反応しないな。
918 :
890 :2006/12/13(水) 08:52:35
>>891-917 なるほど。プログラミングWindowsやAdvancedWindowsみたいな入門書ではなく、
入門書の次に読むような本を期待していたんですがないんですね。
Windows、SDKとかの知識を深めようとおもったら、MSDN読み、人のソース読みしかなくなるっぽいので、
通勤にノートPCの導入を考えてみます。参考になりました。ありがとうございます。
Advanced Windowsが入門書…?
>>918 もう知ってるとおもうけどMSDNは日本語でおkな文面が多いから読むには結構気合が居るぞ。
あとこれは個人的な意見でしかないから深く考えないで欲しいんだが
電車の中とかでノート開いてる人ってキモくないか…?
920 :
デフォルトの名無しさん :2006/12/13(水) 09:13:58
>>919 ぁぁ、キモイとおもう。けど、知識はほしいから天秤にかけたら知識に成った。
すでにDELLに発注してしまった。自分のキモサが+1された。
921 :
デフォルトの名無しさん :2006/12/13(水) 09:23:31
>919 あどばんすどういんどうずハにゅうもんしょデス ほんとうニミタコトアリマスカ かくしょうのタイトルをみてみましょう
WH_CBTはWM_KILLFOCUSを扱ってくれないんですよ。
殺したいメッセージはWM_NULL二置換するとかいう方法もあるらしい やったことないけど
WH_CALLWNDPROCじゃメッセージ書き換えも破棄も無理だった気がする WH_GETMESSAGEならできたと思うけど
サービスからアプリケーションにメッセージを送るため、ウィンドウハンドルを 探したのですが見つかりません。どこにあるんでしょ・・・。(環境:Vista)
どんなウィンドウをどうやって探してたのよ。
ウィンドウハンドルがどこにあるのか、という疑問が出る時点で何かがおかしい気がする
notepadのウィンドウをEnumWindowで列挙して探してました。
FindWindowを知らないでEnumWindowでガリガリやるヤツなんて初めて見た
ウィンドウタイトルとか可変なのでEnumWindowで列挙してexeのフルパスで検索してたのです。
クラス名で検索できないの?
テストでnotepadを対象にしてたのですがクラス名も不明というか可変なので・・・。
Vista以外では動いてんの? サービス(違うユーザー)からのEnumWindows等はできなくなったんじゃない?
ちょwwww クラス名も可変ってwwww 何言ってんだwwww それとも、vistaから可変になったのか?
.netアプリは可変だな
xpでは動いてました。
EnumWindowsProcにハンドルって返ってきてるんじゃマイカ?
940 :
デフォルトの名無しさん :2006/12/13(水) 17:58:36
ウインドウのクライアント領域の左上の座標はとることはできないでしょうか? GetWindowRectで取得したRect.Left及び、Rect.Topは、ウインドウの左上のようです。 クライアント内の座標がほしいです。
読み間違えた。ごめん。 GetWindowRectに対して、ゲットクライアントレクト(つづり忘れた)があるよ。
まぁGetClientRectのLeft:Topは0だけどな
944 :
デフォルトの名無しさん :2006/12/13(水) 18:06:03
わかった。 ClientToScreenに、0, 0 の座標を渡せばいいんですね。 なあんだ、こんなことか。
まぁ、概それでいいんだが GetClientRectの結果を渡した方が、何かあった時困らなくていいと思うけどな
>>922-926 フックして潜り込んだ後、サブクラス化してしまえばどうにでもなるのでは?
947 :
922 :2006/12/13(水) 20:02:40
>>946 それだ。
何とかうまく行ったよ、サンクス。
ShellExecuteExでhtmlを開きたいのですが、 どうもVistaで動作しません。 対策を御存知の方はいらっしゃらないでしょうか。 SHELLEXECUTEINFO sei; ZeroMemory(&sei, sizeof(sei)); sei.cbSize = sizeof(sei); sei.fMask = SEE_MASK_NOCLOSEPROCESS; sei.hwnd = 0; sei.lpVerb = "open"; sei.lpFile = FileName; sei.lpParameters = NULL; sei.lpDirectory = NULL; sei.nShow = SW_NORMAL; ShellExecuteEx( &sei ); FileNameが".\\xxx.txt"だとしっかりメモ帳が開きますが、 FileNameが".\\xxx.html"だとIEが開いてくれない。。
対策:Vistaを使わなければいい
>>948 verbが"open"で登録されてないんじゃないか?
sei.lpVerb = NULL;
で、やってみ?
ochinchin.h を omanko.cpp に #include したのに IsDoutei() で TRUE が返って来るんですが。
>>917 WM_CLOSE、WM_COMMANDを拾えないのホント不便だよな。
>>951 omanko.cppをよく見ろ
#if AGE <= SYOUGAKUSEI
#include "ochinchin.h"
#else
#error doutei ga yurusareru noha syougakusei made dayone
#endif
955 :
デフォルトの名無しさん :2006/12/14(木) 09:05:51
SendMessage(GetDlgItem(hWnd,CTR_LIST),LB_ADDSTRING,0,(LPARAM)"TEST"); で、LISTBOXにアイテムを追加したいのですが、 Windowプロシージャの中に書かないとLISTBOXにアイテムが追加されません。 Windowプロシージャの外からはできないのでしょうか
Windowプロシージャの外ってどこだ? その場合ちゃんとウィンドウハンドルはとれてるのか?
957 :
デフォルトの名無しさん :2006/12/14(木) 10:40:57
フロントエンドアプリを作りたいのですが、 コンソールアプリを実行して、コンソールに表示される文字列を拾ってくるには どうやったらいいのでしょうか?
ShellExecuteでホームページを
httpプロトコルに関連付けられたブラウザを調べるにはどうすればいいですか?
>>961 >httpプロトコルに関連付けられたブラウザ
意味不明
>>962 例えば
ShellExecute(NULL, "open", "
http://www.google.co.jp/ ", NULL, NULL, SW_SHOWNORMAL)
ってやったら漏れの場合operaが開くんですが、
開く前にどのブラウザが関連付けられているか調べたいのです。
>>963 HKEY_CLASSES_ROOT\http\shell\open\command
HKEY_CLASSES_ROOT\http\shell\open\ddeexec\Application
このへん
個人的にはFindExecutableの方が好み。 レジストリのHKEY_CLASSES_ROOT\http\shell\openとかいう部分は 95からvistaまで同じなんだろうか?
>>966 それ、試してから言ってる?
ローカルの.htmlならそれでいけるだろうけどねー
勘違いスマソ
デフォルトのVerbがopenでない可能性もあるよね。 HKEY_CLASSES_ROOT\htmlfile\shellの既定の値も見ないと。
間違えた。 HKEY_CLASSES_ROOT\HTTP\shellの既定の値。
>>955 hWndが適切な値になってないだけとか。
タブ付?リストボックスの作り方がいまいちよくわからないのですが 教えていただけませんか? エクセルでいうなら一番上のA,B,Cとかいう選択できるタブみたいな奴なんですが うまく言葉で表せれないorz
974 :
973 :2006/12/14(木) 22:19:08
>>927 ヒント: ウィンドウステーションとデスクトップ
977 :
973 :2006/12/14(木) 22:30:33
>>975 ,976
うおおおおう!!
ありがとうごぜぇますだ!!!リストビューって名前だったのね
978 :
610 :2006/12/15(金) 00:22:48
閉じたウィンドウの、ウィンドウハンドルの値って、他のウィンドウが生成される際に再利用されるんでしょうか? というか、されると思うのですが、それって、直ぐに再利用の対象になるのでしょうか?それともずっと後になるのでしょうか?
デバッガ持ってないの?
>>979 システムによるし、そういうのを前提としたものを作ってはいけない
MSDN見てたら Microsoft is conducting an online survey to understand use of MSDN Online. We’d like to see which pages you visit today and then have you complete a survey when you leave MSDN Online. Would you like to participate? ってウインドウが突然上から降りてきて死ぬほどびびった〜 ええかげんにせえよ心臓止まるかと
983 :
デフォルトの名無しさん :2006/12/15(金) 15:14:07
メインウィンドウに貼り付けてあるリストボックスで、 項目がダブルクリックされたときにだけイベントを発生させるにはどうすればいいのでしょうか
WM_COMMAND LBN_DBLCLK
985 :
デフォルトの名無しさん :2006/12/15(金) 15:41:42
>>984 case WM_COMMAND:
switch(LOWORD(wParam)) {
case .....
となっているのですが、switch(LOWORD(wParam)){
のcaseに
case LBN_DBLCLKを書くんですか?
それとも、case リスト:内にif文を書くんですか?
ほんとにウィンドウ降ってきてワロタ
>>990 次スレよろしく
駄目だ・・・・キレそう・・・プチッと。
乙
992 :
979 :2006/12/15(金) 17:51:29
>>980 デバッガなどで表示して、しばらく確認した感じだと、
うちの環境(XP SP2)では、再利用されているのは無かったんですが、
そのへんの仕様が知りたいなと思いまして・・・
>>981 ごもっともです。。
他プロセスのウィンドウを区別するのに、一番手軽なので、
ウィンドウハンドルをキーにしていたのですが、考え直そうと思います。
今後の参考に、「システムによる」の部分を教えていただけると嬉しいです。
いつ128ビットモードで動くんだ?
>>992 Win16とWin32でメモリ空間の扱いがかわったからね。
>>992 GetWindowThreadProcessId()
ただしIDもプロセスが終了してすべてのハンドルが閉じられると再利用されるので
それが困る場合はプロセスハンドルを1つは開いておくように
1000ならバグが3個減る。
絶対無理。
998ならバグがあと998,998個
1000なら1ヶ月ぶりに休みが取れる…
if(line==1000)goto 次スレ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。