トップページ⇒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などの質問はそれぞれの言語や開発環境スレで
0083デフォルトの名無しさん2006/11/15(水) 23:14:22
>>81
>>82
ありがとうございます。
0084デフォルトの名無しさん2006/11/15(水) 23:43:27
どこでもいいわけではない。
DllMainや一部のコールバックでは制限されている。
0085デフォルトの名無しさん2006/11/15(水) 23:47:55
スレッドで実行してる長いループはちゃんと1000msでSleep呼び出してるのに、
肝心のWinMainがスレッド作成から動いていない・・・何故だ・・・。
0086デフォルトの名無しさん2006/11/15(水) 23:48:11
>>84
ソースきぼんぬ(死語?)
0087デフォルトの名無しさん2006/11/15(水) 23:53:51
きぼんぬ!出た!きぼんぬ出た!得意技!きぼんぬ出た!きぼんぬ!これ!きぼんぬ出たよ〜〜!
0088デフォルトの名無しさん2006/11/16(木) 00:12:05
>>87
俺は限界だと思った。
0089デフォルトの名無しさん2006/11/16(木) 01:14:04
XPまではデスクトップのlistviewのLVITEM.lParamにpidlが入ってたのに
Vistaじゃ入ってない?
0090デフォルトの名無しさん2006/11/16(木) 02:12:00
MSDNにそんなこと書いてあった?
009184ではない2006/11/16(木) 02:28:16
記憶が確かならCOM関係の本で見かけたような。
具体的にはDLLを動的にロードしたあとDLL側が勝手にスレッドを作ったりして作られたスレッドが走ってる最中にアンロードされたりすると・・・
だったような・・・
・・・でCOMでスレッドを作りたい場合はプロセス内サーバは避けろとかあったような。
(とりあえずEffective COMの項目32で確認)
0092デフォルトの名無しさん2006/11/16(木) 06:40:53
Win32Apiの勉強をかねてVC2005EEでランチャーソフトを作ってます。

ボタンを押し、その状態のままボタン外へマウスをドラッグさせ、マウスのボタンを放すと
ボタンに登録したアイコンを消す。

という動作をさせようと思い "WM_LBUTTONDOWN" / "WM_LNCBUTTONDOWN" /
"WM_LBUTTONUP" / " WM_LNCBUTTONUP" で処理を書いてみたのですが。
どうもメインフォーム上でのみ反応し、ボタン上では反応しませんでした。

ボタンを対象に何かをしなくてはならないとは思うのですが
良い方法が思い浮かびません。アドバイスをお願いします。
0093デフォルトの名無しさん2006/11/16(木) 07:05:11
>>92
SetCapture
0094デフォルトの名無しさん2006/11/16(木) 07:08:52
つ SetCapture/ReleaseCapture
0095デフォルトの名無しさん2006/11/16(木) 07:14:05
>>93-94
ありがとうございます。
早速調べてみます。
0096デフォルトの名無しさん2006/11/16(木) 07:21:25
PtInRegionとの組み合わせで解決しそうですありがとうございました。



.NET Framework 2.0 廃止予定の API 一覧
ttp://www.microsoft.com/japan/msdn/netframework/programming/obsoleteapi/
他スレで見かけたので貼っておきますね。
0097デフォルトの名無しさん2006/11/16(木) 13:48:00
はじめまして、
C++Builderで画像処理ソフトを作っているものですが、
VideoForWindowsで動画をチャプチャしております。
そこで質問なんですが、

1.bmpを介さずに直接メモリにチャプチャする方法
2.動画の描画を行わずに画像を取得(表示すると遅くなるため)

を教えていただけませんか。
いろいろ調べてみたものの解決に至っていません。
DirectShowはちょっと難しかったので使っていません。
どうぞよろしくお願いいたします。
0098デフォルトの名無しさんNGNG?2BP(200)
DirectShowの方が圧倒的に簡単。
0099デフォルトの名無しさん2006/11/16(木) 20:23:43
ttp://wisdom.sakura.ne.jp/system/winapi/win32/index.html
だとCでコンパイルしろっていってるけどC++でWin32APIは使えないの?
このサイトだけでの話?
0100デフォルトの名無しさん2006/11/16(木) 20:28:15
帰れ低脳
使える使えないを語る以前の問題じゃ
0101992006/11/16(木) 20:33:25
自己解決したわ。そのサイトだけっぽい。
猫のとこなら.cppだったわ・・・
0102デフォルトの名無しさん2006/11/16(木) 20:40:23
絶対、注意書きの意味を理解してないな
0103デフォルトの名無しさん2006/11/16(木) 20:52:20
apiの勉強する前に
C/C++の基本を勉強する方が先みたいだな
0104デフォルトの名無しさん2006/11/16(木) 20:54:59
禿do
0105デフォルトの名無しさん2006/11/16(木) 21:31:53
CをC++でコンパイルするとパソコンが爆発するよ。
0106デフォルトの名無しさん2006/11/16(木) 21:44:09
マジで?やべーな・・・
0107デフォルトの名無しさん2006/11/16(木) 23:47:05
C++を学ぶと頭が禿げると聞いたのですが?
0108デフォルトの名無しさん2006/11/16(木) 23:58:32
そりゃコンパイラ開発者がアレだからなぁ
0109デフォルトの名無しさん2006/11/17(金) 00:01:04
Delphiばかりやってると馬鹿になると聞いたのですが?wwww
0110デフォルトの名無しさん2006/11/17(金) 00:04:01
俺はC++勉強し始めて10年後くらいから薄くなってきた。
0111デフォルトの名無しさん2006/11/17(金) 00:05:38
デルポイ
0112デフォルトの名無しさん2006/11/17(金) 00:17:45
>>110
勉強しなかった場合と比較できないので科学的実験結果としては有意でないと考えられる。
0113デフォルトの名無しさん2006/11/17(金) 12:57:59
カレントディレクトリに指定したファイル名のファイルが
存在するかを調べる関数がありましたら教えてください。

