[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 06/08 10:58 / Filesize : 131 KB / Number-of Response : 644
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Win32API質問箱 Build65



1 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 15:51:24 ]
スレ立てるまでもない、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質問箱 Build64
pc11.2ch.net/test/read.cgi/tech/1207099291/

152 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 19:05:57 ]
>>148
知らないならレスしないでください

153 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 19:55:30 ]
CreateProcess(NULL, "sample.exe", NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
hWnd = FindWindow("sample", NULL);

SendMessage(hWnd, WM_CLOSE, 0, 0);

この順番に処理させたいんだけどうまくいかない
hWndが0になってしまう

どうすればCreateProcess→SendMessageが上手くいくようになる?

*sample.exeはコンソールアプリ

154 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 19:59:44 ]
>>153
本当にコンソールのタイトルに"sample"なんて表示されてるか?
"c:\windows\cmd.exe"とか出てるはずだが

155 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 20:01:56 ]
言い方がマズイかな
コンソールのタイトルは

"カレントディレクトリパス+sample.exe"

になるはず

156 名前:153 mailto:sage [2008/04/24(木) 20:07:21 ]
>>154,>>155
FindWindowの第1引数をsample.exeのフルpathにしてもだめ(hWnd=0)でした

157 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 20:11:24 ]
パスって言うかコンソールのタイトルとFindWindowの引数が正確に一致してるのかって話なんだが
大文字小文字の差も含めて

少なくともSpyはタイトル拾えてるから引っかからないって事は無い筈

158 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 20:15:37 ]
ttp://www.uploda.org/uporg1385245.png

ほれ

159 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 20:17:08 ]
>>156
まずはSpy++とかで確認しる。

ちなみに、CreateProcessしてすぐにFindWindowしてる、なんていうオチじゃないだろうな?

160 名前:153 mailto:sage [2008/04/24(木) 20:24:56 ]
CreateProcessの次にFindWindowしてます・・・



161 名前:153 mailto:sage [2008/04/24(木) 20:28:12 ]
検索してたら見つけたんだけど、この使い方解説お願いできます?

URL:homepage2.nifty.com/DSS/VCPP/API/ProcessEnd.htm
BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lParam)
{
DWORD dwThreadId, dwProcessId;

dwThreadId = GetWindowThreadProcessId(hwnd, &dwProcessId);
if (dwProcessId == (DWORD)lParam) {
PostMessage(hwnd, WM_CLOSE, 0, 0);
}

return TRUE;
}


// pi は CreateProcess() したときの PROCESS_INFORMATION
EnumWindows(EnumProc, (LPARAM)pi.dwProcessId);

****ここまで引用



162 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 20:33:30 ]
CreateProcessの直後にFindWindowしたら駄目にきまってるだろう。
プロセスが起動した瞬間にウインドウができるわけじゃない。

163 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 20:36:07 ]
>>161
CreateProcessで作成したプロセスが所有するウィンドウにWM_CLOSEをポストしてる
当然CreateWindowで作ったウィンドウを持ってないプログラムにゃ無効

164 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 20:38:47 ]
つかコンソールにWM_CLOSE送るなら
terminateprocessでも使っとけば良いんじゃねえのか

165 名前:153 mailto:sage [2008/04/24(木) 20:50:22 ]
ありがとうございます

>>164
上のURL先に
>緊急遮断に使用するものであり,終了するが正常な終了方法ではない
とありますが大丈夫ですか?

正常終了するにはどうすればいいですか?

166 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 20:53:29 ]
コンソールにWM_CLOSE送ったってムリヤリ終了してるから気にするな

コンソールプログラムならプログラムが自発的に終了しない限り正常終了しない

167 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 20:55:24 ]
>>165
外部から無理に止めるのが正常な方法であるわけがない。
メッセージを投げてターゲットプロセスが自分で終了するようにするのがまっとうな方法。

168 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 20:55:48 ]
WM_CLOSEをポストする。
キャンセルできるから確実性はないけどな。

169 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 20:57:33 ]
そういう場合はパイプで繋げてシグナルを送信するんだよ

170 名前:153 mailto:sage [2008/04/24(木) 20:59:45 ]
ありがとうございます
望みどおりの動作してくれました





171 名前:153 mailto:sage [2008/04/24(木) 21:04:09 ]
>>167
自力終了 == 正常終了
なんですね覚えておきます

