トップページ⇒tech
995コメント264KB

Win32API質問箱 Build87

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/03/28(日) 10:23:58
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんやお姉さんたちが答えてくれるかも。
「知らないならレスしないで下さい。ウザイだけです。 」なんて言わないでねっ!

過去スレ、関連リンクは>>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質問箱 Build86
http://pc12.2ch.net/test/read.cgi/tech/1265350980/
0041デフォルトの名無しさん2010/04/02(金) 10:03:30
定義次第。
0042デフォルトの名無しさん2010/04/02(金) 10:35:51
確実ではないが一般に
mscoreee.dll:_CorDllMain,_CorExeMain系関数をインポートしていればマネージドコードを含む
さらにその他のdllもインポートしている場合マネージド/アンマネージド混在の可能性が高い
何もインポートしていないならマネージド/アンマネージドに無関係なデータ/リソースモジュールの可能性が高い
それ以外の場合はアンマネージドモジュールの可能性が高い

COM参照など間接的な物はほぼ判定不能
0043デフォルトの名無しさん2010/04/02(金) 11:23:59
んー、そうですか。
ちょっとがんばってみます。

マネージドコードで判断するときは
リフレクション使ってファイル読んだときに
アンマネージドであれば例外を出してくれる陽南でかんたんにわかるようなんですけどね。
0044デフォルトの名無しさん2010/04/02(金) 17:57:26
ngenが.netアセンブリの判定やってるから参考にしてみれば
しらんけど
0045デフォルトの名無しさん2010/04/02(金) 19:15:52
フックDLLを書いてるときにふと気になったけど
共有セクションってどこまで適用されるの?ウィンドウステーション?
0046デフォルトの名無しさん2010/04/03(土) 07:01:16
あるプロセスが開いてるファイルハンドルを取得して、強制的にクローズするにはどうすればいいの?
0047デフォルトの名無しさん2010/04/04(日) 23:46:00
質問です。IDE(VC++2008 Express)固有の話なのですが、
とあるクラスを作成後、動作確認中、作成した自作クラスのコンストラクタ内の処理の途中で
ブレイクポイントを仕掛けたのですが、どうもブレイクしてくれません。

※正確には、コンストラクタと、publicメンバ関数の2箇所にブレイクポイントをしかけました。
 しかしコンストラクタのブレイクポイントは無視され、publicメンバの方だけで止まります。

これは仕様なんでしょうか。ご存知の方いらっしゃいましたらよろしくお願いいたします。

0048デフォルトの名無しさん2010/04/04(日) 23:46:53
おい
殺されたいのかお前は
スレタイ100回声に出して読め
0049デフォルトの名無しさん2010/04/05(月) 00:10:28
>>48
ゴメン。しかも自分の勘違いだった
0050デフォルトの名無しさん2010/04/05(月) 00:21:32
まぁまぁ
0051デフォルトの名無しさん2010/04/05(月) 03:49:34
Win32APIじゃ無いかもしれないけど、現在接続しているUSBカメラの焦点距離を知る方法
ってありませんか?
0052デフォルトの名無しさん2010/04/05(月) 06:21:07
はい
0053デフォルトの名無しさん2010/04/05(月) 13:00:20
あります
0054デフォルトの名無しさん2010/04/05(月) 13:14:04
この辺かな
WIA_DPC_FOCUS_DISTANCE/WIA_DPC_FOCAL_LENGTH
0055デフォルトの名無しさん2010/04/05(月) 14:30:07
DOSコマンドのroute printで表示される情報と同じものを取得するAPIを教えてください
0056デフォルトの名無しさん2010/04/05(月) 15:05:38
ありません
0057デフォルトの名無しさん2010/04/05(月) 15:09:28
知らないならレスしないで下さい。ウザいだけです。。。
0058デフォルトの名無しさん2010/04/05(月) 15:20:51
煽っても何も出て来ませんよ
0059デフォルトの名無しさん2010/04/05(月) 15:27:24
http://www.wmifun.net/sample/win32_ip4routetable.html
http://www.geekpage.jp/programming/iphlpapi/
0060デフォルトの名無しさん2010/04/05(月) 15:28:22
scanfで数字を複数受け取るにはどうするの?
0061デフォルトの名無しさん2010/04/05(月) 15:36:40
>>60
>>48
0062デフォルトの名無しさん2010/04/05(月) 15:53:29
>>58
でてきましたよどじ

>>59
ありがとうございますありがとうございます。
あなたは神です。こんな糞まみれのスレで初めてみた神です。
0063デフォルトの名無しさん2010/04/05(月) 15:53:59
知らないならレスしないで下さい。ウザいだけです。。。

0064デフォルトの名無しさん2010/04/05(月) 15:55:04
コンソールプログラムとDOSプログラムを混同するな
0065デフォルトの名無しさん2010/04/05(月) 16:00:05
うるさいブタ共だなあ
0066デフォルトの名無しさん2010/04/05(月) 16:17:46
>>59
これ Win32API じゃないだろ
0067デフォルトの名無しさん2010/04/05(月) 16:59:17
>>66
いや参考になった。
へるぱAPIで取得できました。

しかし、しかし。
Presistent Routesだけ欲しい場合に判断に困ってます。
dwForwardProto辺りで何とか識別できそうかなっておもってたんですがダメっぽいですぅ
0068デフォルトの名無しさん2010/04/05(月) 17:16:27
ttp://www.youtube.com/watch?v=_NO0AdDjMnY
0069デフォルトの名無しさん2010/04/05(月) 17:25:29
っていうか、GetIpForwardTableじゃUSBとかのLANで接続してないとPersistent Routesを取れないや
まあ接続されてないんだからActive Routesに表示されないのは当然なんだが・・・
これPersistent Routesを取得する方法をさっさと教えてください。
0070デフォルトの名無しさん2010/04/05(月) 19:20:14
最近UNC等を調べ始めたものです。

引数やDnDでファイル名を取得するとき、
ローカルのファイルだと C:\file.ext
ネットワーク上のファイルだと \\PCNAME\share\file.ext
で受け取りますよね。

UNCが説明されているあるサイトで \\PCNAME\C:\file.ext
のような表記を見かけたのですが、
(http://e-words.jp/w/UNC.html)
このように取得する方法ってありますか?
0071デフォルトの名無しさん2010/04/05(月) 20:22:01
>>70
管理共有でもなきゃ、その記述が間違い。
0072デフォルトの名無しさん2010/04/05(月) 20:22:28
って見てみたら管理共有じゃん。
0073デフォルトの名無しさん2010/04/05(月) 20:23:25
まずは落ち着け
0074デフォルトの名無しさん2010/04/05(月) 20:28:43
そこのサイトの説明は適当過ぎだな。
偶々Cドライブを「C$」という名前で共有した結果なだけだろうに。
0075デフォルトの名無しさん2010/04/05(月) 20:29:46
XP VC++2008、他プロセスの指定メモリアドレスの内容を見たいのだけど
そのプロセスハンドル取得してReadProcessMemory使ってもうまく表示してくれません
GetLastErrorみたらERROR_ACCESS_DENIEDって出たけどOpenProcessToken等の操作で変わるものでも無いので
どうすれば表示されるのか分からないので教えてください
0076デフォルトの名無しさん2010/04/05(月) 20:35:52
どうすればって、普通にやればできるだろ。
0077デフォルトの名無しさん2010/04/05(月) 20:37:28
単にReadableじゃないのでは
0078デフォルトの名無しさん2010/04/05(月) 20:41:56
単にアドレスがおかしいとか。
0079デフォルトの名無しさん2010/04/05(月) 20:44:24
・ハンドルのアクセス権の問題
・指定アドレスの有効性の問題
・指定アドレスのアクセス権の問題

どれかしかない
0080デフォルトの名無しさん2010/04/05(月) 20:46:23
まとめると、>>75が悪い、ってことだな。
0081デフォルトの名無しさん2010/04/06(火) 11:28:50
ヘルパーAPIでPersistent Routesのリスト取得や追加や削除を教えてえええええええええええ><
Active Routesに対してならできるがそれじゃ意味がないぽ><
0082デフォルトの名無しさん2010/04/06(火) 23:32:12
WMIのWin32_IP4PersistedRouteTableでも使えば
0083デフォルトの名無しさん2010/04/07(水) 04:30:11
アプリの実行環境がコンソールかGUIかってのはAPIとは直接関係ないだろ。
どっちでも同じAPIを呼んで同じ情報が取得できるはず。
0084デフォルトの名無しさん2010/04/07(水) 16:36:08
mmsystem.hをインクルードすると大量のエラーが出てコンパイルできません。
コンパイラはicl 11.0、OSはWindows XP 64bitです。
0085デフォルトの名無しさん2010/04/07(水) 19:09:19
デスクトップのディスプレイの明るさを変えるapiはありませんか?ノートPCならIOCTLのブライトネストでかえれるらしいのですが。osはxpです
0086デフォルトの名無しさん2010/04/07(水) 19:29:55
VGAの色補正ならドライバをリバースエンジニアリングすれば出来ない事もないけど
ディスプレイの調整は、そのインターフェースがあるなんて聞いた事無い
0087デフォルトの名無しさん2010/04/07(水) 19:42:22
ある
0088デフォルトの名無しさん2010/04/07(水) 20:21:20
>>85
Vista以降ならある。
0089デフォルトの名無しさん2010/04/08(木) 08:30:15
ありがとうございます。xpにはやはりなさそうですか。助かりました。
0090デフォルトの名無しさん2010/04/08(木) 12:05:40
FindNextFile() でCドライブ配下の全てのファイルをカウントするだけのプログラムを作成してみました。
PC起動時の初回と2回目以降に実行し他場合、処理速度が100倍ぐらい違うのですが、どうしてでしょうか?
0091デフォルトの名無しさん2010/04/08(木) 12:11:31
Cache
0092デフォルトの名無しさん2010/04/08(木) 12:52:23
WinMainでDialogBoxを呼び出してモーダルダイアログを出します。
そのモーダルダイアログのボタンを押したときモードレスダイアログを出したいのですが、
メッセージループが表面上にないので、IsDialogMessage() 関数を追加する方法が分かりません。
どうようにすればいいでしょうか?
0093デフォルトの名無しさん2010/04/08(木) 13:47:10
メッセージループを追加する
0094922010/04/08(木) 15:51:22
#include <windows.h>

INT_PTR CALLBACK SubProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {
switch (msg) {
case WM_CLOSE:
DestroyWindow(hWnd);
return TRUE;
}
return FALSE;
}

INT_PTR CALLBACK MainProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {
switch (msg) {
case WM_INITDIALOG:
CreateDialog((HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), "SubDLG", hWnd, SubProc);
return TRUE;
case WM_CLOSE:
EndDialog(hWnd, TRUE);
return TRUE;
}
return FALSE;
}

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hprev, LPSTR cmd, int show) {
DialogBox(hInst, "MyDLG1", NULL, MainProc);
return EXIT_SUCCESS;
}

>メッセージループを追加する
どこに追加すればいいでしょう…
0095デフォルトの名無しさん2010/04/08(木) 15:55:17
ダイアログプロシージャ内
それで問題があるならスレッドを起動する
0096922010/04/08(木) 17:15:01
いやその。。。
ダイアログプロシージャ内に入ったときはDispatchMessageが呼ばれているし、
スレッド立てたらメインスレッドのメッセージは読めないと思うんですが。。。

0097デフォルトの名無しさん2010/04/08(木) 17:51:17
>>96
> WinMainでDialogBoxを呼び出してモーダルダイアログを出します。

これを止めて
モードレスダイアログ MainProc側 生成 → メッセージループ (EndDialog() 呼び出しの確認だけ ちょこっと工夫)

メッセージループ内
 MainProc側
  何らかのトリガーで SubProc側生成
0098デフォルトの名無しさん2010/04/08(木) 20:20:06
リモートのIPアドレスからコンピューター名を得る方法ありますか?
自分も相手もWindows(XP以降)です
正しくはコンピューター名じゃなくてUNC名ですが
0099デフォルトの名無しさん2010/04/08(木) 20:21:33
>どこに追加すればいいでしょう…

どこでもいい
君のプログラムにとって必要な場所に追加する

>ダイアログプロシージャ内に入ったときはDispatchMessageが呼ばれているし、

DispatchMessageから呼ばれたプロシジャの中でDispatchMessageを呼んではいけないという規則は無い
自分でイベントループを回すとはそういうこと

>スレッド立てたらメインスレッドのメッセージは読めないと思うんですが。。。

読める
0100922010/04/08(木) 20:28:31
お陰さまで、解決しました。
WinMainのモーダルダイアログを、モードレスにし、自分でメッセージループを回すことで、
サブ側もタブストップ効くようになりました。

ありがとうございました。


0101デフォルトの名無しさん2010/04/08(木) 20:35:06
メッセージループとイベントループってどっちが正しいの?
0102デフォルトの名無しさん2010/04/08(木) 21:14:40
>>101 用語の話ってことなら、win32的にはメッセージループじゃね?
で、そのメッセージって何?って聞かれたなら、それは各種イベントって感じ
0103デフォルトの名無しさん2010/04/08(木) 22:17:25
>98
IPアドレス→MACアドレス→マシン名
ARPとNetBIOS(NBT)とか?
0104デフォルトの名無しさん2010/04/08(木) 22:17:56
イベントループなんて聞いたことないな

イベントで思いつくのはイベントハンドラだな。
0105デフォルトの名無しさん2010/04/08(木) 22:40:33
自己解決しました
0106デフォルトの名無しさん2010/04/08(木) 23:20:09
>>105
解決したときはどうやって解決したか書いておくと
後の人のためになるよ。
0107デフォルトの名無しさん2010/04/08(木) 23:27:10
2chでの「自己解決しました」だけの書き込みは99.9%赤の他人。
0108デフォルトの名無しさん2010/04/09(金) 04:45:12
   ┌─┐
   │●│
   └─┤
   _   ∩
  ( ゚∀゚)彡
┌─┬⊂彡
│●│ おっぱい!おっぱい!
└─┘      おっぱい!おっぱい!
0109デフォルトの名無しさん2010/04/09(金) 05:08:12
SetLayeredWindowAttributesでクライアント領域を透過させて
そこに表示する文字もSetBkModeで透過させることができたんですが
CreateFontで作成した文字列だと文字の周りにデフォルトの背景色が出てしまって
透過できないんですがどうすればいいですか
0110デフォルトの名無しさん2010/04/09(金) 07:35:47
自己解決しました。
0111デフォルトの名無しさん2010/04/09(金) 08:28:52
デフォルトの背景色をα値にするとか
0112デフォルトの名無しさん2010/04/09(金) 09:29:03
http://wisdom.sakura.ne.jp/system/winapi/win32/win21.html
0113デフォルトの名無しさん2010/04/09(金) 09:44:12
ヘルパーAPIでPersistent Routesのリスト取得や追加や削除を教えてくださいよ
0114デフォルトの名無しさん2010/04/09(金) 10:14:13
http://msdn.microsoft.com/en-us/library/aa366071(v=VS.85).aspx
0115デフォルトの名無しさん2010/04/09(金) 10:24:54
いや
何度も書かれている
お前の目が節穴だっただけ

大抵の人はフィルタを通して物(この場合スレの書き込み)を見てしまう
大事なことが書かれていてもそれに気付くためには
本人がそれを受け入れるための準備が必要なんだ
0116デフォルトの名無しさん2010/04/09(金) 10:54:45
>>113 お前まだそれやってたのか
まさか全部人に聞かないと書けない=コピペしか出来ない奴なのか
0117デフォルトの名無しさん2010/04/09(金) 12:10:03
ソケット通信でUDPを使っているのですが
そのときに、ポートを5000を使って送信する時に
srcポートとdstポートが同じになってしまいます。
これをsrcは自動?割り振りでdstが指定したポート番号になる方法を教えてください。
オープンはこんな感じで行っています。
struct sockaddr_in sa;
SocketHandle = ::socket( AF_INET, SOCK_DGRAM, 0 );
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = INADDR_ANY;
sa.sin_port = ::htons( iPort );
::bind( SocketHandle, (struct sockaddr *)&sa, sizeof( sa ) );
0118デフォルトの名無しさん2010/04/09(金) 13:55:33
Yahoo!知恵袋でも聞いているのですが返事がこなさそうなのでこちらでお聞きします。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail.php?qid=1239071767

UnhookWindowsHookExがいくらやっても失敗します。
http://ir9.jp/prog/ayu/datlog/tech_win32api/1069339866/1069339866_02.html
の411のかたも同じ状況だったようですが解決されなかったようですね。
メインプロセスからSetWindowsHookExを呼んで、同プロセス内でUnhookWindowsHookExを解除するところで失敗します。
エラーコードを吐かせてみたところやはりフックハンドルが無効というものでした。
しかし、フックハンドルの値もint型にキャストして吐かせてみたところ、
Set〜から最後までずっと同じ値をとっていました。
フックは正常に作動しているので解除できないと気持ち悪いです。

しかし失敗のメッセージが表示されたあとは、フックが解除されているんです。
さらにキーフックが起こっていない状態でUnhookすると成功するんです。
なんなんでしょうか。。。。
0119デフォルトの名無しさん2010/04/09(金) 14:04:46
>>118
マルチ乙
返事がこなさそうって失礼にも程がある

0120デフォルトの名無しさん2010/04/09(金) 14:08:30
まぁ来ないけどね
0121デフォルトの名無しさん2010/04/09(金) 14:39:57
ahoo!知恵遅れ袋で聞くってアホとしか
01221182010/04/09(金) 14:57:11
フック関連のは何度か質問してるんですがYahoo!知恵袋は一度も返事が来ません。
私の質問履歴にないのは全部そのまま消えていくからですorz
なんでしょうかね。めんどくさいのかわからないのか。
マルチなんぞに返答をくれる方お願いします。

キーイベントが発生したときのみエラーが起きているので、フックプロシージャかなんかに問題でもありますかね?
キーイベントの有無による違いはそれくらいだと思うんですが。
0123デフォルトの名無しさん2010/04/09(金) 15:52:19
>>118
開発環境は?
hHookはどこでどう宣言してる?
0124デフォルトの名無しさん2010/04/09(金) 16:01:20
ぐだぐだほざいてないでさっさと教えやがって下さいよ
0125デフォルトの名無しさん2010/04/09(金) 16:21:32
雑魚しかいないから教えれる奴がいないんだろw
0126デフォルトの名無しさん2010/04/09(金) 16:25:23
なんか数日前から騙って踊れるキチガイが1匹わいてるな
0127デフォルトの名無しさん2010/04/09(金) 16:38:54
16:25:23 にも基地外が沸いてるね
0128デフォルトの名無しさん2010/04/09(金) 17:31:09
ここまで俺の自演
0129デフォルトの名無しさん2010/04/09(金) 17:51:33
↑
2ちゃんの画一的なコメント 乙
0130デフォルトの名無しさん2010/04/09(金) 18:01:47
別の症状だと思うがsmss.exeなど入力のないシステムプロセスにフックしたまま解除不能になった事ならある
case DLL_PROCESS_ATACH:
if (!GetModuleHandle("USER32.DLL") return FALSE;
0131デフォルトの名無しさん2010/04/09(金) 18:07:58
>>118
WM_KEYHOOKのプロシージャでResetHookを呼んでいるんだろうけど
SendMessageしたらいかんだろ。
0132デフォルトの名無しさん2010/04/09(金) 19:05:15
>117
1) bindのsin_portを0にする
2) bindやめてconnect呼ぶ。(後続するsendtoはsendに変える)
1,2の好きな方を選んだら?
0133デフォルトの名無しさん2010/04/09(金) 20:08:04
WM_KEYHOOKを受け取ったウィンドウプロシージャで
何をやってるか示さないと答えようがないわけだが
まぁ>>131の可能性が高そうだけど
0134デフォルトの名無しさん2010/04/09(金) 23:24:48
ドライブレターからフロッピードライブか否かを判別する方法はないですか?
GetDriveTypeではリムーバブルって返って来るだけで、フロッピーではないかも知れませんし、
SetupDiEnumDeviceInfoとSetupDiGetDeviceRegistryPropertyでQueryDosDeviceで得た文字列と同じものを探して関連付けようと試みましたがヒットしないです...。

QueryDosDeviceでは"\Device\Floppy0"が返って来ましたが、SetupDiGetDeviceRegistryPropertyではフロッピー系は"\Device\FloppyPDO0"が見つかっただけでした
0135デフォルトの名無しさん2010/04/09(金) 23:41:09
フロッピーはAドライブだろ常考
01361182010/04/09(金) 23:58:31
>>135
ん?ドライブレター変えたらどうすんの???
責任取れるの?

0137デフォルトの名無しさん2010/04/10(土) 02:26:34
>>136
なんだてめぇ
01381342010/04/10(土) 03:20:14
なんかDeviceIoControlとIOCTL_DISK_GET_MEDIA_TYPESで簡単に識別できるみたいです ノシ
0139デフォルトの名無しさん2010/04/10(土) 08:58:46
思いつきの裏技だがシェルアイコンのインデックスで判定するとかw
0140デフォルトの名無しさん2010/04/10(土) 14:15:55
HKEY_LOCAL_MACHINE\SYSTEM\MountedDevicesを開いて
\DosDevices\〜からパス取り出して
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enumからそのパスを開いて
ClassGUIDとかで区別できると思うけど

>>135
ねぇPC98版Windowsって知ってる?
0141デフォルトの名無しさん2010/04/10(土) 14:17:58
Windows3.x 以前のは Windows じゃないことにしておこう
■ このスレッドは過去ログ倉庫に格納されています