トップページ⇒tech
1001コメント290KB

Win32API質問箱 Build47

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/11/13(月) 08:56:12
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんやお姉さんたちが答えてくれるかも。

過去スレ、関連リンクは>>2-5くらい。

■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(http://msdn.microsoft.com/library/)の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで
0148デフォルトの名無しさん2006/11/19(日) 07:32:00
ここかどうか分からないですが
ISUファイルの作り方ってどこかに載っていませんか?
0149デフォルトの名無しさん2006/11/19(日) 07:33:15
>ここかどうか分からないですが
質問がここで良いかどうか分からないという意味です。
01501452006/11/19(日) 09:27:15
>>146,147
ありがとう。API調べてみます。
0151デフォルトの名無しさん2006/11/19(日) 09:36:23
>>148
一般的にアンインストール情報ファイルに付加される拡張子、らしいね。
インストーラ作ってるメーカに問い合わせてみれば?
0152デフォルトの名無しさん2006/11/19(日) 10:16:15
インストーラ作ってるメーカーって、ありゃMSインストーラ・・・
0153デフォルトの名無しさん2006/11/19(日) 11:08:39
再起動しないでアンインストールする方法がないかと思いまして。
BATファイルは自分自身を削除できますが、コマンドプロンプトが表示されてしまいます。
0154Kioo2006/11/19(日) 11:22:32
Dialogにあるエディットボックスの内容を入手して、char[]又はstringにいれたいのですが、
どうすればいいのでしょうか
0155デフォルトの名無しさん2006/11/19(日) 11:25:37
>>154
言語は?
0156Kioo2006/11/19(日) 11:34:35
すいません言語書き忘れました。
C++です。
0157デフォルトの名無しさん2006/11/19(日) 11:38:56
そのダイアログってのはどのダイアログなんだ
0158Kioo2006/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のエディットボックスです。
0159デフォルトの名無しさん2006/11/19(日) 11:44:45
>>153
DELETE_ON_CLOSE付きCreateFileで
Tmp辺りにアンインストーラをコピーしてそれを起動する、だったと思う。
「アプリケーションの追加と削除」が微妙な動きをした記憶もあるけど(w

そうそう、削除する時は自分のアプリ関連のファイルのみを対象にする事。
誤って他のアプリやデータが入ったフォルダにインストールしていたら、
目も当てられない状態に。というか昔やっちゃったよ orz
0160デフォルトの名無しさん2006/11/19(日) 11:56:24
>>159
なるほど、目に付かない場所に作って後で消すように設定すれば同じですね。

>>158
MFCのCDialogの派生クラスでなら

CWnd* pWnd = GetDlgItem(IDC_EDIT_ID);
char buff[256];
CString str;

pWnd->GetWindowText(buff, 255);
pWnd->GetWindowText(str);

CStringとcharの配列に文字列が入ります。
ダイアログ表示中以外のタイミングですか?
0161デフォルトの名無しさん2006/11/19(日) 12:02:41
>>158
エディットボックスの内容が書き換えられた時に
GetWindowTextLength(GetDlgItem(IDC_EDIT_ID));で文字列の長さを取得
それに+1したサイズで、new char[]なりGlobalAllocなりでバッファを確保
GetWindowTextで文字列を取得する

stringが使いたかったら、さらにバッファからstringへ代入すればいい
0162デフォルトの名無しさん2006/11/19(日) 12:16:40
エディットボックスの入力できる文字数は最大255バイトとか制限あったっけ?
0163Kioo2006/11/19(日) 12:25:51
>>160
今はまだありませんが、ダイアログの下部にボタンをひとつおき、それが押されたら、文字列を変数に入れてダイアログを閉じるようにする予定です
0164デフォルトの名無しさん2006/11/19(日) 12:36:34
GetDlgItemText()ってのもあるよ
0165デフォルトの名無しさん2006/11/19(日) 13:27:57
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);

半ば定型文
0166デフォルトの名無しさん2006/11/19(日) 13:32:26
あ、stringのとこおかしいや コンパイル通してないから気付かんかったorz
0167デフォルトの名無しさん2006/11/19(日) 13:35:32
コンパイル通さんでも気付くような間違いだがよw
0168デフォルトの名無しさん2006/11/19(日) 14:35:57
>>159
FILE_FLAG_DELETE_ON_CLOSE だったんですね。ちょっと気が付きませんでした。
0169デフォルトの名無しさん2006/11/19(日) 15:49:02
しまった。APIスレなのにMFCで答えてしまった。MFCを使用している場合はこちら。
■MFC相談室 mfc16d.dll■
http://pc8.2ch.net/test/read.cgi/tech/1146117893/
0170デフォルトの名無しさん2006/11/19(日) 17:14:47
PlaySoundで.wavを1回でも再生したプログラムを
終了する時についての質問です。

通常の閉じるをクリックしての終了、
右クリックした時にWM_CLOSEを投げての終了はうまくいくのですが、
ESC(WM_KEYDOWN)が押された時にWM_CLOSEを投げての終了が、
ウィンドウが閉じられるまでに、
CPU率が高くなった状態ですこし止まってしまいます。

原因はどこにあるのでしょうか。

PlaySound(NULL, NULL, 0);はいれています。
また、なぜかMessageBeep(MB_OK);を
抜ける直前に挟むと、ちゃんと終了できます。
01711532006/11/19(日) 17:58:24
>>159 を試してみましたが、作った実行ファイルによるプロセスが先に終了する場合しか
ファイルが削除されません。
何か継承しなければいけないのでしょうか?
0172デフォルトの名無しさん2006/11/19(日) 18:17:21
>>171
FILE_FLAG_DELETE_ON_CLOSE法はうまくいかない。
たぶんみんな試さないで書いてると思う。
漏れが昔ここで聞いた方法
1. rundll32で削除用dllを起動する。
2. 削除用dllからアンインストーラの終了を待って消す。
3. FreeLibraryしてから自分自身を消すコードをヒープにコピーして呼び出す。
 (ヒープにPAGE_EXECUTEをつけるのをお忘れなく)
0173デフォルトの名無しさん2006/11/19(日) 19:23:45
>>172
試さないで書くけど FILE_FLAG_DELETE_ON_CLOSE によるサンプル。
ttp://web.archive.org/web/20051123112406/http://www.numeric.co.jp/Win32.htm
0174デフォルトの名無しさん2006/11/19(日) 19:34:50
> このとき、SYNCHRONIZEでオープンし、分身モジュールにハンドルを継承できる
> ようにする。
これがポイントか?
0175デフォルトの名無しさん2006/11/19(日) 19:38:34
>>174
よくわからんけどそれはハンドルを共用するためだろう。
ハンドルは何で共用する必要があるかというと、
 分身起動→本体終了→分身により本体削除
のシーケンスを同期をとって実行するため。
01761532006/11/19(日) 20:04:41
SYNCHRONIZEフラグはNT系のみ使用できるようです。
0177デフォルトの名無しさん2006/11/19(日) 20:31:15
>>173
試してみたけどやっぱり消えないぞ。
むちゃくちゃコードを補う必要があったからどっかでミスってるのかもしれんが
01781532006/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;
}
こんな感じでしょうか?
0179デフォルトの名無しさん2006/11/19(日) 21:38:30
> LPVOID pMem = (LPVOID)GlobalAlloc(GMEM_FIXED, size);
> pMem = VirtualAlloc(pMem, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
上のGlobalAllocは何のためにあるんだ?
0180デフォルトの名無しさん2006/11/19(日) 21:38:50
ちょwwwVirtualAllocwwwww
01811532006/11/19(日) 21:41:02
PAGE_EXECUTEを受け付ける確保がVirtualAllocだけのようなので。
GlobalAllocは必要ありませんでしたか。
0182デフォルトの名無しさん2006/11/19(日) 21:47:50
API以前にC言語の基本からやり直せ
そのレベルじゃ>>172のコードを書くのは無理
0183デフォルトの名無しさん2006/11/19(日) 21:55:25
CD/DVD焼ソフトみたいにCD/DVD挿入時の自動再生を
一時的に無効にする方法を教えてください。
OS は Windows MeとXPです。
0184デフォルトの名無しさん2006/11/19(日) 22:01:49
RegisterWindowMessage("QueryCancelAutoPlay");
なメッセージを処理して1を返す
0185デフォルトの名無しさん2006/11/19(日) 22:06:24
俺も新人にCやDOSコマンドを教えた事があるが、理解できなかった時は常に教えた側に
問題があったぞ。
>FreeLibraryしてから自分自身を消すコードをヒープにコピーして呼び出す
この手段に対して何も触れてないじゃないか。
0186デフォルトの名無しさん2006/11/19(日) 22:08:26
>>185
そもそもそんなとこから教えなきゃならん事態が既に間違ってるってことはわかってるか?
0187デフォルトの名無しさん2006/11/19(日) 22:09:13
GlobalAllocで割り当てたメモリが入ってるpMemを黙って上書きしてるのも
教えた側の責任か? それ見てこれ以上付き合う気なくしたんだが。
0188デフォルトの名無しさん2006/11/19(日) 22:10:40
ここはあくまで善意の質問箱であり
プログラム教室ではない
0189デフォルトの名無しさん2006/11/19(日) 22:13:33
×俺も新人にCやDOSコマンドを教えた事があるが、理解できなかった時は常に教えた側に
問題があったぞ。
○俺も新人のときCやDOSコマンドを教わった事があるが、この俺様に理解できなかった
のだから常に教えた側の問題に決まってる。

×この手段に対して何も触れてないじゃないか。
○とっとと手段を教えろよ情報を小出しにしやがって使えねーパソヲタども

つーか本当にそこが問題でできないなら聞き返してさえこない時点でオ�hル
0190デフォルトの名無しさん2006/11/19(日) 22:15:29
テンプレすら読めない人がデカい顔してるスレはここですか?
>・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
0191デフォルトの名無しさん2006/11/19(日) 22:20:54
GlobalAllocにGMEM_FIXEDフラグを入れれば直接アドレスが返ってくるのも知らんのか。
格下に聞いちまったようだな。
0192デフォルトの名無しさん2006/11/19(日) 22:23:48
触らない方がいいのかな
0193デフォルトの名無しさん2006/11/19(日) 22:28:02
>知らないから答えられません。
って素直に言えばいいのによ
0194デフォルトの名無しさん2006/11/19(日) 22:29:55
知らないから答えられません
0195デフォルトの名無しさん2006/11/19(日) 22:31:15
知ってても答えません
0196デフォルトの名無しさん2006/11/19(日) 22:34:48
本当は知らないんだけど、知らないっていうの癪だから
知ってるけど、教えてやらない。
0197デフォルトの名無しさん2006/11/19(日) 23:12:47
ヒープてことは動的だけど、
ttp://www.kumei.ne.jp/c_lang/sdk2/sdk_123.htm
(くメィさん使わしてもらいます)
これじゃないの?やるのは。
0198デフォルトの名無しさん2006/11/19(日) 23:12:58
> GlobalAllocにGMEM_FIXEDフラグを入れれば直接アドレスが返ってくるのも知らんのか。
そんなことぐらい誰でも知ってる。
問題はそこじゃねーよアホ。メモリリークという言葉も知らんのか

> 知らないから教えてください
って素直に言えばいいのに
0199デフォルトの名無しさん2006/11/19(日) 23:17:04
>>197
全然関係ない。
つーか>>172でコピー先がヒープであることは本質的じゃない。
別にVirtualAllocでもいいから(むしろMSの推奨はそっちだった気がする)
>>180が何を笑ってるのかよくわからん。
問題は意味もなくGlobalAllocしてメモリリーク起こすようなコードを平然と書く奴に
手取り足取り教えてられるほど暇じゃないってこと。

つーかコードをメモリ上でコピーするやり方はAdvanced Windowsに載ってるんだから
マジで読んでくれ
0200デフォルトの名無しさん2006/11/19(日) 23:31:39
推奨はVirtualってか、Virtualは仮想メモリに直接確保、Globalはプロセスのヒープに確保じゃなかったかいの?
MSがGlobalよりこっち使えって言ってるのは確かHeapAlloc
0201デフォルトの名無しさん2006/11/19(日) 23:49:05
>>198
嘘吐け、俺が教えてやったから言えるんだろうが。
最初は頭下げてただろうが下衆野郎。しらねーくせに威張ってんじゃねえよ。

>>199
最初から本でも書いときゃ良いだろうがよ。暇じゃない割に2chにへばりついてやがんな。
0202デフォルトの名無しさん2006/11/19(日) 23:54:10
>俺が教えてやったから言えるんだろうが
0203デフォルトの名無しさん2006/11/19(日) 23:58:18
ここでおかしな流れをぶった切って・・・


>>153
WSHなら自分自身を削除できるし、コマンドプロンプトも出ない。

var fso = WScript.CreateObject("Scripting.FileSystemObject");
fso.DeleteFile("c:\\test.js");

これでアンインストーラを作ったことはないがなw
0204デフォルトの名無しさん2006/11/20(月) 00:05:47
>>203
簡易的には使えそう。
どうせならバッチファイルで
0205デフォルトの名無しさん2006/11/20(月) 00:18:02
>>203
98以降には一応装備されているから、バージョンが古いけど簡単な操作なら充分かもしれない。
どうしても駄目なら「BATファイルで御免なさい」ですね。
0206デフォルトの名無しさん2006/11/20(月) 00:27:54
>>200
WinXP SP2から、VirtualAllocでPAGE_EXECUTE付けて、
その領域のコードを実行できるようにせんと
アクセス違反になるんじゃなかったけ?
たしか、バッファーオーバーフローで任意コードを実行されるのを防ぐためとかだったはず。
ただのデータ置き場ならGlobalAllocでもいいけど。
0207デフォルトの名無しさん2006/11/20(月) 00:36:24
>>204
や、バッチファイルだとコマンドプロンプトが出てしまうって話でそ?
まあバッチファイルでも、CreateProcess()でDETACHED_PROCESSで起動すれば
コマンドプロンプトは出ないはず。
0208デフォルトの名無しさん2006/11/20(月) 00:43:53
ショートカットを右クリックして「リンク先を探す」を実行すると、
エクスプローラが立ち上がって、当該ファイルが選択されますが、
これと同じことをするにはどうすればいいんでしょうか?

お願いします。
0209デフォルトの名無しさん2006/11/20(月) 00:57:40
>>201
> 最初は頭下げてただろうが
誰に言ってるの? 頭大丈夫?
> 最初から
>>1に書いてるが何か?
0210デフォルトの名無しさん2006/11/20(月) 01:00:07
> しらねーくせに威張ってんじゃねえよ。
鏡に向かって話すのが好きなんですね
0211デフォルトの名無しさん2006/11/20(月) 01:02:28
>>206
GlobalAllocでもHeapAllocでもスタックでもVirtualProtectでPAGE_EXECUTEを
付けてやれば実行できるようになる。
当然同じページにある周囲のメモリも巻き込まれるのであまりよろしくないけど
0212デフォルトの名無しさん2006/11/20(月) 01:05:09
> 教えてやったから言えるんだろうが
いやあ仮にそのとおりだとしても
返すものがハンドルだろうがポインタだろうがメモリリークしてることに変わりないし
そもそもGlobalALlocを呼び出す意味自体一切ないと教えてあげてるのに
理解しないばかりか逆切れしてるどっかのバカには負けますよw
0213デフォルトの名無しさん2006/11/20(月) 01:16:20
(´・ω・`)   n
⌒`γ´⌒`ヽ( E)
( .人 .人 γ ノ
ミ(こノこノ `ー´
)にノこ(
0214デフォルトの名無しさん2006/11/20(月) 02:11:17
intを戻す関数の中で、return 0;を書く位置が早いとちゃんとreturnされるが、
遅い(関数の最後)だと エラーがでる。
少しずつreturn 0をずらして書いてみると、ある位置より早ければちゃんとreturnされる。

コンパイル時はエラー0となってて実行時に メモリがreadになれませんでした。となる。
関数のなかで、他の関数を呼びまくってるから呼び出し元がどこだったかを忘れてるのでしょうか?
どうすればいいのやら??
0215デフォルトの名無しさん2006/11/20(月) 02:15:57
APIと何の関係もないな
0216デフォルトの名無しさん2006/11/20(月) 02:18:11
んな馬鹿な。単に「他の関数」とやらで落ちているのだろ。
その原因は呼び方の間違いだろうがな。
0217デフォルトの名無しさん2006/11/20(月) 02:27:04
>>216も同じ意味かもしれんが、returnで落ちるなら
呼び出し規約とかシグネチャが違うとか?
0218デフォルトの名無しさん2006/11/20(月) 02:34:40
a();

return 0;  ← 正常に戻る

b();

return 0;  ← 落ちる


だと、明らかに b() の中で落ちてるだろ
0219デフォルトの名無しさん2006/11/20(月) 02:37:19
相手してくれてありがとう。

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;
-------------------------------------------------------
わからん。 いままでこんなことなかったのに・・。ねるしかないか・・
0220デフォルトの名無しさん2006/11/20(月) 02:37:20
デバッガ使えば
0221デフォルトの名無しさん2006/11/20(月) 02:39:00
デバッガ使い方わかんないです。 messageboxをはさみまくってたしかめる方法でいままでがんばってきました。
お笑いですね。。
0222デフォルトの名無しさん2006/11/20(月) 02:40:21
> 中略部分がややこしいことしてるのでソースは書けないです。
明らかにそこのせいだろ。>>217も言ってるが呼び出し規約が怪しい
0223デフォルトの名無しさん2006/11/20(月) 02:41:18
悪いことは言わんからデバッガの使い方学習して来い。
もう一度言うけどWin32 APIぜんぜん関係ないので
0224デフォルトの名無しさん2006/11/20(月) 03:11:27
解決しました。構造体のメモリ確保が1個分足りないのが原因でした。
デバッガは学習してきます。圧倒的初心者のお相手ありがとうございました。
すみませんでした。
0225デフォルトの名無しさん2006/11/20(月) 03:16:17
途中の関数でスタック壊してるんじゃ舞か
そしてとんでもないアドレスにリターンしようとしているのでわ
0226デフォルトの名無しさん2006/11/20(月) 03:22:38
>>224
1回使い方分かっちゃえばめっさ楽になるからガンバレ
0227デフォルトの名無しさん2006/11/20(月) 07:29:04
ウィンドウメッセージの数値から、
WM_**の文字列で取得するAPIがありましたら教えてください。
0228デフォルトの名無しさん2006/11/20(月) 08:10:36
取得するもなにも switch( message ) で case WM_***: やってると思うけど
0229デフォルトの名無しさん2006/11/20(月) 08:20:12
>>184
ありがとうできました。
0230デフォルトの名無しさん2006/11/20(月) 09:40:32
>>227
無いよ。自分で変換テーブル作れ。
02312272006/11/20(月) 10:06:05
>>228>>230
分かりました。ありがとうございます。
0232デフォルトの名無しさん2006/11/20(月) 10:10:31
Jeffrey Richter
バッチのサンプル
 ttp://www.microsoft.com/msj/archive/SF9C.aspx
 ここのW32Q0196.zip
FILE_FLAG_DELETE_ON_CLOSEのサンプル
 ttp://www.microsoft.com/msj/0198/win320198.aspx
 なぜかダウンロードできない。XPでは不調でした。
0233デフォルトの名無しさん2006/11/20(月) 11:06:10
以前に、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!
0234デフォルトの名無しさん2006/11/20(月) 11:10:42
試さずに書くが・・・・・
0235デフォルトの名無しさん2006/11/20(月) 11:12:41
(スマン、234はしくじった)

試さずに書くが・・・・・

バッチ(command.com/cmd.exe)をSW_HIDEでCreateProcessしては?
0236デフォルトの名無しさん2006/11/20(月) 13:03:52
>>233
その方法も良いと思います。
>>234-235
少なくとも ShellExecute ではうまくいきました。

皆さんお世話になりました。お騒がせしました。
0237デフォルトの名無しさん2006/11/20(月) 13:11:39
>>232
参考になりました。
0238デフォルトの名無しさん2006/11/20(月) 20:31:37
メインのGetMessageをまわしているループとは別のスレッドから、
SendMessageでWndProcへ構造体をわたそうと思っています。
wParamか、lParamにポインタ入れて。
この構造体を入れる領域をHeapAllocでとって、そこに値を入れてSendMessageで渡した後、
WndProcで処理した後、HeapFreeで開放してやりたいのですが、
開放するタイミングはWndProcしかないのでしょうか。
WndProcへwParamとか、lParamでわたってくるマウスの情報とかは、
WndProcで開放しないのでなんかお作法みたいなのがあるように思えますが、
なにか標準のお作法がありますでしょうか。
お作法、または、ドキュメントへの道しるべ等お教えいただけないですか。
0239デフォルトの名無しさん2006/11/20(月) 20:36:47
もしかして、SendMessageを呼び出した後は、
イベントがWndProcで処理されるまで戻ってこないので、
−メモリ確保
−SendMessage(ここから投げたスレッドはブロック)
−−メインのGetMessageで取得されて、WndProcで処理される
−SendMessageから戻ってくるのでメモリ開放
といった形になるのでしょうか?
とりあえず、AdvancedWindowsの第26章をみてます。
0240デフォルトの名無しさん2006/11/20(月) 20:43:23
SendMessageで送信したメッセージの処理内でしか使わないのなら
SendMessageから帰ってきたところで消せばいい

ちなみにSendMessageはGetMessageで取得じゃなくて、SendMessageが直接プロシージャを呼ぶ
0241デフォルトの名無しさん2006/11/20(月) 20:51:19
>240

>SendMessageで送信したメッセージの処理内でしか使わないのなら
>SendMessageから帰ってきたところで消せばいい
ありがとうございます。
確信がなかったのですが、自信が持てました。

>ちなみにSendMessageはGetMessageで取得じゃなくて、SendMessageが直接プロシージャを呼ぶ
AdvancedWindowsをちゃんとよんでみたら書いてありました。
スレッド間でのSendMessage呼び出しは複雑だと知り、勉強になりました。
ご指摘、ありがとうございました。
0242デフォルトの名無しさん2006/11/21(火) 00:30:29
>メインのGetMessageをまわしているループとは別のスレッドから、SendMessage
する状況なら、
>ちなみにSendMessageはGetMessageで取得じゃなくて、
>SendMessageが直接プロシージャを呼ぶ
は間違いだよ。それは同一スレッドの時限定。
0243デフォルトの名無しさん2006/11/21(火) 01:02:03
でもそんな感じだと思っていて構わないと思う。
Advanced Windows読むまで知らなかった。
0244デフォルトの名無しさん2006/11/21(火) 01:25:56
実は16bitWindowsの頃からGetMessageで取得していた
0245デフォルトの名無しさん2006/11/21(火) 10:07:07
ヘッダ見てるといろんな構造体にbiSizeとかcbSizeとか構造体のサイズを設定するところがありますがこれって何のためですか?
構造体を渡す側はsizeof(構造体)でこのセットするサイズわかるし渡される側も構造体がわかってるからsizeof(構造体)でとれますよね
0246デフォルトの名無しさん2006/11/21(火) 10:23:12
>>245
後で拡張されてサイズが増える場合があるから
0247デフォルトの名無しさんNGNG?2BP(200)
>>245
最後に char hoge[1] みたいな可変長メンバのプレースホルダがあったりして
sizeof では正しいサイズを得られない場合があるから。
■ このスレッドは過去ログ倉庫に格納されています