Win32API質問箱 Build63
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/03/04(火) 12:15:58やさしいお兄さんやお姉さんたちが答えてくれるかも。
過去スレ、関連リンクは>>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:450447デフォルトの名無しさん
2008/03/19(水) 20:48:590448デフォルトの名無しさん
2008/03/19(水) 21:10:18ヘッダ
0449デフォルトの名無しさん
2008/03/19(水) 21:16:050450デフォルトの名無しさん
2008/03/19(水) 21:54:51EUにもっと暴れてもらわないと
0451デフォルトの名無しさん
2008/03/19(水) 22:31:290452デフォルトの名無しさん
2008/03/19(水) 22:33:050453デフォルトの名無しさん
2008/03/19(水) 22:45:39正直スマンカッタ 些細な疑問だったんだ。 反省してる。
だが謝らない。
0454デフォルトの名無しさん
2008/03/19(水) 22:47:09そうでないのは語彙が乏しくてガキっぽいよねww とか
ってここ何のスレだっけな
0455デフォルトの名無しさん
2008/03/19(水) 22:49:36ベータ(SONY)みたいな
0456デフォルトの名無しさん
2008/03/19(水) 23:03:310457デフォルトの名無しさん
2008/03/19(水) 23:12:21Windows 2000あたり限定(XPやVistaでは使えない)で、ほかの公開APIで代替が効く。
例えばSHFlushClipboardとか。
0458デフォルトの名無しさん
2008/03/19(水) 23:29:50「非公開API使って競合企業を出し抜いてるよ!ずるいよ!」
って訴えるためにあるAPI
0459デフォルトの名無しさん
2008/03/20(木) 00:09:380460デフォルトの名無しさん
2008/03/20(木) 00:15:11…なんかGPL厨みたいな言い分だ
MSを擁護する気はさらさらないがこういうのも好きじゃないなあ
0461デフォルトの名無しさん
2008/03/20(木) 00:15:44SHFlushClipboardならXPにもあるみたいだが
で、2000の奴を逆汗してみたら
jmp OleFlushClipboard
の一行だけw 何の為にあるんだww
0462デフォルトの名無しさん
2008/03/20(木) 00:17:020463デフォルトの名無しさん
2008/03/20(木) 00:23:510464デフォルトの名無しさん
2008/03/20(木) 00:35:43shell32!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:39Shell用の軽量疑似OLEシステムがあったとかなんとか
0466デフォルトの名無しさん
2008/03/20(木) 01:32:15VS2005の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それを知るためにはThe Old New Thingを読まなければならないってどうなのかね
0468デフォルトの名無しさん
2008/03/20(木) 02:09:24しかしなんであんな邦題なんだろう
0469デフォルトの名無しさん
2008/03/20(木) 02:17:46いや、>>464の内容は自力で解析してみただけなんだがw
The Old New Thingに書いてあるか?
0470デフォルトの名無しさん
2008/03/20(木) 03:20:54直接>>464に対応する関数ではないが、ほぼその解析が正しいことを裏付ける記事を
http://blogs.msdn.com/oldnewthing/archive/2004/07/05/173226.aspx
で読んだことがあったのでてっきりこれを見ていたのかと思った
0471デフォルトの名無しさん
2008/03/20(木) 03:22:53ってことで言及はされてるけどね
0472デフォルトの名無しさん
2008/03/20(木) 08:04:02親じゃなくて、特定のプロシージャに送ることはできますか?
0473デフォルトの名無しさん
2008/03/20(木) 08:12:170474デフォルトの名無しさん
2008/03/20(木) 11:56:36・自分のプログラムのバグなのかコンパイラのバグなのかわからない
・他の仕事に応用できない糞開発ツールの独自世界を必死に学習している
・テキストエディタで書いたほうが効率的なのに糞UIツールを懸命に使っている
・糞開発ツールを批判すると「性格が悪いから糞ツールを批判するんだ」と言われる
糞だけど、政治的な理由で無理やり使わされているんですよね。
もう、あんな厨の作った糞ツールを我慢して使うのはやめましょう。
・糞開発ツールを部下に押し付ける上司の命令は無視しましょう。
上司は糞開発ツールが使われる実績を作ることであの会社のごきげんをとっているのです。
・あの糞開発ツール提供会社には「おたくの糞開発ツールは話にならない」と突き放しましょう。
バグレポートなどしてはいけません。改善要求などもってのほかです。
あの会社はあなたたちのことをテスター/モルモットとしか思っていません。
・あの会議で「糞開発ツールを使ったら生産性がxx%アップしました」
なんて話が出たら力強く机を叩き、会議室を出ましょう。
あの人たちは糞開発ツールをマンセーすることで立場を確保しているのです。
糞な開発ツールを糞だと言える、そんな当たり前の環境をみんなの力で取り戻しましょう。
0475デフォルトの名無しさん
2008/03/20(木) 11:58:580476デフォルトの名無しさん
2008/03/20(木) 12:04:38つまり、自分が納得できる物を、自分で作って使えと言うことか?
0477デフォルトの名無しさん
2008/03/20(木) 12:05:360478デフォルトの名無しさん
2008/03/20(木) 13:02:00糞開発ツール多いよな
0479デフォルトの名無しさん
2008/03/20(木) 13:25:420480デフォルトの名無しさん
2008/03/20(木) 13:45:08特に「簡単に画面が作れます」系が糞でダメだった
0481デフォルトの名無しさん
2008/03/20(木) 13:51:450482デフォルトの名無しさん
2008/03/20(木) 14:00:330483デフォルトの名無しさん
2008/03/20(木) 14:13:26組み込み系なんか遥かに糞な開発ツールが今でも使われてる
0484デフォルトの名無しさん
2008/03/20(木) 14:13:420485デフォルトの名無しさん
2008/03/20(木) 14:20:31提供されてないわけだw
0486デフォルトの名無しさん
2008/03/20(木) 14:44:57ざっと調べたのですが、どうも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要するにDevice〜()はpDevModeの中身を吐き出すだけなのですね。
ではDEVMODE構造体に目的の値を得るにはいったい何の関数を使えばよいのでしょうか。
デバイスコンテキストに値を渡すにはResetDC()を使えばよいというのは分かるのですが、
逆にデバイスコンテキストから値を引っ張り出す関数がわかりません。
0489488
2008/03/20(木) 15:34:060490デフォルトの名無しさん
2008/03/20(木) 16:00:290491デフォルトの名無しさん
2008/03/20(木) 16:03:43ホビープログラマは大変ですね
0492デフォルトの名無しさん
2008/03/20(木) 17:28:10改行まで文字列を取り出そうとしているのですが、
\r\nがなぜか見つかりません。
これはなぜなのですか?
0493デフォルトの名無しさん
2008/03/20(木) 17:50:13・MP3再生
DirectShow、ACM
・音の重ね合わせ
MIDIでも鳴らしとけ
・JPEG
OleLoadPicture、GDI+
0494デフォルトの名無しさん
2008/03/20(木) 18:26:03もしくはHSPとかTTSナントカとかひまわり
>>492
エディットコントロール内と検索文字列の文字コード違うんじゃない?としか言いようがないわぁ
コード貼ってよ
0495デフォルトの名無しさん
2008/03/20(木) 19:17:01\nだけでやってみそ
0496デフォルトの名無しさん
2008/03/20(木) 19:57:53Write("test");
Write("\r\n");
という具合です。
0497デフォルトの名無しさん
2008/03/20(木) 23:40:06自己解決しました
0498デフォルトの名無しさん
2008/03/21(金) 01:50:38intのサイズってどこで決まるんでしょうか?
OSのバージョン?CPU?
WindowsXPだと普通intは32ビットでしょうか?
0499デフォルトの名無しさん
2008/03/21(金) 01:52:40コンパイル時に決まる。
0500498
2008/03/21(金) 01:59:48LONGやDWORDでも、スピードがほとんど変わらないなら、
intは使わないでもいいかなと思いますが。
0501デフォルトの名無しさん
2008/03/21(金) 02:01:060502498
2008/03/21(金) 02:01:420503デフォルトの名無しさん
2008/03/21(金) 02:01:52移植性のためなら LONG や DWORD をどうぞ
0504デフォルトの名無しさん
2008/03/21(金) 02:03:250505デフォルトの名無しさん
2008/03/21(金) 02:16:250506デフォルトの名無しさん
2008/03/21(金) 02:51:15プラットフォームで切り替えたいなら、プリプロセッサで定義変わるようにしとくといい。
とりあえず64bit環境を準備するんだな。実際作って動かしてみればわかる。
0507デフォルトの名無しさん
2008/03/21(金) 09:19:43俺は__int64っての使ってるんだけど
何が標準なのか判らない。
0508デフォルトの名無しさん
2008/03/21(金) 09:49:21C/C++の標準ならC9Xならstdint.h に int64_t があるかも知れないが無いかもしれない
標準というわけではないがWin32APIスレとしてはbasetsd.hのINT64やUINT64が無難だと思う
0509デフォルトの名無しさん
2008/03/21(金) 09:50:350510デフォルトの名無しさん
2008/03/21(金) 10:04:53中身同じだろ
0511デフォルトの名無しさん
2008/03/21(金) 10:22:16キャストしなくても警告なしでコンパイルできると思う。
お前が個人的にそれを気持ち悪いと思ってキャストしているというのならともかく。
0512デフォルトの名無しさん
2008/03/21(金) 10:46:350513デフォルトの名無しさん
2008/03/21(金) 10:50:470514デフォルトの名無しさん
2008/03/21(金) 10:53:140516デフォルトの名無しさん
2008/03/21(金) 11:38:38サロゲートペアとか考慮するとMBCS程ではないが面倒には変わりないし
とか言いつつ最近は殆どUnicodeビルドだしサロゲートペアなんて全然考えてない俺w
0517デフォルトの名無しさん
2008/03/21(金) 12:22:22しね
0518デフォルトの名無しさん
2008/03/21(金) 12:23:110519デフォルトの名無しさん
2008/03/21(金) 12:24:490520デフォルトの名無しさん
2008/03/21(金) 12:48:240521デフォルトの名無しさん
2008/03/21(金) 13:04:11プロセスのIDかハンドルを元に、起動引数を取得するAPIは無いのでしょうか?
過去スレでは
1、CreateRemoteThreadで対象プロセスにdllを注入し、
2、GetCommandLineで引数を取得。
3、その情報をプロセス間通信などで送信
という方法が示されていましたが、
1の処理がLoadLibraryのカーネル上でのアドレスが全プロセスで共通であることに依存しており
もし、LoadLibraryのアドレスが異なれば対象プロセスを異常終了させてしまうという危険なものでした。
できれば、この方法はとりたくないので、APIが用意されていればいいのですが・・・。
0522デフォルトの名無しさん
2008/03/21(金) 13:11:54確か決まってたはず
0523デフォルトの名無しさん
2008/03/21(金) 15:57:07Vistaでもそうなんだっけ?
0524デフォルトの名無しさん
2008/03/21(金) 16:48:080525デフォルトの名無しさん
2008/03/21(金) 17:54:292. 1つでもそのDLLをロードしているプロセスがある間、他のプロセスがロードしてもアドレスは変化しない
3. 全プロセスからアンロードされたら、次にロードされたときにまたランダムに変わる(1.へ)
こんな感じだったと記憶している
0526デフォルトの名無しさん
2008/03/21(金) 18:09:390527デフォルトの名無しさん
2008/03/21(金) 18:31:580528デフォルトの名無しさん
2008/03/21(金) 19:04:440529デフォルトの名無しさん
2008/03/21(金) 19:54:28つまり別ユーザがリモートデスクトップとかで入ってきた時のプロセスはロードアドレスが異なるものになる
0530529
2008/03/21(金) 20:42:28http://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:410532デフォルトの名無しさん
2008/03/21(金) 20:53:130533521
2008/03/21(金) 20:53:56今後仕様変更があるかも、とは書かれていますが、一応公開されてますね。
http://msdn2.microsoft.com/en-us/library/aa813706(VS.85).aspx
もし、仕様変更があったとしても、他のプロセスにダメージを与えることはなさそうなので
>>512の方法よりずっと安全なコードが書けそうです。
ありがとうございました。
0534デフォルトの名無しさん
2008/03/21(金) 21:29:20他プロセスのコマンドライン文字列を取得して何に使うのか知らないけど、MSもいい加減
DWORD GetCommandLineEx(HANDLE hProcess, LPTSTR pszBuffer, UINT cchBuffer);
を用意すればいいのに
0535デフォルトの名無しさん
2008/03/22(土) 00:23:050536デフォルトの名無しさん
2008/03/22(土) 00:33:480537デフォルトの名無しさん
2008/03/22(土) 00:37:130538デフォルトの名無しさん
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とりあえず適当に突っ込んでみる。
・pszBufferにNULLを渡すと落ちる。
必要な文字長(終端の'\0'を含む)を返すべき。
・NtQueryInformationProcessに失敗したときにRtlNtStatusToDosError/SetLastErrorしてない気がする。
・というか所々SetLastErrorすべき所が抜けてる。
0543r
2008/03/22(土) 10:18:47はじめて 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:02EDITコントロールの背景透過表示はできないのでしょうか?
WM_CTLCOLOREDITで
SetBkMode(((HDC)wp), TRANSPARENT);
return (LRESULT)GetStockObject(NULL_BRUSH);
とすれば一応背景透過になりますが、スクロールした場合など、文字部分が再描画されません
0545デフォルトの名無しさん
2008/03/22(土) 10:50:17.Netで書いてるなら、.Netでデバッグ出力すればいいかと
System.Diagnostics.Debug.WriteLineじゃダメなのか?
■ このスレッドは過去ログ倉庫に格納されています