>>169
パイプ・シグナルの事も頭に入れておきます

172 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 21:24:57 ]
Googleの弊害だよな。
適当に検索して、それっぽいコードを継ぎ接ぎする、本質を理解しようとしない人間が量産されるのは。

173 名前:167 mailto:sage [2008/04/24(木) 21:25:00 ]
>>171
外部から何かを受け取ることでエラー終了するように作られたものもありうる。
少なくともあるプロセスがどういう状況にあるのかを無視して終わらせるのが正常とは言えない、
ということだ。拡大解釈やめれ。

174 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 21:29:47 ]
そもそも、CreateProcessして即座に終了させるって、無意味だろ。

なぜ外部から終了させる必要があるのか、まずは、そこから話してみ。

175 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 21:52:39 ]
試してるだけじゃないのか

176 名前:153 mailto:sage [2008/04/24(木) 21:58:44 ]
>>173
わかりました

>>174
CreateProcessしたプログラムで処理してる時に
別のプログラムの処理も必要になった時のために
メインのプログラムから起動するようにしました

どうせやるなら終了もメインのプログラムからした方が
使いやすい(手間がかからない)と思ったからです

177 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 22:08:04 ]
>>153
FindWindowの第一引数はクラス名だぼけ

178 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 22:10:04 ]
HWND FindWindow(
  LPCTSTR lpClassName, // クラス名
  LPCTSTR lpWindowName // ウィンドウ名
);

ここまで誰も気付かなかったな
すげぇw

179 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 22:12:44 ]
LPCTSTR型のクラス?

180 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 22:13:19 ]
ごめん
なんでもない



181 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 22:13:54 ]
ウィンドウクラスというのはだな・・・(ry

182 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 22:14:10 ]
>>176
> どうせやるなら終了もメインのプログラムからした方が
> 使いやすい(手間がかからない)と思ったからです

なるほど。

その子プロセスは、どういったものなの?

また、

その子プロセスの正規の終了条件もしくは終了手順は、
どういったものなの?

183 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 22:18:49 ]
なんという盲点

184 名前:153 mailto:sage [2008/04/24(木) 22:22:46 ]
>>182
1、ある時刻になったらBEEP鳴らして終了
2、文字列をある規則で別の文字列へ変換して待機(別ファイルを読み込む可能性があるため)
3、文字列から特定の文字を削除(同上)
etc
2と3はexit入力で終了です

185 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 22:49:39 ]
>>184
えーと、対話的に入力を受付けてるわけね。
で、exitとタイプしてリターンキーを押すと終了、と。

ならば、
WaitForInputIdle()
で入力待ち状態になるまで待ち、
コンソールに"exit\n"を送るのが、
正規の終了手段だと思う。

186 名前:153 mailto:sage [2008/04/24(木) 23:18:25 ]
>>185
sampleがSleep中でもWaitForInputIdle()の次の行へ進んでしまいました

>プロセスがコンソールアプリケーションである場合〜中略〜WaitForInputIdle 関数は即座に制御を返します。
とmsdnに書いてありました

187 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 23:25:47 ]
あーごめん、じゃぁ、ちょっと面倒だな。

そのsampleも自分で作っていて変更可能なら、
入力待ちするところで、イベントオブジェクトの状態をチェックして、シグナル状態なら終了するようにして、
親プロセスが子プロセスに終了してほしいときに、イベントをシグナル状態にしたらどうよ。

188 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 00:08:10 ]
WaitForInputIdleって対象プロセスが最初にGetMessageを呼ぶまで待機するとかそんな感じだったような

>>186
STARTUPINFO::hStdInput/hStdOutputあたりにMailslotのハンドルを渡せばできた気がする

189 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 09:48:31 ]
質問です


190 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 09:49:53 ]
なんすかwwwwwwwwww



191 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 11:39:07 ]
FileMonで"FASTIO_QUERY_OPEN"ってなるやつって、具体的にはどうやってファイルオープンしてるんでしょうか
NtCreateProcess()とNtOpenProcess()とNtCreateSection()の3つに
フックをかけて監視してるんだけどどれにも引っかからない

192 名前:デフォルトの名無しさん [2008/04/25(金) 12:06:41 ]
またネイティブAPIか

