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

Win32API質問箱 Build63

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

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

■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(http://msdn2.microsoft.com/library/)の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで

- Win32API質問箱 wiki
http://wiki.livedoor.jp/program1/d/FrontPage

【前スレ】
http://pc11.2ch.net/test/read.cgi/tech/1202060403/
0446デフォルトの名無しさん2008/03/19(水) 20:23:45
実際にデータを受信してサイズを確認するか、エスパーになるかすればいいと思うよ。
0447デフォルトの名無しさん2008/03/19(水) 20:48:59
Windows の中の人が必要と思っても、隠し API にしかならないこともあるんじゃないかな。
0448デフォルトの名無しさん2008/03/19(水) 21:10:18
>445
ヘッダ
0449デフォルトの名無しさん2008/03/19(水) 21:16:05
隠しAPI(笑)
0450デフォルトの名無しさん2008/03/19(水) 21:54:51
hotplug.dllとか隠しAPIは山ほどあるがさっぱり公開が進まないな
EUにもっと暴れてもらわないと
0451デフォルトの名無しさん2008/03/19(水) 22:31:29
隠しAPI(笑)
0452デフォルトの名無しさん2008/03/19(水) 22:33:05
何かキチガイのツボにハマるんだろうか。隠しAPIって。
0453デフォルトの名無しさん2008/03/19(水) 22:45:39
>>416
正直スマンカッタ 些細な疑問だったんだ。 反省してる。


だが謝らない。
0454デフォルトの名無しさん2008/03/19(水) 22:47:09
非公開とかundocumentedって書くのが玄人 
そうでないのは語彙が乏しくてガキっぽいよねww とか

ってここ何のスレだっけな
0455デフォルトの名無しさん2008/03/19(水) 22:49:36
そもそも今後消える可能性があるから非公開なんじゃねーの

ベータ(SONY)みたいな
0456デフォルトの名無しさん2008/03/19(水) 23:03:31
隠しというの表現は不公正に隠蔽しているというニュアンスだろ
0457デフォルトの名無しさん2008/03/19(水) 23:12:21
シェル関係でなんのために公開されているのか分からないAPIをよく見かける。
Windows 2000あたり限定(XPやVistaでは使えない)で、ほかの公開APIで代替が効く。
例えばSHFlushClipboardとか。
0458デフォルトの名無しさん2008/03/19(水) 23:29:50
MS嫌いのヨーロピアンが
「非公開API使って競合企業を出し抜いてるよ!ずるいよ!」
って訴えるためにあるAPI
0459デフォルトの名無しさん2008/03/20(木) 00:09:38
リパースポイントやハードリンク関連は隠されてるな
0460デフォルトの名無しさん2008/03/20(木) 00:15:11
>>458
…なんかGPL厨みたいな言い分だ
MSを擁護する気はさらさらないがこういうのも好きじゃないなあ
0461デフォルトの名無しさん2008/03/20(木) 00:15:44
>>457
SHFlushClipboardならXPにもあるみたいだが

で、2000の奴を逆汗してみたら
jmp OleFlushClipboard
の一行だけw 何の為にあるんだww
0462デフォルトの名無しさん2008/03/20(木) 00:17:02
別名作りたかっただけじゃないかな。
0463デフォルトの名無しさん2008/03/20(木) 00:23:51
エクスポートテーブルでフォワードできるのに
0464デフォルトの名無しさん2008/03/20(木) 00:35:43
SHFlushClipboardの他にもole32.dllに飛ばすだけの非公開関数があるようだ

shell32!SHRegisterDragDrop → ole32!RegisterDragDrop
shell32!SHRevokeDragDrop → ole32!RevokeDragDrop
shell32!SHFreeUnusedLibraries → ole32!CoFreeUnusedLibraries

どうやら95時代のshell32.dllが、対応するole32.dllのAPIをLoadLibrary/GetProcAddressで
遅延ロードしてアクセスする為のヘルパ関数として用意していたのを後方互換で残しているだけらしい
だから2000以降では全く意味が無いようだ

だったら最初からそう書いとけっつーの
0465デフォルトの名無しさん2008/03/20(木) 00:59:39
たしか、win95には、ole32.libをロードしなくてもすむ、
Shell用の軽量疑似OLEシステムがあったとかなんとか
0466デフォルトの名無しさん2008/03/20(木) 01:32:15
機器の抜き差しの検知方法について質問します。
VS2005のVC++でMFCを使ってプログラムしています。

USB機器の抜き差しについては、ぐぐったら
WM_DEVICECHANGE
DBT_DEVTYP_HANDLE
RegisterDeviceNotification
などのキーワードが出てきたので、それらを試して検知できることを確認しました。
結局、DBT_DEVTYP_HANDLE構造体のdbch_handleには
HIDデバイスのハンドルを渡したら上手くいきました。

しかし、DVI-Dで接続されたモニターの抜き差しを検知する方法がわかりません。
WM_DEVICECHANGEは飛んできます。
しかし、wParamにはDBT_DEVNODES_CHANGEDしか入ってきません。
USBと同じやり方でできないか、と思ったのですが
dbch_handleに何をセットすれば良いのかがわかりません。
EnumDisplayMonitorsで取得できるモニターハンドルではダメでした。

すみませんが、WM_DEVICECHANGEの中から、DVI-Dの抜き差しだけを検知する
やり方をぜひお教え下さい。
それとも、そのようなことは不可能なのでしょうか・・・?
0467デフォルトの名無しさん2008/03/20(木) 01:39:18
>>464
それを知るためにはThe Old New Thingを読まなければならないってどうなのかね
0468デフォルトの名無しさん2008/03/20(木) 02:09:24
俺はあれの邦訳本高くてまだ買ってないや
しかしなんであんな邦題なんだろう
0469デフォルトの名無しさん2008/03/20(木) 02:17:46
>>467
いや、>>464の内容は自力で解析してみただけなんだがw
The Old New Thingに書いてあるか?
0470デフォルトの名無しさん2008/03/20(木) 03:20:54
>>469
直接>>464に対応する関数ではないが、ほぼその解析が正しいことを裏付ける記事を
http://blogs.msdn.com/oldnewthing/archive/2004/07/05/173226.aspx
で読んだことがあったのでてっきりこれを見ていたのかと思った
0471デフォルトの名無しさん2008/03/20(木) 03:22:53
``its own miniature drag-drop loop, ''
ってことで言及はされてるけどね
0472デフォルトの名無しさん2008/03/20(木) 08:04:02
EDITやBUTTONなどの子ウインドウは、WM_COMMANDやWM_NOTIFYを親ウインドウに送ると思いますが、
親じゃなくて、特定のプロシージャに送ることはできますか?
0473デフォルトの名無しさん2008/03/20(木) 08:12:17
WTLのメッセージマップでも使え
0474デフォルトの名無しさん2008/03/20(木) 11:56:36
このスレの住人なら知っていますね、あの糞開発ツールのことを

・自分のプログラムのバグなのかコンパイラのバグなのかわからない
・他の仕事に応用できない糞開発ツールの独自世界を必死に学習している
・テキストエディタで書いたほうが効率的なのに糞UIツールを懸命に使っている
・糞開発ツールを批判すると「性格が悪いから糞ツールを批判するんだ」と言われる

糞だけど、政治的な理由で無理やり使わされているんですよね。
もう、あんな厨の作った糞ツールを我慢して使うのはやめましょう。

・糞開発ツールを部下に押し付ける上司の命令は無視しましょう。
 上司は糞開発ツールが使われる実績を作ることであの会社のごきげんをとっているのです。
・あの糞開発ツール提供会社には「おたくの糞開発ツールは話にならない」と突き放しましょう。
 バグレポートなどしてはいけません。改善要求などもってのほかです。
 あの会社はあなたたちのことをテスター/モルモットとしか思っていません。
・あの会議で「糞開発ツールを使ったら生産性がxx%アップしました」
 なんて話が出たら力強く机を叩き、会議室を出ましょう。
 あの人たちは糞開発ツールをマンセーすることで立場を確保しているのです。

糞な開発ツールを糞だと言える、そんな当たり前の環境をみんなの力で取り戻しましょう。
0475デフォルトの名無しさん2008/03/20(木) 11:58:58
こんな風に病みたくはないのものだ
0476デフォルトの名無しさん2008/03/20(木) 12:04:38
>>474
つまり、自分が納得できる物を、自分で作って使えと言うことか?
0477デフォルトの名無しさん2008/03/20(木) 12:05:36
コピペだからシカトしとけ
0478デフォルトの名無しさん2008/03/20(木) 13:02:00
Windows系はそうでもないが組み込み系は未だに
糞開発ツール多いよな
0479デフォルトの名無しさん2008/03/20(木) 13:25:42
競争がないからな
0480デフォルトの名無しさん2008/03/20(木) 13:45:08
そういえばWindows95のころはいろいろ糞開発ツールあったね
特に「簡単に画面が作れます」系が糞でダメだった
0481デフォルトの名無しさん2008/03/20(木) 13:51:45
delphiとかbcbとかだな
0482デフォルトの名無しさん2008/03/20(木) 14:00:33
.NET1.1のWindows.Formsより糞な物は見た事がない
0483デフォルトの名無しさん2008/03/20(木) 14:13:26
あまいよ
組み込み系なんか遥かに糞な開発ツールが今でも使われてる
0484デフォルトの名無しさん2008/03/20(木) 14:13:42
いや、そういうのいいから
0485デフォルトの名無しさん2008/03/20(木) 14:20:31
スレッドタイトルも読めないようなゆとりの知能レベルに相応の開発ツールしか
提供されてないわけだw
0486デフォルトの名無しさん2008/03/20(木) 14:44:57
DeviceCapabilities() についてです。
ざっと調べたのですが、どうもDEVMODE構造体を渡す場合の正しい使い方が確信できません。
わからないのは、

・pDevMode は、それが指す構造体の値を関数に渡すために使われるのか、
 構造体に関数が値を書き込むために使われるのか、
 あるいはその両方なのか(そうだとしてどれがreadでどれがwriteなのか)
・もし pDevMode の dmField メンバが取得する値を決めるとしたら、
 その場合 fwCapability は無視されるのかどうか、
 また要求する値は pDevMode に書き込まれるとして戻り値はどうなるのか

です。お願いします。
0487デフォルトの名無しさん2008/03/20(木) 14:54:25
一点目
>・pDevMode は、それが指す構造体の値を関数に渡すために使われるのか、
> 構造体に関数が値を書き込むために使われるのか、

入力オンリーです
MSDNを読めば宣言にconstが付いてるのが分かります

二点目
>・もし pDevMode の dmField メンバが取得する値を決めるとしたら、
> その場合 fwCapability は無視されるのかどうか、

fwCapabilityの値でpDevModeを無視するかどうか決めているので、fwCapabilityは必須

↓を見ると分かるがdmFieldメンバは構造体中の有効メンバを示すマスク
http://www.winapi-database.com/Struct/DEVMODE.html

穴があくまでMSDNを読みましょう
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpgdi/html/_win32_devicecapabilities.asp
0488デフォルトの名無しさん2008/03/20(木) 15:00:13
完璧にconstを見落としてました、失礼しました。
要するにDevice〜()はpDevModeの中身を吐き出すだけなのですね。

ではDEVMODE構造体に目的の値を得るにはいったい何の関数を使えばよいのでしょうか。
デバイスコンテキストに値を渡すにはResetDC()を使えばよいというのは分かるのですが、
逆にデバイスコンテキストから値を引っ張り出す関数がわかりません。
04894882008/03/20(木) 15:34:06
DocumentPropertiesって一番下に書いてました。すみませんでした。
0490デフォルトの名無しさん2008/03/20(木) 16:00:29
MP3の再生もできない上に音の重ね合わせもできない上にJPEG画像の表示もできないなんてWIN32APIって糞杉wwww
0491デフォルトの名無しさん2008/03/20(木) 16:03:43
そうですね
ホビープログラマは大変ですね
0492デフォルトの名無しさん2008/03/20(木) 17:28:10
エディットコントロールから
改行まで文字列を取り出そうとしているのですが、
\r\nがなぜか見つかりません。
これはなぜなのですか?
0493デフォルトの名無しさん2008/03/20(木) 17:50:13
>>490
・MP3再生
 DirectShow、ACM
・音の重ね合わせ
 MIDIでも鳴らしとけ
・JPEG
 OleLoadPicture、GDI+
0494デフォルトの名無しさん2008/03/20(木) 18:26:03
>>490はエロゲスクリプターだと思われ
もしくはHSPとかTTSナントカとかひまわり

>>492
エディットコントロール内と検索文字列の文字コード違うんじゃない?としか言いようがないわぁ
コード貼ってよ
0495デフォルトの名無しさん2008/03/20(木) 19:17:01
>>492
\nだけでやってみそ
0496デフォルトの名無しさん2008/03/20(木) 19:57:53
#define Write(s) SendDlgItemMessage(hWnd,IDC_EDIT,EM_RELACESEL,0,(LPARAM)((LPSTR)s))
Write("test");
Write("\r\n");
という具合です。
0497デフォルトの名無しさん2008/03/20(木) 23:40:06
>>494
自己解決しました
0498デフォルトの名無しさん2008/03/21(金) 01:50:38
C++でWindowsXPのプログラムを作ってるんですが、
intのサイズってどこで決まるんでしょうか?
OSのバージョン?CPU?
WindowsXPだと普通intは32ビットでしょうか?
0499デフォルトの名無しさん2008/03/21(金) 01:52:40
>>498
コンパイル時に決まる。
05004982008/03/21(金) 01:59:48
intを使いたいのは、速度と移植性のためです。
LONGやDWORDでも、スピードがほとんど変わらないなら、
intは使わないでもいいかなと思いますが。
0501デフォルトの名無しさん2008/03/21(金) 02:01:06
LONGやDWODなんてただのtypedefなんだから何かなるわけないだろ。
05024982008/03/21(金) 02:01:42
そうなんですか。ありがとうございます。
0503デフォルトの名無しさん2008/03/21(金) 02:01:52
>>500
移植性のためなら LONG や DWORD をどうぞ
0504デフォルトの名無しさん2008/03/21(金) 02:03:25
そんな事がわからんレベルでスピードがどうの言ってもしょうがない
0505デフォルトの名無しさん2008/03/21(金) 02:16:25
確かWin64だとintは32ビットのままでINT_PTRが64ビットになるんだっけ
0506デフォルトの名無しさん2008/03/21(金) 02:51:15
VC++ならsize_tとポインタ以外は32/64関係なくサイズ固定だったと思う。
プラットフォームで切り替えたいなら、プリプロセッサで定義変わるようにしとくといい。
とりあえず64bit環境を準備するんだな。実際作って動かしてみればわかる。
0507デフォルトの名無しさん2008/03/21(金) 09:19:43
64ビットのint型ってなんかたくさんない?
俺は__int64っての使ってるんだけど
何が標準なのか判らない。
0508デフォルトの名無しさん2008/03/21(金) 09:49:21
__int64 はVC++などの独自拡張
C/C++の標準ならC9Xならstdint.h に int64_t があるかも知れないが無いかもしれない
標準というわけではないがWin32APIスレとしてはbasetsd.hのINT64やUINT64が無難だと思う
0509デフォルトの名無しさん2008/03/21(金) 09:50:35
そうだったのか
0510デフォルトの名無しさん2008/03/21(金) 10:04:53
DWORDとULONGでいちいちキャストしなきゃいけないのがうざい
中身同じだろ
0511デフォルトの名無しさん2008/03/21(金) 10:22:16
どっちも元を辿ればunsigned long (32ビット)なんだから、
キャストしなくても警告なしでコンパイルできると思う。
お前が個人的にそれを気持ち悪いと思ってキャストしているというのならともかく。
0512デフォルトの名無しさん2008/03/21(金) 10:46:35
漢字の第一バイトを識別するAPIを教えてください
0513デフォルトの名無しさん2008/03/21(金) 10:50:47
今時SJISとか使うの?
0514デフォルトの名無しさん2008/03/21(金) 10:53:14
IsDBCSLeadByte
0515デフォルトの名無しさん2008/03/21(金) 10:54:35
>>513
知らないならレスしないで下さい。うざいだけです。
>>514
ありがとうございます。
0516デフォルトの名無しさん2008/03/21(金) 11:38:38
Unicodeにすると単純計算でメモリを2倍食うことになるのがなぁ
サロゲートペアとか考慮するとMBCS程ではないが面倒には変わりないし

とか言いつつ最近は殆どUnicodeビルドだしサロゲートペアなんて全然考えてない俺w
0517デフォルトの名無しさん2008/03/21(金) 12:22:22
>>515
しね
0518デフォルトの名無しさん2008/03/21(金) 12:23:11
てめーが死ね
0519デフォルトの名無しさん2008/03/21(金) 12:24:49
お前はもう死んでいる
0520デフォルトの名無しさん2008/03/21(金) 12:48:24
おれももう死んでいる
0521デフォルトの名無しさん2008/03/21(金) 13:04:11
Vistaのタスクマネージャのコマンドライン列と同じようなものを作りたいのですが、
プロセスのIDかハンドルを元に、起動引数を取得するAPIは無いのでしょうか?

過去スレでは

1、CreateRemoteThreadで対象プロセスにdllを注入し、
2、GetCommandLineで引数を取得。
3、その情報をプロセス間通信などで送信

という方法が示されていましたが、
1の処理がLoadLibraryのカーネル上でのアドレスが全プロセスで共通であることに依存しており
もし、LoadLibraryのアドレスが異なれば対象プロセスを異常終了させてしまうという危険なものでした。

できれば、この方法はとりたくないので、APIが用意されていればいいのですが・・・。
0522デフォルトの名無しさん2008/03/21(金) 13:11:54
> LoadLibraryのカーネル上でのアドレスが全プロセスで共通である

確か決まってたはず
0523デフォルトの名無しさん2008/03/21(金) 15:57:07
>>522
Vistaでもそうなんだっけ?
0524デフォルトの名無しさん2008/03/21(金) 16:48:08
VistaはOS(notプロセス)を起動するごとに変わるんだっけ?256パターンで。
0525デフォルトの名無しさん2008/03/21(金) 17:54:29
1. 最初にDLLがロードされたときに決まる
2. 1つでもそのDLLをロードしているプロセスがある間、他のプロセスがロードしてもアドレスは変化しない
3. 全プロセスからアンロードされたら、次にロードされたときにまたランダムに変わる(1.へ)

こんな感じだったと記憶している
0526デフォルトの名無しさん2008/03/21(金) 18:09:39
1の処理をLoadLibraryのカーネル上でのアドレスが全プロセスで共通であることに依存させる必然性がない
0527デフォルトの名無しさん2008/03/21(金) 18:31:58
黙れブタ野郎!
0528デフォルトの名無しさん2008/03/21(金) 19:04:44
うるせーばかどっかいけ
0529デフォルトの名無しさん2008/03/21(金) 19:54:28
Vistaではセッションごとに異なる。
つまり別ユーザがリモートデスクトップとかで入ってきた時のプロセスはロードアドレスが異なるものになる
05305292008/03/21(金) 20:42:28
PEBから取れそうだなーとかおもって調べたらずばりのが出てきた
http://www.codeproject.com/KB/threads/GetNtProcessInfo.aspx

NtQueryInformationProcessでPROCESS_BASIC_INFORMATION拾ってきて
PROCESS_BASIC_INFORMATION::PEB::RTL_USER_PROCESS_PARAMETERS::ImagePathName.Buffer
(要するにプロセスがコマンドラインを保存しているアドレス)をReadProcessMemoryするっぽ

ただPEB構造体はDDKでも非公開だった気がするからそこは注意
0531デフォルトの名無しさん2008/03/21(金) 20:51:41
なんでそんなに頭いいの
0532デフォルトの名無しさん2008/03/21(金) 20:53:13
実装に必要な部分はちゃんと公開されてる罠 orz
05335212008/03/21(金) 20:53:56
>>530
今後仕様変更があるかも、とは書かれていますが、一応公開されてますね。

http://msdn2.microsoft.com/en-us/library/aa813706(VS.85).aspx

もし、仕様変更があったとしても、他のプロセスにダメージを与えることはなさそうなので
>>512の方法よりずっと安全なコードが書けそうです。

ありがとうございました。
0534デフォルトの名無しさん2008/03/21(金) 21:29:20
>>521の質問ってスレが立つたびに見かけるね

他プロセスのコマンドライン文字列を取得して何に使うのか知らないけど、MSもいい加減
DWORD GetCommandLineEx(HANDLE hProcess, LPTSTR pszBuffer, UINT cchBuffer);
を用意すればいいのに
0535デフォルトの名無しさん2008/03/22(土) 00:23:05
何に使うんだよ
0536デフォルトの名無しさん2008/03/22(土) 00:33:48
ウイルス作りたくて
0537デフォルトの名無しさん2008/03/22(土) 00:37:13
悪用するなヤメレ
0538デフォルトの名無しさん2008/03/22(土) 00:38:43
本気で言ってるならやめれ
冗談で言ってるなら面白くないよ
0539デフォルトの名無しさん2008/03/22(土) 01:11:57
明日も朝から出勤なのでむしゃくしゃして書いた
今は寝る準備をしている
ttp://www.hsjp.net/upload/src/up14021.txt
0540デフォルトの名無しさん2008/03/22(土) 01:13:35
うわーすげー
流し読みじゃ何のことかさっぱりわからん
0541デフォルトの名無しさん2008/03/22(土) 01:14:48
乙
でもなんでこんなに読みにくいんだろ?
0542デフォルトの名無しさん2008/03/22(土) 01:19:43
>>539
とりあえず適当に突っ込んでみる。

・pszBufferにNULLを渡すと落ちる。
 必要な文字長(終端の'\0'を含む)を返すべき。
・NtQueryInformationProcessに失敗したときにRtlNtStatusToDosError/SetLastErrorしてない気がする。
・というか所々SetLastErrorすべき所が抜けてる。
0543r2008/03/22(土) 10:18:47
質問させてください。最近純粋なC言語を勉強して

はじめて VisualC++ 2005 Express Edition(無償配布なアレです) に手を出した者です。

デバッグ用に MessageBox使うのが嫌だったのでOutputDebugStringを使おうと思い

PSDKもいれinclude や lib などのパスの設定もし
#include <windows.h>として

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
    //this->button1->Text = "てすと"; /* これは今まで使ってた応急処置的な出力 */
    OutputDebugString("test");
}

試しにこのように ボタンをクリックしたらデバッグ画面に出力するようにしたのですが、ボタンを押下しても何も表示されません。なぜでしょうか?(エラーもまったくでません 押しても反応なしといった状態です)

もしかしたらリアルタイムに対応していないのでは?とも思いましたが、×で閉じた後もやはり何も出力されていません。もしこの方法で意図通りのことができないのであれば他に何か方法はありますでしょうか?

イメージ的には#のConsole.WriteLine();のようなことがしたいです。よろしかったらご教授ください m(_ _)m
0544デフォルトの名無しさん2008/03/22(土) 10:36:02
過去ログ読んでもよくわからなかったので質問します
EDITコントロールの背景透過表示はできないのでしょうか?
WM_CTLCOLOREDITで
SetBkMode(((HDC)wp), TRANSPARENT);
return (LRESULT)GetStockObject(NULL_BRUSH);
とすれば一応背景透過になりますが、スクロールした場合など、文字部分が再描画されません
0545デフォルトの名無しさん2008/03/22(土) 10:50:17
>>543
.Netで書いてるなら、.Netでデバッグ出力すればいいかと
System.Diagnostics.Debug.WriteLineじゃダメなのか?
■ このスレッドは過去ログ倉庫に格納されています