トップページ⇒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/
0497118 ◆ayPjxbmM2c 2010/05/02(日) 00:17:53
あるわけないだろ。
0498デフォルトの名無しさん2010/05/02(日) 00:25:43
知識ないから質問するだけ無駄
0499デフォルトの名無しさん2010/05/02(日) 00:27:50
ただのキチガだから触れるな
0500デフォルトの名無しさん2010/05/02(日) 00:30:03
GetWindowPlacement - 通常、最小化、最大化の位置情報
GetClientRect - クライアント領域の位置情報
GetWindowRect - ウィンドウ領域の位置情報
0501デフォルトの名無しさん2010/05/02(日) 01:52:03
GetWindowPlacement - 各ウィンドウ情報取得
GetClientRect - クライアント上に描画している矩形を取得
GetWindowRect - ウィンドウ上に描画している矩形を取得
05021182010/05/02(日) 03:17:58
あなたは知らないのですか?
05031182010/05/02(日) 08:58:19
<おみやげ>が<のらドワーフのさと>にあることを。
0504デフォルトの名無しさん2010/05/02(日) 10:14:26
複数のウィンドウ(AとBと略)を最前面表示にしてるんだが
Aは常に最前面、しかしBは更にAより最前面って出来ない?
0505デフォルトの名無しさん2010/05/02(日) 10:16:20
可。
0506118 ◆ayPjxbmM2c 2010/05/02(日) 10:44:32
質問文にすでに矛盾があるんだが。
0507デフォルトの名無しさん2010/05/02(日) 11:30:06
悔しいが >>506 の突っ込みでワロタ
0508デフォルトの名無しさん2010/05/02(日) 12:46:07
おれは読解力の無さに呆れた
0509118 ◆88ZPSwqsm6 2010/05/02(日) 12:58:18
AをBのオーナーにしとけばいいな。
0510デフォルトの名無しさん2010/05/02(日) 13:09:46
それだとオーナー関係にしないと駄目じゃない?
0511デフォルトの名無しさん2010/05/02(日) 13:11:19
途中で送信してしまったorz

オーナーにせずに解決策ってある?
0512デフォルトの名無しさん2010/05/02(日) 13:22:24
それしかないとも言う。
アプリのメッセージボックスの自己主張が激しかった
Win95/NT4.0時代の悪夢を繰り返さないための仕様。
0513デフォルトの名無しさん2010/05/02(日) 13:26:59
>>504
適当なイベント(Activateなど)をトリガに
毎回EnumでZオーダーをチェックし
BがAの背面に回っていたら
A、Bの順にTopmostする
0514デフォルトの名無しさん2010/05/03(月) 03:38:49
winapiで立方体の表示はできないの?
0515デフォルトの名無しさん2010/05/03(月) 03:42:03
やろうと思えばできる。自分で計算して描画すれば。
DrawCube みたいな関数をイメージしてるなら、そんな物は無い
05161182010/05/03(月) 04:19:42
>>514
3D->2D変換

typedef struct type3d {
float x,y,z;
} POINT3D;

typedef struct type2d {
float x,y;
}

void convert3dto2d(p3 *POINT3D, p2 *POINT2D)
{
float vp = 0.7;

p2->x = p3->x * (vp / p3->z);
p2->y = p3->y * (vp / p3->z );
}
0517デフォルトの名無しさん2010/05/03(月) 04:56:57
↑
何言語?
糞いい加減なレスすんなや、ボケ
0518デフォルトの名無しさん2010/05/03(月) 05:10:26
>>516
滅茶苦茶過ぎてワロタ
0519デフォルトの名無しさん2010/05/03(月) 10:31:17
あるゲームを解析したいと考えています
どうやるかというとHPが100以下になったら回復アイテムを
自動で使うというものを作りたいです

そこで、起動しているexeのメモリの内容を参照するAPIって
何があるのでしょうか?
0520デフォルトの名無しさん2010/05/03(月) 10:39:31
坊やはお帰り
0521118 ◆1oKmZSIAF. 2010/05/03(月) 10:43:46
ReadProcessMemory()
0522デフォルトの名無しさん2010/05/03(月) 11:35:11
いつから釣りだらけのスレになったのか
元からかw
0523デフォルトの名無しさん2010/05/03(月) 12:59:13
         \   ∩─ー、    ====
           \/ ● 、_ `ヽ   ======
           / \( ●  ● |つ
           |   X_入__ノ   ミ   そんな餌で俺様が釣られクマ――
            、 (_/   ノ /⌒l
            /\___ノ゙_/  /  =====
            〈         __ノ  ====
            \ \_    \
             \___)     \   ======   (´⌒
                \   ___ \__  (´⌒;;(´⌒;;
                  \___)___)(´;;⌒  (´⌒;;  ズザザザ
0524デフォルトの名無しさん2010/05/03(月) 18:01:45
特定のプロセスのみ、ShellExecute() のプログラムの検索パスを変更することは可能でしょうか?
SetEnvironment() で path を新たに設定しなおして、その後 ShellExecute() を実行してみたんですが
古いパスしか見てくれないようで困っています
0525デフォルトの名無しさん2010/05/03(月) 18:06:17
>>524
環境変数を継承するオプション無かった?なかったら、CreateProcessでごにょごにょする。
0526118 ◆4BcWhWACFc 2010/05/03(月) 18:06:47
なんか勘違いしてるような気がする。

もう少し具体的にやりたいことと、やってみたことを説明してみ。
0527デフォルトの名無しさん2010/05/03(月) 19:29:35
524です
notepad.exe とか memo.txt とかのファイル名が書かれたテキストファイルを読み
適当なタイミングでそのプログラムをShellExecuteで起動する32ビットアプリを作っています
64ビット環境下で動く時に、%SystemRoot%\Sysnative を優先して実行ファイルの探索パスとして使えると、
64ビット版のアプリが起動できるのではないかと思い実装を試みていました
多分、ShellExecute のパスを変えるには、親玉の explorer.exe の環境変数を変更しないとだめで、
そこを書き換えている期間は他のアプリにも影響が出てしまうのでこの方針はまずそうです
素直に64ビット版のShellExecuteのプロセスを用意しようと思います
0528118 ◆4BcWhWACFc 2010/05/03(月) 19:35:37
それ、環境変数関係ないだろ。フォルダリダイレクションだし。
素直に、フルパスで起動すればいいんじゃね?
0529デフォルトの名無しさん2010/05/03(月) 19:51:42
実行ファイルだけならCreateProcessなどでフルパス指定で呼べばいいんですが
memo.txt や a.bat のようなファイル名指定による ShellExecute でSystem32配下のアプリが呼ばれるときの挙動を変えたかったんです
0530118 ◆4BcWhWACFc 2010/05/03(月) 19:56:27
exe以外なら、FindExecutableで関連づけられたアプリを取得して、
必要に応じてSysnativeにパスを変えて、CreateProcessすればいいだろ?
0531デフォルトの名無しさん2010/05/03(月) 19:58:29
おれの周りにも最近64がちらついてきた
面倒な世の中になってきたなあ
05321182010/05/03(月) 20:12:45
>>531
ニンテンドウ64
0533デフォルトの名無しさん2010/05/03(月) 20:53:44
>>530
これでいけそうです。ありがとうございます!
0534デフォルトの名無しさん2010/05/04(火) 13:31:49
x86向けとx64向けの両方のバイナリをはき出すにあたって
ソースコードを同一にする方法って言うか注意事項って言うか
そういうのがまとまったサイトってないのかな。
0535デフォルトの名無しさん2010/05/04(火) 13:36:35
これやらなけりゃ問題ない。
void* p;
int a=(int)p;
0536118 ◆tfxvx8WXZ2 2010/05/04(火) 13:42:38
ポインタサイズだけだからな・・・。
0537デフォルトの名無しさん2010/05/04(火) 13:45:08
if (sizof(int) != sizof(int*)) {
#error 無理です。
}
0538デフォルトの名無しさん2010/05/04(火) 14:13:04
>>537
それじゃ常にエラー出るだろw
0539デフォルトの名無しさん2010/05/04(火) 14:21:17
確かに常にエラー出るなw
0540デフォルトの名無しさん2010/05/04(火) 15:44:10
x64でビルドしようかと思ってたけどノートパソで走らなくなるからx86にしたことがある。
0541デフォルトの名無しさん2010/05/04(火) 21:26:09
ソースはともかくバイナリを同一にしたい
副次ストリームとか使ってなんとか一緒にできないものか
foo.exe(32ビット版) が起動た時OSが64ビットだったら foo64.exe を呼び出す、みたいな間抜けなやり方しか思いつかん
0542デフォルトの名無しさん2010/05/04(火) 21:43:04
>>541
PEフォーマットが複数バイナリを格納できない以上、それは無理ってもんでしょ。
0543118 ◆tfxvx8WXZ2 2010/05/04(火) 22:08:22
>>541
SysInternalのツールとかは、そういう風にやってるね。
0544デフォルトの名無しさん2010/05/04(火) 22:11:35
Visual Studio には spy ツールがありますよね
あれって、たとえば、特定のEXEにあたっちすることまでは
わかったのですが、
そのEXEが発行するAPIとか取得できるのかな?

やりたいことは、
EXEがあり、このEXEは、Widnowsのハードウエアにかかわる
DLL(API)を使っています。
このdevice.dll に対して、どのようなAPIが発行を要求したかしらべたいのです。
0545デフォルトの名無しさん2010/05/04(火) 22:13:03
何故かコクヨのノートに書かれた夏休みの絵日記が浮かんだ
0546118 ◆uKObk31oqA 2010/05/04(火) 22:16:02
SPY++は、メッセージのやりとりを確認するツール。
API呼び出しを確認したければ、API Monitorかデバッガでアタッチ、
あるいは、ラッパ生成ツールでも使うことになる。

詳細はググレ。
0547デフォルトの名無しさん2010/05/04(火) 22:16:52
>>544
昔、dependency walkerってのがあったけど、
今もあんの?
0548デフォルトの名無しさん2010/05/04(火) 22:20:10
横から >>544 を書き直すと、

今手元に、とある dll とそれを利用している exe があります。
この dll について、公開されている関数の中で、この exe が
今どの関数を使用しているかを知る方法はありませんか?
ご教示の程よろしくお願い致します。

こんな感じか
0549118 ◆uKObk31oqA 2010/05/04(火) 22:24:30
>>547
VSには含まれなくなったけど、フリーのやつが落とせる。
05505472010/05/04(火) 22:40:32
>>549
探してみる
0551デフォルトの名無しさん2010/05/04(火) 22:46:49
Volume Shadow Copy Serviceを使って使用中のファイルのコピーをしたいのですが
どこかに良いサンプルありませんか
0552デフォルトの名無しさん2010/05/04(火) 22:55:31
今手元に、とあるWindows で準備されている、 dll とそれを利用している exe(他社開発 VisualC++で) があります。
この dll について、公開されている関数の中で、この exe が
今dllのどの関数を使用しているかを知る簡単な方法はありませんか?

イメージ的には、他社開発のアプリ上のボタンを押したら、
どのDLLのどの関数を呼び出したかを知りたいです。

アプリ上にそういったトレースファイルをはく使用であればいいのですが、
そういう使用がないので、なんらかの方法で知りたいと思います。

ご教示の程よろしくお願い致します。
0553118 ◆uKObk31oqA 2010/05/04(火) 23:00:19
インポートリンクされてれば、Dumpbin /IMPORTS でインポートしてる関数はわかる。
何かをした時点で、ってことであれば、>>546
0554デフォルトの名無しさん2010/05/05(水) 01:40:43
>>546


>>553

>SPY++は、メッセージのやりとりを確認するツール。
>API呼び出しを確認したければ、API Monitorかデバッガでアタッチ

情報ありがとうございます。
API モニター等調べています。

Win32とは直接関係ないですが、上の”メッセージ”とありますが、
現在Visual C++ 2008 のフォームアプリを勉強しているのですが、
ほとんど、(昔のVBみたいで、)あまり、メッセージがでてきません。
この理由というのがいまいちよくわかってないのですが、なにかヒントありますでしょうか?
0555118 ◆uKObk31oqA 2010/05/05(水) 01:41:59
それは C++/CLI だからだろ。
普通にWin32アプリを作れば、嫌でも出てくるよ。
0556デフォルトの名無しさん2010/05/05(水) 01:51:36
>>555

2ch、やっぱり、すごい、疑問がすぐ解決する。。
0557デフォルトの名無しさん2010/05/05(水) 02:09:49
Win32 API /Win XP Sp3 での総数はいくらぐらいなのでしょうか?
ネットでさがしてもわかりませんでした。
また、そのリスト等、ネットにありますでしょうか?
0558118 ◆1oKmZSIAF. 2010/05/05(水) 02:13:54
ない。
0559デフォルトの名無しさん2010/05/05(水) 02:19:56
全部のヘッダ覗いて数えれば確実
・・・そもそもどこまでを指してwin32APIと呼ぶのかって話もあるが
0560デフォルトの名無しさん2010/05/05(水) 02:32:23
system32にあるdllの各エクスポート数を調べるとか
0561デフォルトの名無しさん2010/05/05(水) 02:44:11
>>556
暇な廃人が常駐してるからな
0562デフォルトの名無しさん2010/05/05(水) 03:02:06

>560 :デフォルトの名無しさん:2010/05/05(水) 02:32:23
>system32にあるdllの各エクスポート数を調べるとか

このDLLのエキスポート数についてもう少しわかりやすく解説願えないでしょうか?

DLLはAPIを集めた、関数群であるあたり、までは理解しております。
0563118 ◆1oKmZSIAF. 2010/05/05(水) 03:11:55
とりあえず、Dumpbin /EXPORTS してみれば?
0564デフォルトの名無しさん2010/05/05(水) 03:16:27
>>563
ありがとう。DLL内の情報が得られる EXEが、VSにあるみたいですね!
いろいろ読んで試してみます。

ttp://www.crystal-creation.com/software/technical-information/programming/dotnet/dotnet-compact-framework/cpp-dll.htm
0565デフォルトの名無しさん2010/05/05(水) 03:17:58
そもそもなんでそんなリストが必要なのかと
マイクロソフト出版か何かが出してた鬼みたいな厚さのAPI本でも多分全部網羅はしてなかったような
あと、箱入りVCにはレンガくらいの厚さがあるAPI本入ってるけど
0566デフォルトの名無しさん2010/05/05(水) 03:40:12
DLLがエクスポートしていても、非公開扱いだったり、
APIといいつつ、単なるマクロでDLLではエクスポートされていない場合もあるよ。
諦めたほうがいい。
0567デフォルトの名無しさん2010/05/05(水) 08:10:41
名前だけ分かっても手が出ないし
DNSAPIとか
0568デフォルトの名無しさん2010/05/05(水) 08:52:28
>>567
DNSAPI.dll のことか?

普通に MSDN 見ればわかると思うが...
http://msdn.microsoft.com/en-us/library/ms682100(v=VS.85).aspx
0569デフォルトの名無しさん2010/05/05(水) 09:01:53
DnsGetCacheDataTableとかどこ探しても載ってないもんよ
0570デフォルトの名無しさん2010/05/05(水) 16:29:20
まあ、非公開のエクスポートはあるだろう。
DnsGetCacheDataTable なんて、どう見ても内部向けだろうし。
0571デフォルトの名無しさん2010/05/05(水) 20:39:12
そもそも非公開ってどうやって判別するのよ
0572デフォルトの名無しさん2010/05/05(水) 21:05:42
ドキュメントも読まずに判断なんて出来ないと思うの
そしてそれが何かの説明も読まずに使うバカはいないと思うの
0573118 ◆1oKmZSIAF. 2010/05/05(水) 21:25:31
ときたまいるけどね。MSDNを見ないで、どっかの素人サイト見てるようなやつ。
0574デフォルトの名無しさん2010/05/05(水) 22:20:21
MSDNも日本語のサイトは糞だな
英語のMSDN見ないと話にならない
05751182010/05/06(木) 02:30:04
>>574
お前K&Rも原著じゃないとっていうタイプだろ?
融通がきかない頭が固い
死後硬直かよ
0576デフォルトの名無しさん2010/05/06(木) 02:34:51
>お前K&Rも原著じゃないとっていうタイプだろ?

そのとおりです
よくわかりましたね
0577デフォルトの名無しさん2010/05/06(木) 03:02:36
英語版見た方がいいのは事実じゃないの
日本語版だとバッファサイズがヌル文字含むのかとか書いてないことがあるし
0578デフォルトの名無しさん2010/05/06(木) 06:15:06
日本語版は、関数呼び出しに必要な構造体や関数ポインタ型へのリンクが
なくて使いづらいんだよな。
0579デフォルトの名無しさん2010/05/06(木) 06:53:21
WS_SIZEBOXだと境界線が出るんですが
クライアント領域がサイズ変更可能で境界線を持たないウインドウはどうすれば作成できますか?
0580デフォルトの名無しさん2010/05/06(木) 08:19:26
そういう場合はサイズ変更は自分でやる
0581デフォルトの名無しさん2010/05/06(木) 09:05:15
他のウィンドウが自分のウィンドウに重なってるかを調べる方法って
定期的に列挙してZオーダーの確認するしかない?
0582デフォルトの名無しさん2010/05/06(木) 09:12:53
Zオーダーの確認でも分からない場合があります
0583デフォルトの名無しさん2010/05/06(木) 09:14:42
自分のウィンドウのZオーダー間、ウィンドウのスクリーン座標を取って被ってるかの確認かな
他のあるかい?
0584デフォルトの名無しさん2010/05/06(木) 09:23:38
1ピクセルラインのリージョン採って無効確認
0585デフォルトの名無しさん2010/05/06(木) 09:40:43
子プロセスを作る時に不可視で作るのはどうすればいい?
0586デフォルトの名無しさん2010/05/06(木) 10:02:04
>>575
>>279-285を読んでもそう言うなら*馬鹿*以外の何物でもない。

> 解説
> CreateFile が返したオブジェクトハンドルを閉じるには、 関数を使います。
0587デフォルトの名無しさん2010/05/06(木) 10:10:59
質問です。
ファイルコピーをする場合、
・fopen_s等で開いて、自力でコピー
・system("copy を使う
があると思いますが、
エクスプローラーのコピーを、プログラムから気軽に使う方法はないでしょうか?

ファイルのコピー経過(今どれくらいコピーが終わったか)などを表示するのが目的です。
0588118 ◆1oKmZSIAF. 2010/05/06(木) 10:14:42
>>587
SHFileOperation
0589デフォルトの名無しさん2010/05/06(木) 10:31:15
>>588
ありがとうございます
ばっちりでした
0590デフォルトの名無しさん2010/05/06(木) 14:05:46
>>585
綺麗な手では無理

どろくさくやるなら
 CreateProcess → 戻りのプロセスID取得
 ウィンドウ列挙して、GetWindowThreadProcessId でプロセスID取って一致したら
 ShowWindow(SW_HIDE) する
こういう手順になるかな?
0591デフォルトの名無しさん2010/05/06(木) 14:10:25
>585
関数を使います。
0592デフォルトの名無しさん2010/05/06(木) 14:39:00
>>591
自分で答えいってるがな
0593デフォルトの名無しさん2010/05/06(木) 15:33:50
>>585
STARTUPINFOのwShowWindowにSW_HIDE指定すれば済む話じゃなくて?

ちなみに、プロセスが作成されて最初のShowWindowはSTARTUPINFOで
状態が指定されていれば、それが強要される。
0594118 ◆1oKmZSIAF. 2010/05/06(木) 15:37:16
その指定が有効にならないアプリはごまんとある、って話でしょ。
0595デフォルトの名無しさん2010/05/06(木) 15:44:42
>>593
そのアプリが最初に呼び出すShowWindowがSW_DEFAULTだかなんだかっての指定してないと効かない
0596デフォルトの名無しさん2010/05/06(木) 15:46:16
WinMain からいきなり DialogBox で窓駆動するようなのは
STARTUPINFO 効かないんじゃないかな
■ このスレッドは過去ログ倉庫に格納されています