CreateFileとかで失敗したらとかでもできると思いますが、
正規のがありましたら教えてください。
0114デフォルトの名無しさん2006/11/17(金) 13:25:32
SearchPath
FindFirstFile

好きな方でどうぞ
0115デフォルトの名無しさん2006/11/17(金) 15:00:48
普通はopenでやっちゃうと思う。
01161132006/11/17(金) 15:16:46
>>114>>115
ありがとうございます。使ってみます。
0117デフォルトの名無しさん2006/11/17(金) 16:39:28
絶対パスを相対パスに変換するAPIがあったら教えてください。
0118デフォルトの名無しさん2006/11/17(金) 16:42:27
PathMakeRelative
0119デフォルトの名無しさん2006/11/17(金) 16:48:43
PathRelativePathTo で出来そうです。
本当にありがとうございました。
0120デフォルトの名無しさん2006/11/17(金) 18:50:32
>>113
PathFileExists というズバリな関数がある
0121デフォルトの名無しさん2006/11/17(金) 19:21:57
>>120
知らなんだー
GetFileAttributes使ってた。
0122デフォルトの名無しさん2006/11/17(金) 23:41:07
おらもだ
0123デフォルトの名無しさん2006/11/17(金) 23:45:50
一応書いておくが、shlwapi.dllの関数で要IE4以上。
0124デフォルトの名無しさん2006/11/18(土) 00:33:17
#pragma comment(lib, "SHLWAPI.lib");
0125デフォルトの名無しさん2006/11/18(土) 01:36:31
shlwapiは便利だね
wsnprintfとかワイルドカードでのマッチングもたしかあの中だったよね?
0126デフォルトの名無しさん2006/11/18(土) 01:40:28
APIらしくGetProcAddressを使うんだよ!

やったことないけどさ

なぜかPath〜系は未だにMSDNが日本語じゃないんだよな
8月版になったからといって更新されるわけもなし
0127デフォルトの名無しさん2006/11/18(土) 01:49:24
ウィンドウズプログラムで質問したい事があります。
ググったのですがいまい解決できそうなページがありませんでした。
作っているのはアナログ時計です。
開発環境はVC++6.0 Proです。SDKで作っています。
丸いリージョンで表示した時計のウィンドウがあります。
ウィンドウのクライアント領域はマウスでドラッグして移動できるように
細工をしております。
アナログ時計のウィンドウをデスクトップ領域の上端より超えて移動すると
ウィンドウのキャプションが隠れるあたりでマウスのボタンを離すと
自動的にキャップションが少しだけ見える位置に移動してしまいます。
ウィンドウのクライアント領域でのマウスの移動が出来るのでできれば
デスクトップの上端から上へキャプションが隠れてもそのままウィンドウが
移動できるようにはできないでしょうか。
よろしくお願いします。
0128デフォルトの名無しさん2006/11/18(土) 02:29:18
>>127
よく分からんけど足りなさそうな情報を質問。
細工ってヒットテストにキャプションって返すやつ?
01291272006/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:48
>>130 逆
01321302006/11/18(土) 10:06:29
逆にしたらできました。orz
0133デフォルトの名無しさん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で明示的に破棄しないと解放されないから
プロセスが走ってる間にいくつも作っては捨てをする場合は要らなくなったらDeleteObjectした方がいいね
1個2個作ってそのままくらいなら、プロセス終了時のリソース解放に任せてもいい
0136デフォルトの名無しさん2006/11/18(土) 14:49:31
>>134>>135
ありがとうございました
0137デフォルトの名無しさん2006/11/18(土) 14:53:20
HFONTからLOGFONT取得って可能ですか? 
CreateFontIndirectの逆のことしたいんですけれども
0138デフォルトの名無しさん2006/11/18(土) 15:01:09
GetObject
0139デフォルトの名無しさん2006/11/18(土) 15:04:48
ぉぅぃぇ盲点だった  orz
ありがとう
0140デフォルトの名無しさん2006/11/18(土) 15:25:04
>>136
いちおう念を押しておくとWM_PAINTは再描画のたびに呼ばれるからな
0141デフォルトの名無しさん2006/11/18(土) 23:10:31
ウィンドウを作成して、タスクバーにそのウィンドウを表示させないように
したいのですが、どうしたら良いのでしょうか・・・

ツールウィンドウ を使うしか無いのでしょうか>< 
教えて下さいエロい人
0142デフォルトの名無しさんNGNG?2BP(0)
>>141
不可視のオーナーウィンドウ
0143デフォルトの名無しさん2006/11/18(土) 23:24:28
http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_TaskTray.html
0144デフォルトの名無しさん2006/11/18(土) 23:27:26
ありがとう >>142 >>143

解決出来ました。
0145デフォルトの名無しさん2006/11/19(日) 02:24:00
2つのpathが同じかどうか簡単に調べる方法はないでしょうか?
0146デフォルトの名無しさん2006/11/19(日) 02:44:04
GetVolumePathNameとGetVolumeInformationでボリュームが同じかどうか調べて
(同じボリュームでなければ当然同一パスでもない)
GetFileInformationByHandleでファイルIDを比較する。
0147デフォルトの名無しさん2006/11/19(日) 06:06:44
>>145
PathSearchAndQualifyとかPathCanonicalizeが使えないかな?
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のコードを書くのは無理
■ このスレッドは過去ログ倉庫に格納されています