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

Win32API質問箱 Build34

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

  ∧_∧
 ( ´∀`) < 0x22

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

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

-前スレ
Build33:http://pc8.2ch.net/test/read.cgi/tech/1120153520/
0232デフォルトの名無しさん2005/08/10(水) 20:12:04
>>231
スクロールバーを、モードレスダイアログボックスに配置しては?
0233デフォルトの名無しさん2005/08/10(水) 23:11:27
どうでもいいけどクメイの間違いだからレバーと言うのやめれ
0234デフォルトの名無しさん2005/08/10(水) 23:21:25
>>231
親ウインドウの背景を再描画しないようにすれば解決する…はず。
0235デフォルトの名無しさん2005/08/11(木) 07:55:48
CriticalSectionで同期をとる場合、
既にロックされているかどうかを
処理を止めずに知るにはどうすれば良いのでしょうか?
0236デフォルトの名無しさん2005/08/11(木) 08:21:19
>>235
TryEnterCriticalSection

MSDNよめばEnterCriticalSectionからリンク貼られているぞ。
0237デフォルトの名無しさん2005/08/11(木) 08:30:00
すみません、説明不足でした。
既にロックされているかどうかを、処理を止めずに、かつロックせずに知りたいのです。
0238デフォルトの名無しさん2005/08/11(木) 08:33:33
>>237
むり。
クリティカルセクションでやりたければ、
TryEnter〜で確かめて、自分がクリティカルセクションつかんだら、
すぐにLeave〜するぐらいなもの。
0239デフォルトの名無しさん2005/08/11(木) 08:39:39
そうですか…。Try&Leaveだとコストが高いですね。
Mutexの方を検討してみます。ありがとうございました。
0240デフォルトの名無しさん2005/08/11(木) 08:47:53
似たようなもんですが
0241デフォルトの名無しさん2005/08/11(木) 08:48:06
ミューテックスだと遅いがな……。
0242デフォルトの名無しさん2005/08/11(木) 09:51:50
>>233
レバーってrebar controlのことか!
0243デフォルトの名無しさん2005/08/11(木) 11:53:40
手動リセットイベント使った方がよくね?
0244デフォルトの名無しさん2005/08/11(木) 12:14:58
>>237
>既にロックされているかどうかを、処理を止めずに、かつロックせずに知りたいのです。

それってあまり役に立たないAPIだと思う。
APIから戻ってきて次のコードを実行するときには
もうロックの状態が変更されてるかも知れないわけだし
0245デフォルトの名無しさん2005/08/11(木) 12:47:22
こんにちは、

プリプロセッサによる条件文を記述しようとしているのですが、
Windows環境でのビルドだと、指定したインクルード(#include "MyWinApp.h")がされるようにしたいのです。
プリプロセッサに何をしていすればいいのでしょーか?

よろしくお願いします。

#ifdef ?
#include "MyWinApp.h"
#else
#include "MyApp.h"
#endif
0246デフォルトの名無しさん2005/08/11(木) 12:54:15
>>245
どのコンパイラか言わないのに答えられるわけがない。
というか普通そういうコンパイラ依存の特殊なのは、コンパイラ付属のヘルプに書いてあるもんだが。
0247デフォルトの名無しさん2005/08/11(木) 13:00:22
>>246
失礼しました。
開発環境はVCです。
0248デフォルトの名無しさん2005/08/11(木) 13:13:19
好きなの選べ。
ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_predir_preprocessor_directives.asp

_WIN32とか_MSC_VERあたりかな。
0249デフォルトの名無しさん2005/08/11(木) 13:13:56
ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_predir_predefined_macros.asp
ちがった、こっちな。
0250デフォルトの名無しさん2005/08/11(木) 13:14:03
>>245
マルチすなや。移動するなら断ってからに汁。
つーか、どうしてWin32APIの問題だと思ったんだ? 更にスレ違いだがね。

>>246
スレ違いなんだからぬるーしる。
0251デフォルトの名無しさん2005/08/11(木) 13:30:00
>>247
VCスレ池
0252デフォルトの名無しさん2005/08/11(木) 17:49:48
>>235

察するに、CriticalSectionで囲まれた部分が何か重い処理を必要としていて、
もしこの部分を他のスレッドが使用していたら、待つのに時間がかかるから
他のスレッドはその処理を実行するのを一時あきらめよう、っていうことかな?

bool g_bEnter = false;
void f1()
{
EnterCriticalSection(&cs);
bEnter = true;

bEnter = false;
LeaveCriticalSecion(&cs);
}
void f2()
{
EnterCriticalSection(&cs);
bEnter = true;

bEnter = false;
LeaveCriticalSecion(&cs);
}
としときゃ、bEnterを調べることによってロックされているかわかるんじゃない?
まあ多少穴はあるが、用は足りるのでは?
0253デフォルトの名無しさん2005/08/11(木) 18:06:39
長時間ロックするリソースを複数のスレッドで触るのは良くないです。
スレッド分割の設計を見直したほうがいいと思う。
0254デフォルトの名無しさん2005/08/11(木) 18:22:13
スレ違いですが、シューティングゲームを作ろうと思っています。
WM_TIMERの時に最小限の範囲(rect)をInvalidateRectして
WM_ERASEBKGNDも使ってます。
しかし、それでもちらつきがとれません。
どうすればいいでしょうか?
0255デフォルトの名無しさん2005/08/11(木) 18:23:50
GUIなどを担当するプライマリスレッドがあって、
プライマリスレッドがワーカースレッドを作って何か処理させる、というモデルなんじゃないの?
ワーカースレッドがひとつ動いてる間は、新たなワーカースレッドを作って処理させるためのボタン
なりメニューなりをDisableにして禁止したい、というケースじゃないかと想像してるんだが。
これは普通に、あっていいと思うけど。
0256デフォルトの名無しさん2005/08/11(木) 18:26:13
>>254
スレ違いといいつつ書き込む馬鹿に教える事など無い
0257デフォルトの名無しさん2005/08/11(木) 18:27:42
まあまあ。
>>254
それはゲーム屋(俺は違うが)はみんな知ってるダブルバッファリング処理をしてないからだね。
ゲームならWind32APIを直接使わずに、DirectX9.0c SDKを使う方がいいと思うよ。
0258デフォルトの名無しさん2005/08/11(木) 18:29:43
スレ違いというより鼬害。
02592542005/08/11(木) 18:53:35
>257
�dクス。ついにDirectXか
0260デフォルトの名無しさん2005/08/11(木) 19:13:14
ついにDirectXか
ついにDirectXか
ついにDirectXか
ついにDirectXか

今更DirectXか、だろ
0261デフォルトの名無しさん2005/08/11(木) 19:32:13
Win32API を使用して、WindowsNTのIPアドレスを自動変更する
プログラムを作成したいのですが、IPアドレスエディットコントロールで
どうしてもIPを拾えず、変更も出来ません。
何かうまい方法はないでしょうか?

0262デフォルトの名無しさん2005/08/11(木) 19:34:12
IPアドレスエディットコントロールは、
ただ、ネットワークの設定画面なんかでよくある
IPアドレス入力に特化したエディットコントロールってだけですから
0263デフォルトの名無しさん2005/08/11(木) 19:38:38
>>255
じゃぁロックの設計が良くない。

本当にロックしないといけないのは、
ワーカースレッドが触っている対象物ではなく、
ワーカースレッドが動いているかどうかを管理している部分だろう。
02642612005/08/11(木) 19:40:23
ちょっと聞き方が悪かったです==;
2000やXPではIP取得し変更をかけられたんですが
NTで使える命令が知りたかったのですが・・
02652632005/08/11(木) 19:41:01
管理している部分で、アトミックな操作が必要な部分だけをロックする。
そうすりゃ、ロック待ちの時間はとても短くなるでしょ。
0266デフォルトの名無しさん2005/08/11(木) 19:49:55
よくわからないが、ひょっとすると、WindowsのIP変更ダイアログを
自動で出現させて、そこのIPアドレスエディットコントロールを弄る、という
話なのか?
02672612005/08/11(木) 20:01:01
NTで下記の命令が使えないみたいです。

NicSet.IpAddress
NicSet.IpSubnet
NicSet.DefaultIpGateway
NicSet.DNSServerSearchOrder

NTでは無理なのでしょうか?
0268デフォルトの名無しさん2005/08/11(木) 20:16:02
.NETか
0269デフォルトの名無しさん2005/08/11(木) 20:23:46
>>267
よーわからんが、本当にNicSetってWin32APIの一部なの?
MSDNで検索してもそれらの関数ひとつもヒットしないんだが。
0270デフォルトの名無しさん2005/08/11(木) 20:43:35
WMIだべ。
0271デフォルトの名無しさん2005/08/11(木) 20:45:16
>>237
そういう API があるかどうか以前に、本質的に無理だろ?
「ロックされていない」という返却値を受け取った直後にロックされたらどうするんだよ
0272デフォルトの名無しさん2005/08/11(木) 20:47:35
>>269
NicSetはインスタンス名だろう
ググったら同じ名前で宣言しとるVBソースとかあったし
そんなとこから引っ張ってきてんじゃないか?

>>267
ち な み に API で は あ り ま せ ん
0273デフォルトの名無しさん2005/08/11(木) 20:56:52
WMIって便利な仕組みをWIN2Kで実装したんで使って〜
って2000が出てきたときにMS方面から聞いた記憶がある。
0274デフォルトの名無しさん2005/08/11(木) 21:08:44
まぁ、動かん言うことはNTには無いということだろう
0275デフォルトの名無しさん2005/08/12(金) 07:32:31
意味不明のコンパイルエラーがでると思ったら
richedit.hに
#define wReserved wEffects
の一文が
0276デフォルトの名無しさん2005/08/12(金) 10:37:43
OSが勝手に開放してもかまわないようなメモリ領域をアロケートすることってできないですか?
どうでもいい高速化のためのキャッシュデータに使ったりして
スワップしそうならその領域を勝手に開放して新規の確保には失敗するとか。
0277デフォルトの名無しさん2005/08/12(金) 10:45:57
>>276
キャッシュ用のメモリは、
確保する最大サイズを指定した独自のヒープから確保するようにすれば?
0278デフォルトの名無しさん2005/08/12(金) 10:53:14
あるかないか、あるならなんというAPIかという質問なんですが。
0279デフォルトの名無しさん2005/08/12(金) 10:54:47
>>276>>278
そういったものはない。
0280デフォルトの名無しさん2005/08/12(金) 10:55:34
ヤバイ。winAPIヤバイ。まじでヤバイよ、マジヤバイ。
winAPIヤバイ。
まず広い。もう広いなんてもんじゃない。超広い。
広いとかっても
「東京ドーム20個ぶんくらい?」
とか、もう、そういうレベルじゃない。
何しろ無限。スゲェ!なんか単位とか無いの。何坪とか何?fとかを超越してる。無限だし超広い。
しかも膨張してるらしい。ヤバイよ、膨張だよ。
だって普通は地球とか膨張しないじゃん。だって自分の部屋の廊下がだんだん伸びてったら困るじゃん。トイレとか超遠いとか困るっしょ。
通学路が伸びて、一年のときは徒歩10分だったのに、三年のときは自転車で二時間とか泣くっしょ。
だから地球とか膨張しない。話のわかるヤツだ。
けど宇宙はヤバイ。そんなの気にしない。膨張しまくり。最も遠くから到達する光とか比較してもよくわかんないくらい遠い。ヤバすぎ。
無限っていたけど、もしかしたら有限かもしんない。でも有限って事にすると
「じゃあ、宇宙の端の外側ってナニよ?」
って事になるし、それは誰もわからない。ヤバイ。誰にも分からないなんて凄すぎる。
あと超寒い。約1ケルビン。摂氏で言うと−272℃。ヤバイ。寒すぎ。バナナで釘打つ暇もなく死ぬ。怖い。
それに超何も無い。超ガラガラ。それに超のんびり。億年とか平気で出てくる。億年て。小学生でも言わねぇよ、最近。
なんつっても宇宙は馬力が凄い。無限とか平気だし。
うちらなんて無限とかたかだか積分計算で出てきただけで上手く扱えないから有限にしたり、fと置いてみたり、演算子使ったりするのに、
宇宙は全然平気。無限を無限のまま扱ってる。凄い。ヤバイ。
とにかく貴様ら、宇宙のヤバさをもっと知るべきだと思います。
そんなヤバイ宇宙に出て行ったハッブルとか超偉い。もっとがんばれ。超がんばれ。
0281デフォルトの名無しさん2005/08/12(金) 10:57:29
宇宙のままになっている所を直せよ。
0282デフォルトの名無しさん2005/08/12(金) 11:19:40
こんにちは

リッチエディットでSetOptions(ECOOP_OR,ECO_NOHIDESEL);を指定すると、
スクロールバーの表示がおかしくなるのですが、
このような不具合をご存知な人はいますか?
0283デフォルトの名無しさん2005/08/12(金) 11:55:46
>>278
キャッシュに使ってる最中にOSが勝手に解放したらどうなるのか考えたら
そんなものがあるわけないことくらい分かるだろ
0284デフォルトの名無しさん2005/08/12(金) 12:30:49
だよな
02852822005/08/12(金) 12:55:38
あげますあげます
0286デフォルトの名無しさん2005/08/12(金) 12:59:12
こめんとああうしろあうしろあう
0287デフォルトの名無しさん2005/08/12(金) 16:46:13
pMsgBox = GetProcAddress(LoadLibrary("user32.dll"),"MessageBoxA");

このように一度ロードしたDLLを開放せず何度もロードを繰り返して大丈夫でしょうか?
同じDLLでLoadLibraryを繰り返し実行してみたところ何度実行してもインスタンスハンドルが変わらなかったので、
一度メモリにロードされたものは再度ロードしようとしても実際はロードされないのだと思いますが・・・。
0288デフォルトの名無しさん2005/08/12(金) 17:15:12
C/C++プログラマは、大丈夫と明言されていない場合は危険性があって当たり前と覚悟するクセをつけること。
0289デフォルトの名無しさん2005/08/12(金) 17:30:17
ロジとかM$のマウスについてるチルトホイールの左右は検出できませんか。
point32解析するしかないのかなぁ
0290デフォルトの名無しさん2005/08/12(金) 17:40:05
>>288
�dクス。
エラー処理は手抜きせず呼んだあとはちゃんと開放するようにします。
0291デフォルトの名無しさん2005/08/12(金) 18:17:43
CreateToolhelp32Snapshotだとsvchostとかのフルパスは取得出来ないのですか?
エクスプローラが親プロセスになってるプログラムなら取得出来るのですが…。
0292デフォルトの名無しさん2005/08/12(金) 19:30:36
>>287
既にロード済みであることがわかっている場合はGetModuleHandle()。
LoadLibrary()とFreeLibrary()は参照カウンタを使っているとAdvanced Windowsに書いてあったような気がする。
0293デフォルトの名無しさん2005/08/12(金) 19:39:04
>>291
普通に取れると思うけど。
0294デフォルトの名無しさん2005/08/12(金) 19:46:34
質問:
スクリーンセーバとか、作るとき、IMEを消したいんですが、
そんなAPI関数ありましたっけ? 
それとも何か他の方法が、、、?
0295デフォルトの名無しさん2005/08/12(金) 19:49:07
なんでこのスレはフックの話が多いの?

ウィルスとかトロイの木馬とか作ってる香具師ばっかりなのか?
0296デフォルトの名無しさん2005/08/12(金) 19:50:51
ソース持ってる組織に入れない人が寂しがるスレなのさ
0297デフォルトの名無しさん2005/08/12(金) 19:58:39
>>294
無い。別の方法を使う。「VC++ 立川さん」でググれ。
02982942005/08/12(金) 20:14:30
>>297
ググッた。 出た。 わかた。 
ありがと。 この立川さんって人すごいね?
0299デフォルトの名無しさん2005/08/12(金) 21:00:29
>>289
ただの横スクロール
0300デフォルトの名無しさん2005/08/12(金) 21:11:16
>>295
使用用途の話はスレ違い。
だが、フックやプロセスメモリアクセスはイヤンな用途しか使い道がないような希ガス。
というよりその関数や機能自体そんな目的で作られてるようにも思える。
0301デフォルトの名無しさん2005/08/12(金) 21:16:11
>というよりその関数や機能自体そんな目的で作られてるようにも思える。

アフォか
0302デフォルトの名無しさん2005/08/12(金) 21:34:13
SetWindowPosでWindowが移動出来ないんです。
SetWindowPos( m_hWnd , rect , SWP_NOSIZE);
って感じで実装してるんですが、rect内容が変わってる事、戻り値が0になってること、フラグの組み合わせなど
確認したんですが、どれもダメで。
何がいけないんでしょう?、ん〜わかんない。
よろしくお願いします。
0303デフォルトの名無しさん2005/08/12(金) 21:45:04
>>293
たぶん制限ユーザーなんだろう。
0304デフォルトの名無しさん2005/08/12(金) 22:09:21
>>301
フック系関数やReadProcessMemory、WriteProcessMemoryの使い道を述べよ
0305デフォルトの名無しさん2005/08/12(金) 22:19:12
>>304
ウイルス...
0306デフォルトの名無しさん2005/08/12(金) 22:20:35
デバッガ
0307デフォルトの名無しさん2005/08/12(金) 22:21:18
> フック系関数
MFCのソースでも見ろ
> ReadProcessMemory、WriteProcessMemory
MSDNの分類見れば自明
0308デフォルトの名無しさん2005/08/12(金) 22:23:00
>>304
デバッガ
0309デフォルトの名無しさん2005/08/12(金) 23:39:39
デバッガを作っているわけでも、
CBTを作っているわけでもないのに、
それらのAPIを使うのは、
行儀が悪いよね。
0310デフォルトの名無しさん2005/08/12(金) 23:47:25
それらのAPIがスパイウェアやウイルスのためにあるのはもはや明確
0311デフォルトの名無しさん2005/08/12(金) 23:50:53
DeleteFileなんてAPIがあるからウイルスにファイルを消されるんだ。
ReadFileなんてAPIがあるからウイルスに(ry
0312デフォルトの名無しさん2005/08/12(金) 23:52:57
BitBltなんてAPIがあるから山田にスクリーンショットを(ry
0313デフォルトの名無しさん2005/08/12(金) 23:57:44
そいや、前スレの終わりごろに、Winnyをクラックしようとしてる香具師がいたな。

アプリケーションのファイルやレジストリのアクセスを監視したければ、
Sysinternalsのツールのようなやり方をすべきで、
フックしたりすべきじゃないんだよな。
0314デフォルトの名無しさん2005/08/13(土) 00:01:38
>>311>>312
DeleteFileもReadFileもBitBltもウイルス以外に使い道は広い。
だがWriteProcessMemoryなんてデバッガとウイルスとクラックツールぐらいしか使い道がない。
デバッガ作れるような技術がある奴ならWriteProcessMemory相当のコードは書けると思うが。
それにデバッガ作る奴なんてそれほど多くない。
これはMSが厨房向けに容易にウイルスが作成できる環境を提供してると思われ。
0315デフォルトの名無しさん2005/08/13(土) 00:07:55
> デバッガ作れるような技術がある奴ならWriteProcessMemory相当のコードは
> 書けると思うが。
ReadFileがなくてもファイルを読めるのか? (メモリマップトファイルを使えば
読めるがそういう話じゃなくて)
APIってそういうものだろ
0316デフォルトの名無しさん2005/08/13(土) 00:09:02
> これはMSが厨房向けに容易にウイルスが作成できる環境を提供してると思われ。
それでMSにどういう得があるんだよ
デンパ垂れ流すのもたいがいにしろ
0317デフォルトの名無しさん2005/08/13(土) 00:12:19
>>313
WOW64のファイルシステムリダイレクションやレジストリリダイレクションが
ユーザーモードで実装されていることについてはどうお考えですか
0318デフォルトの名無しさん2005/08/13(土) 00:34:44
MSマウスの左右のサイドキーが押された時に発生するメッセージは何でしょうか?
また、発生するメッセージを調べるにはどうしたらいいのでしょうか?
0319デフォルトの名無しさん2005/08/13(土) 00:53:42
>>318
つ [Spy++]
0320 ◆Pu/ODYSSEY 2005/08/13(土) 01:10:28
あれってXBUTTONだと思ったが違ったっけ?
第4・第5とも同じメッセージが割り当てられてるから、PARAM値を見ないと判定できないんじゃなかったっけ。
03212912005/08/13(土) 01:22:09
制限ユーザーじゃないんだけどなー。
何故かC:\からのフルパスが取れるのは一部だけ…
0322デフォルトの名無しさん2005/08/13(土) 01:43:24
んーAdministratorだとフルパスが取れたからそうなのかと思ったけど外してたか
0323デフォルトの名無しさん2005/08/13(土) 02:37:19
>>317
この話といったいどんな関係が?

それらはフックすることでAPIコール前に調整しているのではなく、
APIコールした後にOSのモジュール内で調整しているんですよ。
0324デフォルトの名無しさん2005/08/13(土) 02:44:38
>>323
> この話といったいどんな関係が?
「フックしたりすべきじゃない」と考える論拠によるのでお聞かせ願えますか
0325デフォルトの名無しさん2005/08/13(土) 02:51:22
>>291
どうやってる?
具体的にコードを示したほうがいいぞ。

エスパー能力を発揮すると・・・
PROCESSENTRY32構造体のszExeFileを見てたりする?

EnumProcessModulesして、
GetModuleFileNameExしたらどう?
0326デフォルトの名無しさん2005/08/13(土) 02:54:45
>>324
それじゃわからない。
もっと詳しく、この話とどう関係するのか説明してよ。

どうしてWOW64だとフックしなきゃいけないの?
0327デフォルトの名無しさん2005/08/13(土) 03:22:14
317じゃないが。

>>304
OSからしてソース非公開である以上、アプリがソース公開されているはずもなく、
ソースのない状況でもアプリをメンテナンスする必要性(あるいは需要)がある以上、
フックのような仕組みは必要悪として存在せざるをえない。
(バイナリパッチが使えないシチュエーションも存在する)

>>313
カーネルモードドライバでやるべきってのは間違い。
その程度の用途でいちいちカーネルモードにコード突っ込んでるようじゃ、
とてもじゃないが安定したシステムなんか望めない。
皆がSysintarnalsレベルの技術者ではない。

まあ、Server系ではフック類は無効になってるとかしたほうがいいとは、個人的には思うけどな。
あくまで「パソコン」としてのWindowsに必要なだけで、「サーバ」にはいらんだろうし。
0328デフォルトの名無しさん2005/08/13(土) 04:28:15
>>327
なるほど、フィルタドライバだとカーネルモードになるってことか。

バグがなくても危険きわまりないAPIフックと、
バグがなければ安定するフィルタドライバ、
どっちを選ぶかというと・・・後者でしょ。

なんだかんだ言ってるけど、やってることはクラックなんですよ。
0329デフォルトの名無しさん2005/08/13(土) 04:57:13
>>328
ダウト。ありえない仮定を持ち出すのは詭弁の第一歩だよ。

APIフックでコケるのはフックかけられる側プロセスだけで、
その程度でシステムダウンするほどNTカーネルはやわじゃない。
(9xは現代的OSじゃないのでしらん)
カーネルモードドライバはコケればほぼ確実にシステムごともっていく。

これはバグがどの程度あるにしたところで、変わらない事実。

> やってることはクラックなんですよ。
だから何。カーネルモードでやろうがどこでやろうが、クラックはクラックだが?

クラックかクラックじゃないかなんて、技術に対する解釈の相違にすぎんよ。
少なくともスレ違いだ。
0330デフォルトの名無しさん2005/08/13(土) 05:21:38
どうでもいいの
0331デフォルトの名無しさん2005/08/13(土) 05:35:08
あれ?
■ このスレッドは過去ログ倉庫に格納されています