193 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 12:31:15 ]
xmlとかYAMLとかをhttpで送受信するのに便利な通信モジュールないかな。
WININETとMFCは試したけど、通信の待ち時間とかを有効に使おうとするととても書きづらい。

194 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 13:05:12 ]
本当に必要なのは通信の待ち時間とかを有効に使うための知識か

195 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 14:00:56 ]
通信の待ち時間を使って本を読んでます!

196 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 14:52:13 ]
ワロタ

COMでもいいのかな

197 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 14:57:53 ]
>>172
検索して見つかったコードを自分なりに書き換えるのもまたイイ

198 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 15:43:03 ]
boost::asio

199 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 20:14:40 ]
マルチスレッド化して、その内のあるスレッドで同期系のものによって通信するのも1つの手ではある。

200 名前:デフォルトの名無しさん [2008/04/25(金) 21:05:53 ]
TCP通信ってさ、勝手に同期とって転送してくれるんじゃないの?
俺、TCPで同期とか考えたことないんだけど。。考えが間違ってたらご指摘plz



201 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 21:16:26 ]
じっと待ってられないせっかちさんと、途中でキャンセルしたくなる優柔不断さんのため

202 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 21:26:36 ]
WinInetには非同期モードあるぞ、一応。

203 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 21:33:35 ]
DLLでエクスポートされたデータ変数について、
ちょっとお聞きしたいことがあります。

例えば、変数をエクスポートする際
 __declspec(dllexport) int *dll_val;
と宣言すれば、メイン側からこの変数は
 __declspec(dllimport) int **_imp__dll_val = &dll_val;
と同じように扱われると、最近msdnで知りました。
なので、メイン側からのこの変数への参照が、アセンブラレベルでは
 DWORD PTR [_imp__dll_val]
のようになると予想していました。

VC2005のデバッグモードでは、確かにそうなっていました。
しかし、リリースモードでは、なぜかそうなっていませんでした。
これに対応する個所が
 offset _imp__dll_val
のように書き換えられていたのです。

これを行うためには、_imp__dll_valのアドレスが事前に決まってなければならないと思うのですが、
ベースアドレスが固定のwindows dllで、このようなことは可能なのでしょうか?

204 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 21:51:41 ]
リロケート情報あるんじゃないのかな

205 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 22:01:45 ]
ベースアドレス固定ってntdllとkernel32ぐらいじゃね?(Vistaは知らん)

206 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 22:46:14 ]
>>191
おそらくは各ドライバ(ntfs.sysとかかな)のFastI/Oディスパッチルーチンの呼び出し

_FAST_IO_DISPATCH構造体でぐぐれば情報はでる あくまで推測だけど


207 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 23:10:38 ]
>>204
dllでリロケートする場合って、必要な全アドレスを書き換えますよね。
この場合、間接ポインタではなく'offset _imp__dll_val'で変数を使うことは可能なのでしょうか?

>>205
すいません。ベースアドレス固定ではなく、
「dllごとにベースアドレス固定」が正しい表現でした。

208 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 23:26:48 ]
ねぇ、もうWinFXみたいなのって作らないの?

209 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 23:29:19 ]
WinFXって.NET3.0だろ

210 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 23:34:25 ]
既に完成したものをまた作ってどうすんだろうね



211 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 00:06:16 ]
>>200
それ同期違う。
ここでの同期は、転送が完了してから制御を返すこと。
逆に、転送が完了するのを確認せずに制御を返す関数が非同期。

212 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 01:12:23 ]
入力されたパスのフォルダに入っているファイルを
リストコントロールに表示させているのですが、
この時のパスを格納するための配列は256バイトあれば大丈夫ですか?

213 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 01:13:54 ]
せめてMAX_PATH。

214 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 01:16:08 ]
成る程260バイトですか、ありがとうございます。

215 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 01:23:25 ]
>>214
そのレスだと平気で
p = (LPTSTR)malloc(260);
とか書きそうな雰囲気だな

まあ俺には関係ないからどうでもいいが

216 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 07:40:27 ]
>>215
そのように書く事によって何か問題が起こるとは予想がつかないのですが、
相応しくない書き方、という事ですね、
すみませんが、理由を知りたいです。

217 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 07:58:57 ]
261あったらどうするの?

218 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 08:30:11 ]
必要なだけ確保する
それが動的メモリ
逆に無駄な分は確保しない

