1 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 23:33:42 ] スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。 やさしいお兄さんやお姉さんたちが答えてくれるかも。 過去スレ、関連リンクは>>2-10 くらい。 ■注意 ・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。 ・日本語版MSDN Online Libraryは不完全です。英語版(msdn2.microsoft.com/library/ )の利用推奨。 ・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。 ・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで - Win32API質問箱 wiki wiki.livedoor.jp/program1/d/FrontPage Win32API質問箱 Build65 pc11.2ch.net/test/read.cgi/tech/1208847084/
152 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 00:32:57 ] >>149 LVS_SHOWSELALWAYSスタイル付ければいいような気がする
153 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 01:22:59 ] >>148 試したところ上手くいきました。ありがとうございます。 検証コード #include <windows.h> #include <msxml2.h> #include <stdio.h> #pragma comment(lib, "ole32") #pragma comment(lib, "msxml2") void examine() { static int counter = 0; IXMLDOMDocument* pv = NULL; HRESULT hr = CoCreateInstance(CLSID_DOMDocument2, NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument, (void**)&pv); printf("%d : hr=%08lx\r\n", ++counter, hr); if (SUCCEEDED(hr) && pv) { pv->Release(); } } void main () { examine(); CoInitialize(NULL); examine(); CoInitialize(NULL); examine(); CoInitialize(NULL); examine(); CoUninitialize(); examine(); CoUninitialize(); examine(); CoUninitialize(); examine(); }
154 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 04:48:05 ] >>153 DllMainでCoInitializeを呼ばないように注意して書いた方がいいぞ
155 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 20:02:02 ] >>152 それはすでにやっていて、フォーカスが外れても灰色にはなるのですが その灰色になる時に青いままにしたいのですが無理でしょうか?
156 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 20:08:52 ] できないことも無いけど、フォーカスが無いことをユーザーはどうやって知るの?
157 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 20:17:54 ] 教えてから訊いてやれよw
158 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 21:32:45 ] >>151 そうなんですかね、 あきらめてフックしなきゃダメか。
159 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 22:40:29 ] >153 それはアパートメントはどーなるんだ? MTAとか混じってたら死亡でないのか?
160 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 22:48:05 ] 海外ドメイン規制で書き込めねー >>51 やってみたんですがダメでした。成功したらまた来ます。
161 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 23:02:34 ] >>159 エラーになってRPC_E_CHANGED_MODEが返ってくる。 msdn.microsoft.com/en-us/library/ms695279 (VS.85).aspx
162 名前:デフォルトの名無しさん [2008/05/21(水) 09:34:44 ] BMPの描画でダブルバッファリングを行いたいのですが、 〔背景BMP+新BMP〕HDC hdcBmp = 背景BMP HDC hdcBmp3 = CreateCompatibleDC(hdcBmp); HBITMAP hBMP3 = CreateCompatibleBitmap(hdcBmp,300,300); SelectObject(hdcBmp3,hBMP3); BitBlt(hdcBmp3背景BMPの上に新BMPを描画); case WM_PAINT: BitBlt(GetDC(hWnd),hdcBmp3を描画); 背景BMPに新BMPをくっつけたものを描画したいのですが 背景BMPが黒で塗り潰されてしまいます。 ┏━━━━━━━━━┓ ┃背景BMP ┃ ┃┏━━━━━━━┓┃ ┃┃新BMP ┃
163 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 09:46:00 ] それでどうしたいんだ?
164 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 09:48:55 ] 背景BMPが黒になるのを防ぎたいです。
165 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 09:53:39 ] >>162 ,164 その疑似コードだけ見ると、hdcBmp3に背景BMPを描画していないように 思えるが。
166 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 09:58:47 ] >>165 BltBlt(hdcBMP3,背景BMP); BltBlt(hdcBMP3,新BMP); これで大丈夫でしょうか?
167 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 10:50:26 ] >>162 CreateCompatibleBitmapにメモリDCを指定しては駄目。 あと >case WM_PAINT: >BitBlt(GetDC(hWnd),hdcBmp3を描画); これは駄目だろ
168 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 10:57:03 ] >>167 CreateCompatibleBitmapには何を指定すればよいのでしょうか?
169 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 12:25:51 ] GetDC()あるいはCreateDC("DISPLAY")の結果あたりを渡すのが吉
170 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 12:30:01 ] 描画用バッファは面倒だから全部DIBSectionでいいよもう
171 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 12:39:18 ] >>162 突込みどころ満載のソースだな まぁ頑張れw
172 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 12:43:18 ] >>162 背景と前景を自前で合成して描画すればおk
173 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 12:50:05 ] GDIはあと何年くらい使われるんだろう
174 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 13:05:19 ] 俺はwin32APIで作れなくなったら、ウィンドウズソフト開発から身を引く。引退。 MFCとかプログラミングじゃねーよ。あれ
175 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 13:44:17 ] >>171 突っ込んで下さい。
176 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 14:33:55 ] なんでやねん
177 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 15:00:09 ] >>174 MFCなんて一皮剥けばバリバリWin32APIじゃないか
178 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 17:22:34 ] >>177 プログラミングスタイルが受け付けない TODO:ここにプログラム書いてね。みたいなのばかり。 しかも、いちいち用意されてる関数調べて、くっつけるだけ。 それで動かしてみて、動いてよかった。で終わり。 こんな状況でバグが出たら、生き地獄だ。
179 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 17:27:43 ] はあ?
180 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 17:33:16 ] 用意されてる関数しらべてくっつけるだけってそれ以外のぷりぐらみんぐおれしらねー
181 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 17:39:51 ] >>178 Win32APIの勉強始めた頃は俺もそう思ってた。 今じゃGUIライブラリ無しで作る気起きませんサーセン
182 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 18:01:25 ] >>172 HDC hdc, hdcBmp[1], hBack[1]; HBITMAP hBmp[1]; BITMAP bm; hdc = GetDC(hWnd); hdcBmp[0] = CreateCompatibleDC(hdc); //背景BMP hdcBmp[1] = CreateCompatibleDC(hdc); //新BMP hBack[0] = CreateCompatibleDC(hdc); //合成BMP hBmp[0] = (HBITMAP)LoadImage(hInst,MAKEINTRESOURCE(IDB_BITMAP1),IMAGE_BITMAP,0,0,LR_DEFAULTCOLOR); hBmp[1] = (HBITMAP)LoadImage(hInst,MAKEINTRESOURCE(IDB_BITMAP2),IMAGE_BITMAP,0,0,LR_DEFAULTCOLOR); SelectObject(hdcBmp[0],hBmp[0]); SelectObject(hdcBmp[1],hBmp[1]); // バックBMP hBack[0] = hdcBmp[0]; BitBlt(hBack[0],0,20,bm.bmWidth,40,hdcBmp[1],0,20,SRCCOPY); ReleaseDC(hWnd,hdc); case WM_=PAINT: BitBlt(hdc,0,100,bm.bmWidth,bm.bmHeight,hBack[0],0,0,SRCCOPY); hdcBmp[0]とhdcBmp[1]に背景と新BMPを読み込み、背景と新BMPを合成したものをhBack[0]に読み込む。 そしてWM_PAINT時に合成した画像を描画する。という事ですか?
183 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 18:15:46 ] 標準関数も用意されてる関数だよなって突っ込みはなし
184 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 19:16:48 ] 5月14日に民主党の円より子参議院議員から、ある嘆願が提出されました。内容は、「美少女 アダルトアニメやゲームを規制すべき」というものです。もしもこれらが規制されてしまうことに なれば、全国のモテない童貞男子諸君にとって大打撃です。 この嘆願が提出された理由ですが、ちょっとひどい。 街中に氾濫(はんらん)している美少女アダルトアニメ雑誌やゲームは、小学生の少女を イメージしているものが多く、このようなゲームに誘われた青少年の多くは知らず知らず のうちに心を破壊され、人間性を失っており、既に幼い少女が連れ去られ殺害される事件 が起きている。これらにより、幼い少女たちを危険に晒(さら)す社会をつくり出していること は明らかで、表現の自由以前の問題である。社会倫理を持ち合わせていない企業利潤追 求のみのために、幼い少女を危険に晒している商品を規制するため、罰則を伴った法律 の制定を急ぐ必要がある。 ついては、美少女アダルトアニメ雑誌及び、美少女アダルトアニメシミュレーションゲーム 製造及び販売規制の罰則を伴った法律を制定されたい。 物凄く分かり易く要約すると、「エロゲーをする奴は心が壊れていて人間じゃないから幼女を 強姦する。だからエロゲーを規制しろ」ということになります。ええと、円議員あなたの血は何色 ですか? だいいち嘆願理由にしても私から言わせて貰えば、「ゲームをしているうちに心が破壊される」 のではなく、「現実世界で心が破壊されたからゲームに逃げた」のです。よくよく考えれば普通の 人は分かるはずです。あれはタダの絵だ、と。 この「美少女アダルトアニメ雑誌及び美少女アダルトアニメシミュレーションゲームの製造・販 売を規制する法律の制定に関する請願」に賛同している議員は、円より子参議院議員のほかに は、同じく民主党の下田敦子参議院議員がいます(5月21日現在)。増えないことを祈るばかりです。 digimaga.net/200805/adult-game-user-is-not-human.html
185 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 20:09:47 ] >>182 まずは分かりやすい変数名を付ける事から学べ
186 名前:デフォルトの名無しさん [2008/05/21(水) 20:19:12 ] >>185 すみませんでした。 背景用変数 = 背景BMP; 貼付けるBMP用変数 = 新BMP; 上部二つの合成用変数 = 合成したBMP(背景BMP+新BMP); BitBlt(上部二つの合成用変数);
187 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 20:46:35 ] >>186 まずは分かりやすい変数名を付ける事から学べ
188 名前:デフォルトの名無しさん [2008/05/21(水) 20:50:50 ] >>187 >>186 では不満ですか?
189 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 20:55:16 ] >>188 お前はプログラマに向いていない 転職をおすすめする
190 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 21:03:26 ] 仕事でやってんならもう少しまともなコメントぐらいつけろよ そのゴミソース引き継いだ奴はめちゃくちゃ苦労するんだよボケがw
191 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 21:05:56 ] >>182 WM_PAINTがきたときに背景BMPと重ねるBMPを 自前で合成して一度のBiBlt呼び出しで描画するという意味。 それぞれのBMPはメモリ上にあるんでしょ? とりあえずこれで動くものを作ってから原因とか考えながらゆっくりAPIの使いかた覚えればいいと思うよ。
192 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 21:36:47 ] つい最近VC++2008ExpressEditionをいじり始めたものです。 テキストエディタまがいのものでもつくってみようと始めたはいいのですが、 GETOPENFILENAME 関数を使ってファイルを開くダイアログを作ろうとしたところ、 "OPENFILENAME構造体が定義されていない" とエラーが出ます。 てっきり windows.h で定義されていると思っていたのですが、 これでないならなんのヘッダをインクルードすればいいのでしょうか?
193 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 21:48:53 ] >>192 Declared in Commdlg.h, include Windows.h てっか、WindowsSDK入れてる?
194 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 22:00:45 ] >>192 WIN32_LEAN_AND_MEAN
195 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 22:02:04 ] >>191 WM_CREATE等最初に合成したものを WM_PAINT時に使うということですか?
196 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 22:14:25 ] >>182 ソースが突込み所満載なんだがまさか釣りじゃないよな? 本気で書いたソースならC言語についてもやばいぞ
197 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 22:20:08 ] >>196 早く突っ込んでくれ
198 名前:192 mailto:sage [2008/05/21(水) 22:22:28 ] >>194 自動で定義されていたそれをコメントアウトしたら解決しました。 ありがとうございます。 >>193 さんもありがとうございました。
199 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 22:27:37 ] >>197 なんでやねん
200 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 22:39:34 ] >>197 じゃあケツ出せよ
201 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 22:41:15 ] >>156 WM_ACTIVATEでフォーカスを失った時にブレークにはかかったのですが、 カスタムドローするのに必要なパラメータがなかったのでできませんでした。 オーナードローで頑張ればできるのでしょうか?
202 名前:デフォルトの名無しさん [2008/05/21(水) 22:52:33 ] 聞きたいのですが、 BITMAPの合成はどうやればよいのですか?
203 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 23:33:54 ] >>195 別にWM_CREATE時じゃなくていいよ。 ちらつきを抑えたいからダブルバッファしたいんだろうからBMPは常にメモリ上にあるという仮定で、 WM_CREATEがきたときに別途mallocでもnewでもいいからバッファを確保して そのバッファに背景BMPと表示したいBMPを合成したものを作成。 それをBitBltやStretchDIBitsのような描画関数で表示。
204 名前:デフォルトの名無しさん [2008/05/22(木) 00:00:22 ] WindowsX.h にある HANDLE_MSG() マクロを WM_COMMAND に対して使うとき、なんで return 0; になるんだ? HANDLE_MSG() に渡すfn は void func(HWND...) でvoid型だし、HANDLE_MSG() 自体も #define HANDLE_MSG(hwnd, message, fn) ¥ case message):return ((fn)(hwnd,...),0L) でマクロ展開で「return 0;」が出てくる理由がよく解らん。 case message: return func(hwnd,...); //func() はvoid型 になるんじゃないの?
205 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 00:10:42 ] カンマ演算子 return a, b; returnされるのはbの値。
206 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 06:15:18 ] メッセージクラッカって定義おかしくね? WM_DRAWITEMとか、 > If an application processes this message, it should return TRUE. って書かれてるのにvoidでreturn 0;されてるし
207 名前:デフォルトの名無しさん [2008/05/22(木) 06:17:56 ] さんくす>>205 カンマ演算子、か。K&Rの演算子の表の一番下に確かにそんなのあるな。いままで意識した事無かった ありがと
208 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 08:01:40 ] >>205 間違っています。 以上。 ↓次の方どうぞ
209 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 08:58:29 ] キモ
210 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 09:05:15 ] キモ
211 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 10:19:57 ] ゲーム作ってるんだけど、メモリ内のデータ書き換え防止する方法とかある? 外部アプリからメモリ内サーチして書き換えるやつ防止したい。助言よろ。
212 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 10:34:36 ] PCの電源切れ
213 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 11:03:18 ] >>211 オンラインゲームじゃないなら、改造対策は不要では? 俺もゲーム作ってるんだが、ブログで改造対策のこと書いたら、 「改造対策する時間があるなら、ゲームのボリュームを増やすこととか、 もっとまともなことに使って欲しい」ってコメントが多かったよ。 改造するかはユーザーの自由なんだし、ユーザーとしては当然のコメントだが。 あと、いまどきの改造は、プロセスメモリエディタ+ルートキットで やるから、改造を防止するなら、ユーザーから非難されることを覚悟のうえで ルートキットじみたことをするしかないでしょうね。
214 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 12:37:49 ] VC++のリソースエディタでダイアログボックスが作れますが、 そのような外観の(ダイアログでない)ウィンドウを、 ウィンドウクラスで作ったウィンドウに、コントロールぺたぺた貼って作ろうと思ったら、 (CWndではなく、RegisterClassEx、CreateWindow使って) ・ウィンドウの背景色は何故かCOLOR_BTNSHADOWが(ダイアログと)等しい ・エディットボックスはCreateWindowExの第1引数にWS_EX_CLIENTEDGEにしないと立体の縁にならない ・フォントはWM_SETFONT使ってサイズを変更しないと文字がでかい ・そもそもデフォルトのフォントが当然MS shell dlgではないようで、よくわからない (ただ、画面のプロパティから、故意にダイアログとウィンドウのフォントを違うものにした覚えはない…) 実際CreateDialogマクロでダイアログが作られるとき、ここら辺の設定ってどうなっているのですか? このマクロもCreateWindowExを使ってウィンドウを作ると書いてあるので、 同じようなことが再現できるのではと思ったのですが… (CreateDialogがウィンドウの大きさを決めるとき、フォントを元に作ってあるのはわかったのですが…)
215 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 13:05:33 ] Process Explorerで表示できるWindow Titleと同じものを取得したいと思っています。 どうもGetWindowTextで取得できるものとは別物らしく、 Process ExplorerでJuneブラウザのWindow Titleを見ると、 GetWindow〜で取得した名前とは違うものを表示しているのがわかります。 一体Process Explorerで表示できるWindow Titleとは何者か、 どうすれば取得できるのでしょうか?
216 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 13:19:39 ] >>215 ttp://msdn.microsoft.com/en-us/library/ms633520.aspx > GetWindowText cannot retrieve the text of a control in another application.
217 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 13:34:18 ] 使えないAPIなんですか。エディットコントロールじゃなければいいはず…ですよね。 そうするとWindow Titleってなんだろうという話になりまして、 たとえばJaneブラウザを表示したとき、以下のようになります。 ・キャプションバー、およびProcessExplorer上WindowTile列の表示 →”Jane Doe Style 【プログラム】 - Win32API質問箱 Build66” ・GetWindowText、およびタスクマネージャ上の表示 →”Jane” ”Jane Doe Style 【プログラム】 - Win32API質問箱 Build66”の文字列を取得したいわけですが、 その方法はご存知でしょうか?
218 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 13:44:31 ] Delphiアプリケーションには実は見えないアプリケーションウィンドウがあって・・・
219 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 14:00:33 ] >>218 VBアプリもそんな感じだったな だからタスクバーに表示しないプロパティなんてのがあるんだけど
220 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 14:07:52 ] spy++ とか眺めてみるといいと思う
221 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 14:14:12 ] あー…なんとなくイメージ掴めてきました メインウィンドウに見えたのは子ウィンドウで、だから取得できなかったと。 子ウィンドウのウィンドウタイトルの取得とか、そのあたりを調べてみます。 ありがとうございます
222 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 14:14:17 ] >>217 こんなんでいいのかな? #include<windows.h> #include<stdio.h> int main(void){ char title_buf[256], *class_name="TMainWnd"; int title_len; HWND hwnd; hwnd=FindWindow(class_name, NULL); if(hwnd==NULL){ printf("Window not found. class name [%s]\n", class_name); return 1; } title_len=GetWindowText(hwnd, title_buf, sizeof(title_buf)-1); if(title_len>=0) printf("%s\n", title_buf); return 0; }
223 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 14:59:33 ] >>222 どうもです 実行結果とSpy++を併せて見て、おおよそ理解できました。 デルファイでもVBでもデフォルトのクラス名でウィンドウを検索したのち、 目的の名前を取得する事ができました ありがとうございます
224 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 15:05:00 ] WM_GETTEXTでいいのでは
225 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 16:22:09 ] > title_len=GetWindowText(hwnd, title_buf, sizeof(title_buf)-1); 今時こんなソース書く奴はJavaか.NETで開発してろよと思う
226 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 16:25:53 ] >>225 この場合同書くのがいいのかも示して欲しいです
227 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 16:28:58 ] >>225 >>226 に同意 どう書けばよいのでしょう? TCHARの話でしょうか?
228 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 16:29:51 ] TCHARじゃないとかARRAYSIZE, _countofを使えとかnullは考慮されてるから-1はいらないとか あたりじゃない?
229 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 16:54:54 ] grep で include 内を探したけど ARRAYSIZE と _countof とは無かった (使用しているのは MinGW)
230 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 16:59:28 ] >>229 ARRAY_SIZE と countof はあったの?
231 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 17:01:22 ] >>230 無いです
232 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 17:12:16 ] _countofはMFCで定義されていてVC2005ぐらいからCRTでも定義されてた気がする SDKにはwinnt.hにRTL_NUMBER_OFがある いずれにしろ>>222 は人に教えられる立場で無いのは確か
233 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 17:20:27 ] 結局は、どう書くのが模範解答になるんでしょう?
234 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 17:24:19 ] WinAPIはよく知らんのだが、GetWindowText()の戻り値ってエラーチェックくらいしか使い途ないのかな。 >222もエラーチェックにしか使ってないようだし、>228によればナルターミネートはしてくれているようだし。 つーか、溢れたかどうかは単純には判らないのね。
235 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 17:27:19 ] >>222 は if(title_len>=0) printf("%s\n", title_buf); を if(title_len>0) printf("%s\n", title_buf); にしないとエラーチェックになってない
236 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 18:18:19 ] >>234 GetWindowTextLengthで事前にバッファ長を調べておけば済むだろ
237 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 18:27:58 ] GetGlyphIndices()という、文字列からグリフインデックスに変換するAPIがありますが、 この逆のことをするAPI、つまりグリフインデックスから文字列に変換する方法って解りますか?
238 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 18:28:29 ] バッファ足りなくてもバッファサイズまでコピーする仕様なの? そうだとしても戻り値にNULL文字は数えないって書いてあるから 指定サイズ==戻り値ならあふれてるのでは。
239 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 18:31:24 ] >>238 馬鹿丸出し
240 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 18:37:47 ] >>236 しかし長さを調べた直後には別のウィンドウタイトルに変わっているかもしれない そのアプリケーションがどう振舞うか想定できない
241 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 18:50:52 ] そんな事を気にするなら他プロセスのテキスト取得なんて考えないことだ (そろそろフックネタ出す奴が現れる頃か)
242 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 18:50:58 ] 仮にバッファ長が100だったとして、GetWindowTextLength()が99を返した後GetWindowText()が99を返しても、 その間にタイトルが書き換わっていたら溢れたかどうかは判らないのね。
243 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 19:10:58 ] >>240 >>242 必要十分なサイズのバッファを渡せば溢れる可能性は無くなる。 LPTSTR buffer = (LPTSTR)malloc(sizeof(TCHAR) * 0x7fffffff); if (buffer == NULL) { MessageBox(NULL, _T("この環境では使用できません"), _T("メモリ買いましょう"), 0); exit(-1); } GetWindowText(hwnd, buffer, 0x7fffffff);
244 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 20:36:32 ] 32bit環境だと/3GBスイッチ使っても厳しそうだ。 VirtualAllocのMEM_RESERVEでアドレスだけ確保して、 SEHで動的にメモリを割り当てるのが現実解だな。
245 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 20:59:09 ] ヒント:APIフック
246 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 21:19:35 ] >>245 ヒント:お前は馬鹿
247 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 21:23:10 ] たまにはブローとかアッパーとかさぁ
248 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 21:34:08 ] まずはジャブから
249 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 21:51:37 ] このスレの質が低下したのは、優秀な人は.NETに移ったからかもな。
250 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 21:58:09 ] 正解
251 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 22:06:48 ] 今頃気付いたのか
252 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 22:25:19 ] Advanced Windowsの著者だって.NETの本を書くこんな世の中じゃ