Win32API質問箱 Build47
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/11/13(月) 08:56:12やさしいお兄さんやお姉さんたちが答えてくれるかも。
過去スレ、関連リンクは>>2-5くらい。
■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(http://msdn.microsoft.com/library/)の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで
0102デフォルトの名無しさん
2006/11/16(木) 20:40:230103デフォルトの名無しさん
2006/11/16(木) 20:52:20C/C++の基本を勉強する方が先みたいだな
0104デフォルトの名無しさん
2006/11/16(木) 20:54:590105デフォルトの名無しさん
2006/11/16(木) 21:31:530106デフォルトの名無しさん
2006/11/16(木) 21:44:090107デフォルトの名無しさん
2006/11/16(木) 23:47:050108デフォルトの名無しさん
2006/11/16(木) 23:58:320109デフォルトの名無しさん
2006/11/17(金) 00:01:040110デフォルトの名無しさん
2006/11/17(金) 00:04:010111デフォルトの名無しさん
2006/11/17(金) 00:05:380112デフォルトの名無しさん
2006/11/17(金) 00:17:45勉強しなかった場合と比較できないので科学的実験結果としては有意でないと考えられる。
0113デフォルトの名無しさん
2006/11/17(金) 12:57:59存在するかを調べる関数がありましたら教えてください。
CreateFileとかで失敗したらとかでもできると思いますが、
正規のがありましたら教えてください。
0114デフォルトの名無しさん
2006/11/17(金) 13:25:32FindFirstFile
好きな方でどうぞ
0115デフォルトの名無しさん
2006/11/17(金) 15:00:480117デフォルトの名無しさん
2006/11/17(金) 16:39:280118デフォルトの名無しさん
2006/11/17(金) 16:42:270119デフォルトの名無しさん
2006/11/17(金) 16:48:43本当にありがとうございました。
0120デフォルトの名無しさん
2006/11/17(金) 18:50:32PathFileExists というズバリな関数がある
0121デフォルトの名無しさん
2006/11/17(金) 19:21:57知らなんだー
GetFileAttributes使ってた。
0122デフォルトの名無しさん
2006/11/17(金) 23:41:070123デフォルトの名無しさん
2006/11/17(金) 23:45:500124デフォルトの名無しさん
2006/11/18(土) 00:33:170125デフォルトの名無しさん
2006/11/18(土) 01:36:31wsnprintfとかワイルドカードでのマッチングもたしかあの中だったよね?
0126デフォルトの名無しさん
2006/11/18(土) 01:40:28やったことないけどさ
なぜかPath〜系は未だにMSDNが日本語じゃないんだよな
8月版になったからといって更新されるわけもなし
0127デフォルトの名無しさん
2006/11/18(土) 01:49:24ググったのですがいまい解決できそうなページがありませんでした。
作っているのはアナログ時計です。
開発環境はVC++6.0 Proです。SDKで作っています。
丸いリージョンで表示した時計のウィンドウがあります。
ウィンドウのクライアント領域はマウスでドラッグして移動できるように
細工をしております。
アナログ時計のウィンドウをデスクトップ領域の上端より超えて移動すると
ウィンドウのキャプションが隠れるあたりでマウスのボタンを離すと
自動的にキャップションが少しだけ見える位置に移動してしまいます。
ウィンドウのクライアント領域でのマウスの移動が出来るのでできれば
デスクトップの上端から上へキャプションが隠れてもそのままウィンドウが
移動できるようにはできないでしょうか。
よろしくお願いします。
0128デフォルトの名無しさん
2006/11/18(土) 02:29:18よく分からんけど足りなさそうな情報を質問。
細工ってヒットテストにキャプションって返すやつ?
0129127
2006/11/18(土) 02:46:30それによりウィンドウのクライアント領域をドラッグしてウィンドウを移動できます。
例えると以上の設定をして、普通のウィンドウのクライアント領域をドラッグして、
ウィンドウのキャプションをデスクトップの上端より隠れるように
ウィンドウを移動させると自動的にウィンドウがキャプションを少しだけ表示した状態に
なってしまうのです。それを移動してキャプションが隠れるようにしたいのです。
0130デフォルトの名無しさん
2006/11/18(土) 07:25:34チェックボックスを置いています。
表示すると、グループボックスのほうが上に来てしまうんですが、
どうすればチェックボックスを上に持ってこれますか?
たぶんZオーダーの問題だと思うんですが、以下のようにしても
うまくいきませんでした。
SetWindowPos(groupbox, checkbox, 0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
0131デフォルトの名無しさん
2006/11/18(土) 08:01:480132130
2006/11/18(土) 10:06:290133デフォルトの名無しさん
2006/11/18(土) 13:39:41『CreateSolidBrushで得たHBRUSH型変数は、不要になればDeleteObjectで破棄してください』
と書いてあるんですが、その本のサンプルプログラムでは破棄していないみたいなんです。
プログラムが終了すれば自動的に破棄されると考えれば、そのサンプルプログラムが破棄しないのも納得がいくのですが、
自動で破棄されるんでしょうか。
0134デフォルトの名無しさん
2006/11/18(土) 13:46:46他プロセスと共有している場合は参照カウンタが1減り、0になったらOSにより解放される
現存するメジャーなOSのほとんどはこうなってるよ
0135デフォルトの名無しさん
2006/11/18(土) 14:11:19プロセスが走ってる間にいくつも作っては捨てをする場合は要らなくなったらDeleteObjectした方がいいね
1個2個作ってそのままくらいなら、プロセス終了時のリソース解放に任せてもいい
0136デフォルトの名無しさん
2006/11/18(土) 14:49:31ありがとうございました
0137デフォルトの名無しさん
2006/11/18(土) 14:53:20CreateFontIndirectの逆のことしたいんですけれども
0138デフォルトの名無しさん
2006/11/18(土) 15:01:090139デフォルトの名無しさん
2006/11/18(土) 15:04:48ありがとう
0140デフォルトの名無しさん
2006/11/18(土) 15:25:04いちおう念を押しておくとWM_PAINTは再描画のたびに呼ばれるからな
0141デフォルトの名無しさん
2006/11/18(土) 23:10:31したいのですが、どうしたら良いのでしょうか・・・
ツールウィンドウ を使うしか無いのでしょうか><
教えて下さいエロい人
不可視のオーナーウィンドウ
0143デフォルトの名無しさん
2006/11/18(土) 23:24:280144デフォルトの名無しさん
2006/11/18(土) 23:27:26解決出来ました。
0145デフォルトの名無しさん
2006/11/19(日) 02:24:000146デフォルトの名無しさん
2006/11/19(日) 02:44:04(同じボリュームでなければ当然同一パスでもない)
GetFileInformationByHandleでファイルIDを比較する。
0147デフォルトの名無しさん
2006/11/19(日) 06:06:44PathSearchAndQualifyとかPathCanonicalizeが使えないかな?
0148デフォルトの名無しさん
2006/11/19(日) 07:32:00ISUファイルの作り方ってどこかに載っていませんか?
0149デフォルトの名無しさん
2006/11/19(日) 07:33:15質問がここで良いかどうか分からないという意味です。
0151デフォルトの名無しさん
2006/11/19(日) 09:36:23一般的にアンインストール情報ファイルに付加される拡張子、らしいね。
インストーラ作ってるメーカに問い合わせてみれば?
0152デフォルトの名無しさん
2006/11/19(日) 10:16:150153デフォルトの名無しさん
2006/11/19(日) 11:08:39BATファイルは自分自身を削除できますが、コマンドプロンプトが表示されてしまいます。
0154Kioo
2006/11/19(日) 11:22:32どうすればいいのでしょうか
0155デフォルトの名無しさん
2006/11/19(日) 11:25:37言語は?
0156Kioo
2006/11/19(日) 11:34:35C++です。
0157デフォルトの名無しさん
2006/11/19(日) 11:38:560158Kioo
2006/11/19(日) 11:42:36IDD_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:45DELETE_ON_CLOSE付きCreateFileで
Tmp辺りにアンインストーラをコピーしてそれを起動する、だったと思う。
「アプリケーションの追加と削除」が微妙な動きをした記憶もあるけど(w
そうそう、削除する時は自分のアプリ関連のファイルのみを対象にする事。
誤って他のアプリやデータが入ったフォルダにインストールしていたら、
目も当てられない状態に。というか昔やっちゃったよ orz
0160デフォルトの名無しさん
2006/11/19(日) 11:56:24なるほど、目に付かない場所に作って後で消すように設定すれば同じですね。
>>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エディットボックスの内容が書き換えられた時に
GetWindowTextLength(GetDlgItem(IDC_EDIT_ID));で文字列の長さを取得
それに+1したサイズで、new char[]なりGlobalAllocなりでバッファを確保
GetWindowTextで文字列を取得する
stringが使いたかったら、さらにバッファからstringへ代入すればいい
0162デフォルトの名無しさん
2006/11/19(日) 12:16:400163Kioo
2006/11/19(日) 12:25:51今はまだありませんが、ダイアログの下部にボタンをひとつおき、それが押されたら、文字列を変数に入れてダイアログを閉じるようにする予定です
0164デフォルトの名無しさん
2006/11/19(日) 12:36:340165デフォルトの名無しさん
2006/11/19(日) 13:27:57TCHAR* 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:260167デフォルトの名無しさん
2006/11/19(日) 13:35:320168デフォルトの名無しさん
2006/11/19(日) 14:35:57FILE_FLAG_DELETE_ON_CLOSE だったんですね。ちょっと気が付きませんでした。
0169デフォルトの名無しさん
2006/11/19(日) 15:49:02■MFC相談室 mfc16d.dll■
http://pc8.2ch.net/test/read.cgi/tech/1146117893/
0170デフォルトの名無しさん
2006/11/19(日) 17:14:47終了する時についての質問です。
通常の閉じるをクリックしての終了、
右クリックした時にWM_CLOSEを投げての終了はうまくいくのですが、
ESC(WM_KEYDOWN)が押された時にWM_CLOSEを投げての終了が、
ウィンドウが閉じられるまでに、
CPU率が高くなった状態ですこし止まってしまいます。
原因はどこにあるのでしょうか。
PlaySound(NULL, NULL, 0);はいれています。
また、なぜかMessageBeep(MB_OK);を
抜ける直前に挟むと、ちゃんと終了できます。
0171153
2006/11/19(日) 17:58:24ファイルが削除されません。
何か継承しなければいけないのでしょうか?
0172デフォルトの名無しさん
2006/11/19(日) 18:17:21FILE_FLAG_DELETE_ON_CLOSE法はうまくいかない。
たぶんみんな試さないで書いてると思う。
漏れが昔ここで聞いた方法
1. rundll32で削除用dllを起動する。
2. 削除用dllからアンインストーラの終了を待って消す。
3. FreeLibraryしてから自分自身を消すコードをヒープにコピーして呼び出す。
(ヒープにPAGE_EXECUTEをつけるのをお忘れなく)
0173デフォルトの名無しさん
2006/11/19(日) 19:23:45試さないで書くけど 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> ようにする。
これがポイントか?
0175デフォルトの名無しさん
2006/11/19(日) 19:38:34よくわからんけどそれはハンドルを共用するためだろう。
ハンドルは何で共用する必要があるかというと、
分身起動→本体終了→分身により本体削除
のシーケンスを同期をとって実行するため。
0176153
2006/11/19(日) 20:04:410177デフォルトの名無しさん
2006/11/19(日) 20:31:15試してみたけどやっぱり消えないぞ。
むちゃくちゃコードを補う必要があったからどっかでミスってるのかもしれんが
0178153
2006/11/19(日) 21:09:013. 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> pMem = VirtualAlloc(pMem, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
上のGlobalAllocは何のためにあるんだ?
0180デフォルトの名無しさん
2006/11/19(日) 21:38:500181153
2006/11/19(日) 21:41:02GlobalAllocは必要ありませんでしたか。
0182デフォルトの名無しさん
2006/11/19(日) 21:47:50そのレベルじゃ>>172のコードを書くのは無理
0183デフォルトの名無しさん
2006/11/19(日) 21:55:25一時的に無効にする方法を教えてください。
OS は Windows MeとXPです。
0184デフォルトの名無しさん
2006/11/19(日) 22:01:49なメッセージを処理して1を返す
0185デフォルトの名無しさん
2006/11/19(日) 22:06:24問題があったぞ。
>FreeLibraryしてから自分自身を消すコードをヒープにコピーして呼び出す
この手段に対して何も触れてないじゃないか。
0186デフォルトの名無しさん
2006/11/19(日) 22:08:26そもそもそんなとこから教えなきゃならん事態が既に間違ってるってことはわかってるか?
0187デフォルトの名無しさん
2006/11/19(日) 22:09:13教えた側の責任か? それ見てこれ以上付き合う気なくしたんだが。
0188デフォルトの名無しさん
2006/11/19(日) 22:10:40プログラム教室ではない
0189デフォルトの名無しさん
2006/11/19(日) 22:13:33問題があったぞ。
○俺も新人のときCやDOSコマンドを教わった事があるが、この俺様に理解できなかった
のだから常に教えた側の問題に決まってる。
×この手段に対して何も触れてないじゃないか。
○とっとと手段を教えろよ情報を小出しにしやがって使えねーパソヲタども
つーか本当にそこが問題でできないなら聞き返してさえこない時点でオ�hル
0190デフォルトの名無しさん
2006/11/19(日) 22:15:29>・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
0191デフォルトの名無しさん
2006/11/19(日) 22:20:54格下に聞いちまったようだな。
0192デフォルトの名無しさん
2006/11/19(日) 22:23:480193デフォルトの名無しさん
2006/11/19(日) 22:28:02って素直に言えばいいのによ
0194デフォルトの名無しさん
2006/11/19(日) 22:29:550195デフォルトの名無しさん
2006/11/19(日) 22:31:150196デフォルトの名無しさん
2006/11/19(日) 22:34:48知ってるけど、教えてやらない。
0197デフォルトの名無しさん
2006/11/19(日) 23:12:47ttp://www.kumei.ne.jp/c_lang/sdk2/sdk_123.htm
(くメィさん使わしてもらいます)
これじゃないの?やるのは。
0198デフォルトの名無しさん
2006/11/19(日) 23:12:58そんなことぐらい誰でも知ってる。
問題はそこじゃねーよアホ。メモリリークという言葉も知らんのか
> 知らないから教えてください
って素直に言えばいいのに
0199デフォルトの名無しさん
2006/11/19(日) 23:17:04全然関係ない。
つーか>>172でコピー先がヒープであることは本質的じゃない。
別にVirtualAllocでもいいから(むしろMSの推奨はそっちだった気がする)
>>180が何を笑ってるのかよくわからん。
問題は意味もなくGlobalAllocしてメモリリーク起こすようなコードを平然と書く奴に
手取り足取り教えてられるほど暇じゃないってこと。
つーかコードをメモリ上でコピーするやり方はAdvanced Windowsに載ってるんだから
マジで読んでくれ
0200デフォルトの名無しさん
2006/11/19(日) 23:31:39MSがGlobalよりこっち使えって言ってるのは確かHeapAlloc
0201デフォルトの名無しさん
2006/11/19(日) 23:49:05嘘吐け、俺が教えてやったから言えるんだろうが。
最初は頭下げてただろうが下衆野郎。しらねーくせに威張ってんじゃねえよ。
>>199
最初から本でも書いときゃ良いだろうがよ。暇じゃない割に2chにへばりついてやがんな。
■ このスレッドは過去ログ倉庫に格納されています