219 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 08:35:13 ]
ちょっとまて、お前ら答えを教えてやれよw
まあ、自分で探すのも大切ではあるが。

220 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 09:13:07 ]
知らないならレスしないでください



221 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 09:52:51 ]
>>216
ヒント

#ifdef _UNICODE
 typedef wchat_t * LPTSTR;
#else
 typedef char * LPTSTR;
#endif

222 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 10:14:36 ]
>>212
んな事ぁ手前で好きに決めるもんだ。

223 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 10:35:43 ]
MAX_PATH * sizeof(TCHAR)

224 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 11:10:27 ]
知ってるならレスしないでください

225 名前:デフォルトの名無しさん [2008/04/26(土) 11:15:52 ]
↑話を理解してない馬鹿

226 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 11:17:17 ]
↑自演馬鹿

227 名前:デフォルトの名無しさん [2008/04/26(土) 11:20:41 ]
↑正解

228 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 11:39:27 ]
      _、_
    ヽ( ,_ノ`)ノ チッ、乗り遅れたか・・・
   へノ   /
┌→  ω  へ





229 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 12:15:23 ]
まだ誰も言っていないが、260じゃなくてMAX_PATHって定数使えよ。

230 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 12:24:36 ]
>>229
>>223



231 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 12:36:15 ]
MAX_PATHはかなり前に出てる
質問者が勝手に260に変換しただけ

232 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 13:06:42 ]
この中に、「MAX_PATH を超えるパス名など存在しない」と思ってる人が!

233 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 13:11:35 ]
そんなのexplorerだっていい加減だから気にしなくていい

234 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 13:15:23 ]
www.google.co.jp/search?q=%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D+%E6%9C%80%E5%A4%A7

嘘書いてるのも多いしなあ(FAT32の話をしてるのかも知れんが)


235 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 13:20:11 ]
↑話を理解してない馬鹿

236 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 14:26:07 ]
double型の数値を表示するのに、

double dbl=1.23;
char res[32];
wsprintf(res,"%f",dbl)
SetWindowText(hWnd, res);

とするとfと表示されるだけです。
どこがおかしいでしょうか?

237 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 14:47:49 ]
>>236
L"%f"

238 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 14:49:19 ]
wsprintfは実数使えないよ

239 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 15:05:48 ]
せめてMSDNでAPIの説明を読んでから質問しろよ

240 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 15:06:22 ]
StringCchPrintf



241 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 19:45:36 ]
>>237-240
超亀ですが、ありがとうございました。
もっとちゃんと勉強しなおします。。

242 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 23:13:13 ]
>>191
ttp://web.archive.org/web/20030625222552/www.osr.com/ntinsider/1996/fastio.htm


243 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 02:14:39 ]
wsprintf の 'w' って "Windows" のことだよね?
lstrcpy の 'l' はさっぱり分からん

244 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 02:19:29 ]
同じように95時代のソースみてると _lopen とかつかってて _l ってなによって思う


245 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 02:38:55 ]
LPSTRと同じようにlong pointerじゃないの?

246 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 02:39:42 ]
指定の他のソフトにきているメッセージを調べる方法ってありませんか?

247 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 02:48:22 ]
グローバルフック

248 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 02:58:24 ]
lsprintfでも良かったのにwsprintfなのが謎
kernel32.dllじゃなくてuser32.dllにあるのも謎
しかもWin9x系だと実体はkernel32.dll内にあってuser32!w(v)sprintfは実体にjmpしてるだけだし

249 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 03:00:35 ]
swprintf と wsprintf があるからややこしいんだよな。
しかもそれでいて wsprintf は %f がないという大きな仕様の差があるし。

250 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 03:07:23 ]
CRT: sprintf, swprintf
Win32: wsprintf

CRT: vsprintf, vswprintf
Win32: wvsprintf

CRT: _snprintf, _snwprintf
Win32: wnsprintf

CRT: _vsnprintf, _vsnwprintf
Win32: wvnsprintf

>>249
それだけじゃないぞ。
wsnprintf じゃなくて wnsprintf とか、もうアホかと。



251 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 04:42:39 ]
>>250
こういうの、1〜2回/年くらいしか趣味でWinアプリをつくらない
ハード屋のおいらにはつらい

252 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 05:07:35 ]
シーケンシャルで読み捨てるんだったら
メモリマップトファイル使っても効率落ちるだけですかね?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<131KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef