Win32API質問箱 Build81
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2009/08/02(日) 00:20:49やさしいお兄さんやお姉さんたちが答えてくれるかも。
「知らないならレスしないで下さい。ウザイだけです。 」なんて言わないでねっ!
過去スレ、関連リンクは>>2-10くらい。
■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版( http://msdn.microsoft.com/en-us/library/ )の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで
- Win32API質問箱 wiki
http://wiki.livedoor.jp/program1/d/FrontPage
Win32API質問箱 Build80
http://pc12.2ch.net/test/read.cgi/tech/1244057140/l50
0082デフォルトの名無しさん
2009/08/04(火) 19:21:030083デフォルトの名無しさん
2009/08/04(火) 19:26:17>>76
タブとかツールバーはクライアント領域の載せているものだから、
その上で空き領域を一定サイズ確保したいというなら当然必要。
0084デフォルトの名無しさん
2009/08/04(火) 19:59:08ハズレ
0085デフォルトの名無しさん
2009/08/04(火) 20:04:290086デフォルトの名無しさん
2009/08/04(火) 20:15:480087デフォルトの名無しさん
2009/08/04(火) 21:45:040088デフォルトの名無しさん
2009/08/04(火) 21:50:14ステータスバーの大きさって変えられない?
自分でステータスバーもどきのウィンドウ作った方が速いかな?
0089デフォルトの名無しさん
2009/08/04(火) 21:55:000090デフォルトの名無しさん
2009/08/04(火) 21:58:05SB_SETMINHEIGHTとか
0091デフォルトの名無しさん
2009/08/04(火) 22:40:01side-by-sideアセンブリ
0092デフォルトの名無しさん
2009/08/04(火) 23:21:420093デフォルトの名無しさん
2009/08/05(水) 04:12:25把握している人はエロい
0094デフォルトの名無しさん
2009/08/05(水) 06:51:420095デフォルトの名無しさん
2009/08/05(水) 08:14:32Google先生は把握してますが何か?
0096デフォルトの名無しさん
2009/08/05(水) 15:58:10ウインドウメッセージを解決するProcの中で、SendMessageをすると、即座に処理される理由がいまいちわかりません。
MessageBoxでも似たような疑問を持った際は「勝手にメッセージ解決ループを作って裏でまわしてくれるんだよ」
といった説明を受けて納得したのですが、今回の件も同様なのでしょうか?
0097デフォルトの名無しさん
2009/08/05(水) 16:02:50>この関数は、指定されたウィンドウのウィンドウプロシージャを呼び出し、
>そのウィンドウプロシージャがメッセージを処理し終わった後で、制御を返します。
0098デフォルトの名無しさん
2009/08/05(水) 16:03:19該当するウインドウのメッセージループに通知され、
その後メッセージハンドラがコールバックされて
対応するコード上で処理されてるから、即座じゃなくない?
MessageBoxの方も同様で、メッセージボックスがクリエイトされた後、
OS経由でメッセージがMessageBoxのメッセージハンドラに通知されてるよ。
Spy++みるとメッセージの応酬が見られるし。
0099デフォルトの名無しさん
2009/08/05(水) 16:16:14>>97-98
お返事ありがとうございます。
MSDNの説明を妙に勘違いしていたようです。
::SendMessageはウィンドウプロシージャを直接呼び出すのですね。
実は困っていたのは
case WM_CLOSE:
の中で別のワーカースレッドに停止命令を出し、ワーカースレッドの停止を確認するまでSleepする。
という処理でした。
このとき、ワーカースレッド側でSendMessageされると、フリーズしてしまいます。
これは、メインスレッドがプロシージャで処理中(Sleep中)なのに、他スレッドがプロシージャを呼ぼうとしたので、排他制御された。
ということで合っているでしょうか?
0100デフォルトの名無しさん
2009/08/05(水) 16:36:52そんな感じ。
ttp://msdn.microsoft.com/en-us/library/ms644927.aspx
のMessage Deadlocksに詳しく書いてある。
0101デフォルトの名無しさん
2009/08/05(水) 16:48:44ありがとうございます。
・・・そのページ、日本語版のMSDNでは省かれてますね・・・
0102デフォルトの名無しさん
2009/08/05(水) 16:50:160103デフォルトの名無しさん
2009/08/05(水) 16:51:040104デフォルトの名無しさん
2009/08/05(水) 16:58:57色々アドバイスありがとうございます。
タイトルバーの書き換えが目的のため、ポインタ渡しが必要となり、PostMessageでは行えませんでした。
(SetWindowTextは、内部でSendMesssageを呼んでるっぽいですね)
ついでに、報告。
>>100の文書のおかげで
SendMessageTimeout
なる関数を知りました。
タイムアウト値を10msくらいにしておけば、デッドロックが起こらずに済みますね。
こんな関数知りませんでしたわ
0105デフォルトの名無しさん
2009/08/05(水) 18:17:49winsxsはside by sideで使われてたのか、MSめ・・・
0106デフォルトの名無しさん
2009/08/05(水) 20:27:52UIの更新はUIスレッドにやらせるのが基本。
文字列は別の場所に置いておいて、
PostMessageでタイトルバーの更新を指示、といった感じで。
0107デフォルトの名無しさん
2009/08/06(木) 09:28:29いちいちクリティカルセクション使って、文字列渡し合うのか?
0108デフォルトの名無しさん
2009/08/06(木) 09:42:38結局 SendMessage のブロッキングと同じでデッドロックにならない?
0109デフォルトの名無しさん
2009/08/06(木) 11:28:21windows APIにもCreateFileという関数があって
どちらを使えばいいのかわかりません。
CreateFileのほうが細かく設定できるという認識だけで
よろしいのでしょうか?
0110デフォルトの名無しさん
2009/08/06(木) 11:40:39勉強中の身だからなんとも言えんけど、
プロに任せれば正しい回答が来るはず
0111デフォルトの名無しさん
2009/08/06(木) 11:48:33C言語が仕様を決め、Windowsが従ってる。
そのため(C言語の仕様が古いため)2GBまでのファイルしか扱えない。
CreateFileはWindowsが提供している関数。
Windows以外で使えないけど、代わりに2GBを超えるファイルも扱えるし、Windows特有のファイル属性なども操作できる。
0112デフォルトの名無しさん
2009/08/06(木) 12:33:140113デフォルトの名無しさん
2009/08/06(木) 13:07:04ただし、色々できる=複雑ってことだからそのあたりは臨機応変で。
0114デフォルトの名無しさん
2009/08/06(木) 14:15:59fopenで間に合うときはそっちのがシンプルでいいよ
0115デフォルトの名無しさん
2009/08/06(木) 17:36:58以下コードで 4 GB のファイルが生成できる件について
#include <stdio.h>
#define MEGA_BUF_SIZE (1024 * 1024)
#define OUT_FILE "test.dat"
int main(void)
{
static char buf[MEGA_BUF_SIZE] = { 0 };
int i;
FILE *oFP = fopen(OUT_FILE, "wb");
if(oFP == NULL)
{
perror(OUT_FILE);
return -1;
}
for(i = 0; i < 1024 * 4; i++)
fwrite(buf, 1, sizeof(buf), oFP);
fclose(oFP);
return 0;
}
0116デフォルトの名無しさん
2009/08/06(木) 18:15:32>>111こいつバカじゃねーの?
0117デフォルトの名無しさん
2009/08/06(木) 19:23:4432bit幅しか考慮されていないので、2Gの範囲しかアクセスできないと言う
点について、>>111がちょびっとだけカスってる。
#まあ、そもそも fopen の仕様を決めているのはC言語ではないけどね…。
fopen が CreateFile呼んでるから当然使えるってのは、標準関数の仕様と
比べてどうかと言う方向からみるべきなので、短絡的な意見だとは思うが。
0118デフォルトの名無しさん
2009/08/06(木) 20:16:530119デフォルトの名無しさん
2009/08/06(木) 20:21:260120デフォルトの名無しさん
2009/08/06(木) 20:39:15VC2008だと、0x7FFFFFFFより後への移動はエラーになって返ってくる。
関数内で、SetFilePointerを上位32ビットを指定せずに呼んでいる為に、
オフセット位置の範囲に制限がかけられている所為だな。
0121デフォルトの名無しさん
2009/08/06(木) 20:46:080122デフォルトの名無しさん
2009/08/06(木) 21:25:26そもそもクロスプラットフォーム開発してる訳でもなけりゃわざわざfopenなんて使う理由が無い
0123デフォルトの名無しさん
2009/08/06(木) 21:49:470124デフォルトの名無しさん
2009/08/06(木) 21:54:120125デフォルトの名無しさん
2009/08/06(木) 21:57:04がっ
0126デフォルトの名無しさん
2009/08/06(木) 22:10:060127デフォルトの名無しさん
2009/08/06(木) 22:12:360128デフォルトの名無しさん
2009/08/06(木) 22:16:420129デフォルトの名無しさん
2009/08/06(木) 22:16:440130デフォルトの名無しさん
2009/08/06(木) 23:04:300131デフォルトの名無しさん
2009/08/06(木) 23:11:250132デフォルトの名無しさん
2009/08/06(木) 23:22:580133デフォルトの名無しさん
2009/08/06(木) 23:26:210134デフォルトの名無しさん
2009/08/06(木) 23:39:510135デフォルトの名無しさん
2009/08/07(金) 00:43:08IEのURL打ち込み欄で
\\hostname.com
で、、このあとアカウントとパスワードを入力するダイアログが表示され
進めるとネットワークディレクトリがマウントできますが、
(Vistaの場合、レジストリを変更してセキュリティポリシーの書き換え必要)
この一連の流れをC++/MFCの環境で記述してマウントさせたいのです。
具体的にどういうAPIを使えばよいか、どういうサイトを参照すればよいか
など教えていただけますでしょうか。
よろしくお願いします。
0136デフォルトの名無しさん
2009/08/07(金) 00:53:01http://msdn.microsoft.com/ja-jp/library/default.aspx
0137デフォルトの名無しさん
2009/08/07(金) 03:59:350138デフォルトの名無しさん
2009/08/07(金) 06:05:300139デフォルトの名無しさん
2009/08/07(金) 11:42:31なんか微妙に誤解があるような気が……
ウィンドウプロシージャをメッセージ経由で実行する場合は、
必ずウィンドウを作成したスレッドで実行されるのがwindowsの仕様です。
その場合は、このスレッドがSleepさせられているため、SendMessageで
デッドロックするわけです。
0140デフォルトの名無しさん
2009/08/07(金) 12:17:190141デフォルトの名無しさん
2009/08/07(金) 14:29:26別スレッドにSendMessageして、send先から返ってくるのを待ってる間は
別スレッドからのSendMessageを受け付ける事ができる。
0142デフォルトの名無しさん
2009/08/07(金) 14:58:05だが、sendされた側がメッセージループでキューを喰い実行してくれないと
呼び出し側はブロックされっぱなしで SendMessage から戻ってこれない
0143デフォルトの名無しさん
2009/08/07(金) 15:14:37SendMessageから戻って来ない間も、別スレッドからのSendMessageには
即呼び出される。殆ど相手のコンテキストで動いてる感じ。
SendMessageなら戻ってくるまでは他のメッセージが来ないので安心、
と言うことではない。
0144デフォルトの名無しさん
2009/08/07(金) 15:19:140145デフォルトの名無しさん
2009/08/07(金) 15:45:300146デフォルトの名無しさん
2009/08/07(金) 16:08:31アプリケーション側の値を設定しているコードがあったんですけど、これって有効なんでしょうか。
ずっとコントロール側が使ってるものと思い込んでいたのですが。。。
0147デフォルトの名無しさん
2009/08/07(金) 16:58:33http://msdn.microsoft.com/ja-jp/library/cc411204.aspx
0148デフォルトの名無しさん
2009/08/07(金) 17:05:070149デフォルトの名無しさん
2009/08/07(金) 17:08:040150デフォルトの名無しさん
2009/08/07(金) 17:09:510151デフォルトの名無しさん
2009/08/07(金) 17:20:310152146
2009/08/07(金) 17:58:31GWLP_USERDATAとは全く別の領域に確保されてるんでしょうか。
コモンコントロールをspy++で見ると、ウィンドウバイトが割り当てられていて
それがコントロールが使っているものなのか、アプリケーションに任せているのか僕では判断できません。
コモンコントロールのクラスが定義済みなので、MSの配慮としてアプリケーション用に確保されているのかと
考えてしまいますが、明記されてる記事を見つけることができませんでした。
0153デフォルトの名無しさん
2009/08/07(金) 18:04:44>ウィンドウに関連付けられた値を設定します。
>この 32 ビット値は、<<<<ウィンドウを作成したアプリケーションで使用する目的で>>>>各ウィンドウが持っているものです。
>この値の初期値は 0 です。
この程度の日本語の解釈もできないの?
あんた小学生?
馬鹿なの?
死ねよ
0154デフォルトの名無しさん
2009/08/07(金) 18:06:030155146
2009/08/07(金) 18:08:25そのアプリケーション用というのが、本当に自作アプリケーションのためなのか、
コモンコントロールの拡張用なのかよくわかりません。
言葉どおり受け取るならそういうことなんですが。。。
0156デフォルトの名無しさん
2009/08/07(金) 18:11:57でもサードパーティ製のコントロール等はGWLP_USERDATAを使ってる物もある。
Spy++で見れば分かる。
いずれにしろ自作コントロール以外ではプロパティリストを使う方が安全。
0157デフォルトの名無しさん
2009/08/07(金) 18:19:05GWLP_USERDATAの使い道なんてほとんど無いけどな
0158デフォルトの名無しさん
2009/08/07(金) 18:38:07その関数内でオート変数を使ってるんですが
メモリリークとか大丈夫なんですかね?
0159デフォルトの名無しさん
2009/08/07(金) 18:42:100160デフォルトの名無しさん
2009/08/07(金) 18:47:190161デフォルトの名無しさん
2009/08/07(金) 19:29:530162デフォルトの名無しさん
2009/08/07(金) 19:32:20http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=71deb800-c591-4f97-a900-bea146e4fae1
0163デフォルトの名無しさん
2009/08/07(金) 19:34:420164デフォルトの名無しさん
2009/08/07(金) 19:56:01これでいい?
0165デフォルトの名無しさん
2009/08/07(金) 19:58:14RTM じゃリアルタイムマネーだろ!
0166デフォルトの名無しさん
2009/08/07(金) 20:00:090167デフォルトの名無しさん
2009/08/07(金) 20:11:400168デフォルトの名無しさん
2009/08/07(金) 22:31:420169デフォルトの名無しさん
2009/08/07(金) 22:37:460170デフォルトの名無しさん
2009/08/07(金) 22:58:48PEフォーマットの仕様ははっきりしてるし、
依存DLL名だけ調べるくらいならそんなに難しくないよ。
PEフォーマットについてかなりわかりやすく解説したページが以前はあったんだけど、
今は消滅しちゃってるな。 まぁ、マイクロソフトのページに行けばキッチリした仕様書が入手できる。
0171デフォルトの名無しさん
2009/08/07(金) 23:25:37それもimagehlp.dllのAPIを使えば簡単だし
0172デフォルトの名無しさん
2009/08/07(金) 23:34:12それって、Xp以降専用になるんじゃ……
まあ、それも時代か。
0173デフォルトの名無しさん
2009/08/07(金) 23:36:350174デフォルトの名無しさん
2009/08/08(土) 00:06:36ImageDirectoryEntryToDataEx使ってそれっぽいのとれたんですけど、RVAからVAの変換でミスg・・・
よくわかんねー
0175デフォルトの名無しさん
2009/08/08(土) 00:52:59MSDNにはXP以降と書かれてるけど実際には2000でも使える。
0176デフォルトの名無しさん
2009/08/08(土) 08:04:08今までと違って、x64環境にはx64用のイメージが必要なのに気付かなかったぜ。
0177デフォルトの名無しさん
2009/08/08(土) 09:41:58試してないけど、ファイルはあるみたい。
http://download.microsoft.com/download/2/E/9/2E911956-F90F-4BFB-8231-E292A7B6F287/GRMSDKX_EN_DVD.iso
0178135
2009/08/08(土) 16:14:41その方法で試みていますが、うまくいきません。
具体的には、
LPNETRESOURCE netResource = new NETRESOURCE();
netResource->dwScope = 0;
netResource->dwType = RESOURCETYPE_DISK;
netResource->dwDisplayType = 0;
netResource->dwUsage = 0;
netResource->lpLocalName = ""; // ネットワークドライブにする場合は"z:"などドライブレター設定
netResource->lpRemoteName = "\\\\hostname.com";
netResource->lpProvider = "";
DWORD err = WNetAddConnection2(netResource, "password", "account", CONNECT_UPDATE_PROFILE);
で、戻り値のerrは0になったのですが、マウントがされません。
netResource->lpLocalName = "Z:";
のようにしても、Zドライブに割り当てられません。
何が原因でマウントされないのでしょうか?
マウントされたボリュームが表示されるようにしたいのですが、
どうすればよいか教えてください。
よろしくお願いします。
0179デフォルトの名無しさん
2009/08/08(土) 17:59:47サンクス。ハッシュも一致していたし、それでOKみたいだ。
0180デフォルトの名無しさん
2009/08/08(土) 18:00:32多分\\\\hostname.com\\folderのようにするはず
で、folderは共有されていなければならなかったはず
0181デフォルトの名無しさん
2009/08/08(土) 22:49:320182デフォルトの名無しさん
2009/08/08(土) 23:01:41.NETとかイラネーし別ファイルにしてくれよ・・・
■ このスレッドは過去ログ倉庫に格納されています