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

Win32API 質問箱 Build5

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんたちが答えてくれるかも。
でも、最低限Web検索ぐらいはしてね。

前スレ
Win32API 質問箱
http://pc.2ch.net/tech/kako/991/991576947.html

Win32API【2】
http://pc.2ch.net/tech/kako/1006/10067/1006783012.html

Win32API 質問箱 Build3
http://pc.2ch.net/tech/kako/1006/10067/1006783012.html

Win32API 質問箱 Build4
http://pc3.2ch.net/test/read.cgi/tech/1023361418/

参考
MSDN Online
http://www.microsoft.com/japan/msdn/default.asp

猫でもわかるプログラミング
ttp://www.kumei.ne.jp/c_lang/index.html
0554デフォルトの名無しさんNGNG
>553
んなことより、あんたの
名前欄はなんなんだ??
0555デフォルトの名無しさんNGNG
>>553
フックをかけると潜り込める
0556YahooBB237224170.bbtec.netNGNG
>名前欄はなんなんだ??

こっちが聞きたいよ.fusianasan としたらこれが出た.(今回も)
もちろんプロバイダはYBBですが,板の仕様?

それより実行中の別プログラムの何をフックするんですか?APIがある?
0557デフォルトの名無しさんNGNG
>556
皆を代表して聞くが
なんで
「fusianasan」と入れる?
0558デフォルトの名無しさんNGNG
>>556
ウインドウをフックする
0559fusianasaNGNG
?
なんか特別な意味がある?
どっかでみて適当に書いただけだが.
こんかいは fusianasa と書いてみました.

window handle を入手するんですね.どうも.
たぶんまた聞きますのでよろしく.
0560デフォルトの名無しさんNGNG
自分が管理してるデータがあって
データの一部をリストビューで表示させてるときって
データをどうやってもつんですか?

自分のデータを保持してると
リストビューにも同じ内容のデータが出来て
メモリがもったいない気がする
0561デフォルトの名無しさんNGNG
>>560
こっちのスレの最初のほうでちょっと議論があった

Windows Programing for C/C++(Not MFC)
http://pc3.2ch.net/test/read.cgi/tech/1018239290/l50

漏れは重複して持たない主義。ただMVCの分離が…
0562デフォルトの名無しさんNGNG
>>561
仮想リストビュー(オーナーデータ)でがんがれ。
0563 NGNG
>>561-562
thx
ちょっと読んできます
0564デフォルトの名無しさんNGNG
SDKのファイル・フォルダセキュリティ設定に関して質問があります。
AddAccessAllowedAceEx関数を使用し継承を設定したのですが、設定したフォルダの中に新しいフォルダを作成すると「継承元なし」のフォルダが出来てしまいます。
継承元を親フォルダに設定するにはどうしたらよいでしょうか?
OSはWindowsXPで、VC++のバージョンは6.0です。
0565デフォルトの名無しさんNGNG
VB質問スレとの重複ですみません。
こちらの方が適当だと思いますので、質問し直させてください。
VB6.0、Windows2000で、OpenPrinter関数でプリンタのハンドルが取れません。
ローカルプリンタだと大丈夫なのですが、\\SERVER\PRINTERといった
ネットワークプリンタだと失敗してしまいます。
ネットワークプリンタの場合、方法を変える必要があるのでしょうか?
0566デフォルトの名無しさんNGNG
それぞれがウィンドウをもつオブジェクトをクラスとして扱うために、
ウィンドウプロシージャをフレンド関数としてそのクラスにもたせています。
(メンバ関数のアドレスを取るのは望ましくないですよね?)

インスタンスはたくさんあるけれどもWndProcはひとつなので、
WndProcから見るとどのインスタンスに属するメッセージなのかが区別できません。
これを解決するために、CreateWindowでインスタンスポインタ(this)をWM_CREATEに
渡してSTLのmapにhWndとthisポインタを格納し、メッセージに応答するときは
hWndからthisをサーチしてインスタンスを決定する、という方法をとっています。

なんだか泥臭いので、もっといい方法はないでしょうか。
こういったことはよくありそうだと思うんですけど。
0567デフォルトの名無しさんNGNG
>>566
他に定番の方法としては、

・SetWindowLong でhWndにthisポインタを関連付けて置いて、
 WndProcでGetWindowLongで取り出し。

・サンクを使う。つまり、thisポインタを埋め込んだマシンコードを
 実行中にメモリに作ってしまって、それをWndProc替わりにする。ATLとか参照。
0568デフォルトの名無しさんNGNG
サンクって手抜き実装だと激しくメモリ使わない?
VirtualAllocの割り当て単位がページ毎だし、
サンク作る毎にメモリ確保してたら4kずつ取られてくよね
0569デフォルトの名無しさんNGNG
なんでVirtualAlloc使うん?
0570デフォルトの名無しさんNGNG
>>569
PAGE_EXECUTE属性をつけにゃならんだろうが
0571デフォルトの名無しさんNGNG
>570

#include <stdio.h>
int main ()
{
unsigned char *p;
unsigned char x[] = {
0xB8,0x7B,0,0,0, // mov eax,123
0xC3 // ret
};
p = malloc( sizeof( x ) );
memcpy( p, x, sizeof(x) );
printf("%d\n",(*((int (*)(void))&x))());
printf("%d\n",(*((int (*)(void))&p))());
}

BCC32 on WinXPで実行したけど、violation出えへんかったで。
0572566NGNG
わざわざmapなんて使わなくてもSetWindowLongのがスマートですね。

サンクですが、要するにメモリにマシン語書いておいてそこに突入させる
わけですよね? そいつをWndProc代わりにするってのがよくわかりませんが・・・。
何にしても最後にはWndProc呼んでやらないといけないですよね?

アセンブラはPC-98時代にぶいぶい言わしたくらいで最近はとんといじってません。
0573デフォルトの名無しさんNGNG
>>572
> そいつをWndProc代わりにするってのがよくわかりませんが・・・。
引数の hWnd を、アセンブラコードの部分でこっそり this とすり替えるんだよ。
0574デフォルトの名無しさんNGNG
>>571
通るかも知れないけど、EXECUTE属性のないメモリ上でコードを実行させるのは行儀悪いだろ
0575デフォルトの名無しさんNGNG
つか、ATLもそうだろ(VirtualAlloc使ってない)
文句があるなら、Microsoftにいってくれ。
0576デフォルトの名無しさんNGNG
>>574
デフォルトで実行属性がつくから、問題ない。

そんなの処理系・環境依存だろって意見はあるかも知れんが、そもそも
VirtualAlloc とか言ってる時点で Win32 環境限定の話だしさ。
0577デフォルトの名無しさんNGNG
>>572
おおよそのところ

memcpy( buf,
//---------------------------------
 mov dword ptr [esp+4] this
 jmp WndProc - (buf + α)
を意味するコード
//---------------------------------
 , size
);
SetWindowLong( GWL_WNDPROC, buf );

こんな感じにすると、第一引数としてhWndが入ってたはずの部分に
thisポインタの値が入った状態でWndProc関数に飛ぶので、
あとはテケトーに。
0578デフォルトの名無しさんNGNG
>デフォルトで実行属性がつくから、問題ない。
こんなことどこに書いてある?
0579566NGNG
なるほど、理解できました。
行儀悪いのは大好きなのですが、hWndとthisをすり替えるってのが
ちょっとキモチワルイです。

ひとつ思ったんですが、これって誰かにサブクラス化されたらえらいことになりますね・・・。
0580デフォルトの名無しさんNGNG
>>579
ecxにthisを入れてjmpすれば、
少なくともvcでは正常にthisが使えるよ。
0581デフォルトの名無しさんNGNG
>>578
公式にドキュメント化されてるかは分からないなぁ。

ただ、俺は少なくともプロセスヒープは「read/write/execute可能」という前提で
プログラミングして(いちいち GetProcessHeap && VirtualProtect なんて
やってない)。MS が出してるコードも、そうなってるしさ。
0582デフォルトの名無しさんNGNG
>>579
> ひとつ思ったんですが、これって誰かにサブクラス化されたらえらいことになりますね・・・。
なんで?
0583デフォルトの名無しさんNGNG
質問です。
特殊キーの状態はGetKeyStateで取得できるのですが、
それ以外のキーの状態を取得するAPIはありませんか?
0584583NGNG
sageてしまいますた。
0585デフォルトの名無しさんNGNG
>>583
GetKeyboardState
0586デフォルトの名無しさんNGNG
>>585
できますた! ありがとうございます。
0587デフォルトの名無しさんNGNG
それ以外のキーもGetKeyStateで取得出来るけど・・・?
0588デフォルトの名無しさんNGNG
え、そうなんですか?
GetKeyboardState()で特殊キーも取得できちゃったんで、
全部コレにしてしまいました。
その、GetKeyState()で、例えばzキーやxキーを取得できるとして、
速度的にはどっちが早いんですか?
0589デフォルトの名無しさんNGNG
安心しろ、人間がキーを打つ速度はそれよりはるかに遅い。
0590デフォルトの名無しさんNGNG
Sleep() と GetMessage() を、
ほぼ同時に実行したいのですが、どうしたらいいですか?
いつもはPeekMessageを使ってるプログラムで暇な時にSleepしてると
フリーズしたみたいになるので、その間だけGetMessageを使いたいんですが。
GetMessageを呼んだ時に送られるメッセージとかってありますか?
0591デフォルトの名無しさんNGNG
Sleep(0)とか

>>589
えと、ゲームを作ってて、俺マシンはK6-2の500MHzなんですよ。
んで、1フレームにイロイロ処理をしてると秒間10フレーム逝くか逝かないかで。
なんで、なるべく時間をかけたくないワケです。
0592デフォルトの名無しさんNGNG
>>590

電波ですか?

>GetMessageを呼んだ時に送られるメッセージとかってありますか?

これがあったら無限ループ
0593デフォルトの名無しさんNGNG
>>591
入力くらいスレッド分けろよ。
WM_KEYDOWNが来た時点でイベント起こしたりSwitchToFiberしたり汁。
そもそも、ループ毎に検出しなきゃならないのはジョイスティックくらいで、
キーボードなんかはイベントで十分。
0594デフォルトの名無しさんNGNG
>>593
アクションゲーなんですが、スレッド使うんですか? それはちょっと。
0595デフォルトの名無しさんNGNG
>>590
500mm秒ほど寝かせてPeakMessage使え。
スレッドの切り替え時間が十数mm秒だからほかへの影響もほとんどないし、
反応が悪くなることもない。
0596デフォルトの名無しさんNGNG
>>590
MsgWaitForMultipleObjects
0597デフォルトの名無しさんNGNG
>>595
500mm秒って50cm秒でしょうか?
ってどのくらいの長さですか?
0598デフォルトの名無しさんNGNG
50cm秒って初めて聞いたなw 500mm秒も初めて聞いたけど。
多分>>595は500�_秒と表現したかったんだろうけど、
ホントは500マイクロ秒と言いたかったのではないと予測。
0599デフォルトの名無しさんNGNG
自作コントロールのサンプルみたいのありませんか?

親ウインドウにメッセージを返すのに、どの変数を
どういう風に設定すれば良いのかがわからないのです。
0600デフォルトの名無しさんNGNG
> 親ウインドウにメッセージを返すのに
何のメッセージを返すの?

自前で処理したいメッセージなら処理してリターン、
それ以外はDefWindowProcにそのまま渡せばいいんだけど。
0601デフォルトの名無しさんNGNG
シャットダウン、ログオフなどを
WM_QUERYENDSESSION
で検出したのはいいのですが、
lParamがシャットダウンも再起動も
共に0になってしまいます。
見分ける方法はないでしょうか?
WinXP、VC.NETです。
0602デフォルトの名無しさんNGNG
PeakMessage萌え
0603デフォルトの名無しさんNGNG
>>600
自作のエディットコントロールで、NotifyメッセージをEDIT互換にしたいとかじゃないの?
0604 NGNG
>>601
見分けても意味ないだろ。
0605601NGNG
>604
見分ける方法はあるのですか?
それともないのですか?
0606デフォルトの名無しさんNGNG
>>605
何をやりたいのか、もう少し具体的に書いてみれば? 代案が出てくるかも
知れんぞ。
0607599NGNG
>>603
そんな感じです
0608601NGNG
>606
別スレですこし話したのですが、
ファイルを定期的にバックアップするツールを作っています。
その機能の一部に
終了時、バックアップをとる
というのがあるんですが、
これを実装するためです。
別スレでは、シャットダウン時は
重い作業厳禁、といわれたのですが、
ファイルのコピーなので仕方ないかな、と思って開発進めてます。
シャットダウン時にコピーすると応答が無い、という
ダイアログが出てしまいます。
ですから
WM QUERYENDSESSIONでFALSEを返し
システムからのシャットダウン要求を中断、
WM ENDSESSION中側でファイルの処理、
その後ExitWindowsExでシャットダウン
とするように動かしたいのですが、
一度止めて、ExitWindowsExする時に、
シャットダウンならシャットダウン、
リブートならリブート、と引数を変化させる必要が
あり、どうしても必要な情報と思ってます。
0609デフォルトの名無しさんNGNG
>>607
そんな感じって...自分でまともに説明もできんのなら
標準のEditコントロールでも使っとけ。

通知したい時点で
SendMessage(GetParent(hwnd),
    WM_COMMAND,
    MAKEWPARAM(GetDlgCtrlID(hwnd), EN_CHANGE),
    (LPARAM)hwnd);
のような感じで呼び出せばいい。
0610デフォルトの名無しさんNGNG
>>608
MFCスレで、そのソリューションを提示した者だ。
  if ( lParam & ENDSESSION_LOGOFF )
でちゃんと区別つけられたよ(Win2000)。
0611601NGNG
>610
すみません、毎度毎度ご迷惑おかけします。
あたりです。
そんな定数あるとは知りませんでした。
winusuer.h内のしかも
ExitWindowsExの近くに
#define EWX_LOGOFF 0
#define EWX_SHUTDOWN 0x00000001
#define EWX_REBOOT 0x00000002
#define EWX_FORCE 0x00000004
#define EWX_POWEROFF 0x00000008
#if(_WIN32_WINNT >= 0x0500)
#define EWX_FORCEIFHUNG 0x00000010
とあり、他のも区別できそうです。
.hへ定数を調べにいくという考えは持ってませんでした。
次から気をつけたいと思います。
ありがとうございました。
0612601NGNG
>611
勘違いしてました。
これはExitWindowsExの引数に使う定数ですね。
>610さんのおっしゃられてる方法だと、
確かにログオフは検出されますが、
シャットダウンか再起動かは判別できないようです。
簡易的にはWM_QUERYENDSESSIONの
lParamが1か0かで同じ判断ができるようです。
喜びのあまり、てっきり
EWX_SHUTDOWNをENDSESSION_SHUTDOWNと
勘違いしていたようです、すみません。
ENDSESSION_LOGOFFもあるならと
ENDSESSION_SHUTDOWN
なども探してみましたがどうやらログオフしかないようです。
シャットダウンと再起動を見分けることはできないのでしょうか?
0613デフォルトの名無しさんNGNG
WIN32アプリをWM_CLOSEにより終了させる際に受け取るメッセージって
WM_CLOSE -> WM_DESTROY -> WM_QUIT
の順番でいいんでしょうか?
WM_DESTROYでオブジェクトの解法とかしてるんですけど
なんかの解法忘れがあるっぽくて、終了後CPU占有率が70%くらいになってしまう...
0614610NGNG
>>612 シャットダウンか再起動かの判別...オラは、わがんね。
0615613NGNG
メッセージの拾い忘れでした
はずかちー・・・
0616デフォルトの名無しさんNGNG
WM_DESTROYの後にWM_NCDESTROYが来るよ・・・(ぼそっ)
0617613NGNG
と思ったらOSがイカレてるだけでした・・・

イカレたOSでコンパイルしたexeって
やっぱイカレてるのかな
0618デフォルトの名無しさんNGNG
自分自身のウインドウハンドルを取得するいい方法はないっすか?

GetForegroundWindow を使えば、取得できないことはないですが
ちょっと違うんです。
あとは、GetDesktopWindow から下がっていくぐらいしかわからなかったっす。

関数の引数に与えてやれる情報は、何もないっす。

具体的には、DLL からその呼び出されているウインドウのハンドル
を取得したいのです。
DLLに直接ウィンドウハンドルを渡してやるとかは、ナシっす。
それをやりたくないのでありまして・・・。
0619デフォルトの名無しさんNGNG
自分自身ってなに?
WndProcの第一引数にハンドルが入ってくるが
0620デフォルトの名無しさんNGNG
http://www.torikyo.ed.jp/torie-h/
これは、田舎のひなびた小さな学校のHPを100万ヒットの
人気HPにしてあげようという運動です。現在のターゲット校は上記です。
多くの皆さんクリックしてあげて下さい。
HPに飛んだら、2,3回更新していただくと、もっとありがたいです。
どんどんコピペして他の板にまいてください。
0621bloomNGNG

http://www.leverage.jp/bloom/start/
0622デフォルトの名無しさんNGNG
>>618
どのウインドウのWindowProc中か知りたいということ?
スタックをさかのぼるしか方法ないと思うが
0623618NGNG
自分自身ってのがわかりにくかったっすね。すまんす。

実行しているプログラム=プロセスのことで、あってるのかな。

具体的にいいますと、a.exe ってのが、x.dll を使ってるとします。
このとき、a.exeが、自分自身ってことです。

そして、やりたいことというのは、x.dll からa.exe のウィンドウハンドルを
取得したいのです。

もしかして、DllMainの第一引数でOK???
もうちょっと調べてみます〜。
0624デフォルトの名無しさんNGNG
>>623
一つのプロセスは複数のウインドウを所有できることを忘れてないか?
0625デフォルトの名無しさんNGNG
1プロセス1ウィンドウではない。
まずこれを理解しよう。
コマンドラインで使うようなプログラムはウインドウを持たないし、
Exploror等は1プロセスでいくつものウインドウを持ってる。
0626デフォルトの名無しさんNGNG
>>623
まぁ、プロセスが持つウィンドウを全部調べたいと仮定して、EnumWindows & GetWindowThreadProcessId が妥当なところだろう。
0627618NGNG
DllMainの第一引数を使って、やってやるとやりたいことが
なんとかできあたみたいです。

アドバイス役にたちました。どもッス。
0628デフォルトの名無しさんNGNG
だれもDllMainの第一引数なんて言ってないと思うが
0629デフォルトの名無しさんNGNG
ツールバーを作成して、ビットマップがボタンに張り付いてくれたのはいいんですが、
これってシステムの背景色で透過させることはできないのでしょうか?
システム背景色は設定で変えられるので、ビットマップの周辺に灰色を塗っただけじゃ
浮いてしまう可能性がありますし、ダサいので・・・。

それと、メディアプレーヤ6.4のツールバーのようにツールバーを下の方に移動したいのですが、
SetWindowPosを受け付けてくれません。完全に下にへばりつかせるか、上にへばりつかせるかしか
できないようです。これもなんとかならないでしょうか。
0630デフォルトの名無しさんNGNG
age
0631デフォルトの名無しさんNGNG
>>629
「bitblt 透過」でgoogleしる。
0632デフォルトの名無しさんNGNG
>>631
マスクを生成して自前で透過処理を行え、ということでしょうか?
0633デフォルトの名無しさんNGNG
0番目のパレットの色が透過になるんじゃないの
0634デフォルトの名無しさんNGNG
>>618-619, 622-628
ネタ?かなり笑ったんだけど…
0635デフォルトの名無しさんNGNG
すんません、フォトショップがはき出したbmpがダメダメでした・・・。
0636デフォルトの名無しさんNGNG
プリンタに LintTo() で線を引くとえらく汚いのですが、
これは漏れのプリンタ(MJ-900C)がボロいからでしょうか?
0637 NGNG
CreateWindowの最後の引数はなに?
0638デフォルトの名無しさんNGNG
例外c0000026Hってなに?
3回も出やがった
0639あNGNG
>637
何を聞きたいのかよくわかりません。
検索エンジンにでも聞いてください。
0640638NGNG
一応補足しとくと、Window開いてDirectX作るだけのWIN32アプリ

Cライクにベタ打ちしてる間は動いてたけど
DirectXの初期化とかをまとめてクラス化してったら出るようになった

んだけど、なぜか初期化の前で出る

わけわかめ
0641デフォルトの名無しさんNGNG
コード出せ
0642デフォルトの名無しさんNGNG
【 SetFilePointer 】
>For example, to move in the range from 2 gigabytes to 4 gigabytes set
>the contents of lpDistanceToMoveHigh to zero, or ・・・
                          ^^^^^^
なんで 0 なんですか?1なら納得なんですが...
  nSize = (nSizeHigh * (MAXDWORD+1)) + nSizeLow
ですよね???
0643デフォルトの名無しさんNGNG
>>642
SetFilePointerのリファレンスは読んでないけど、それを見る限り間違ってないように思うけど?
2G〜4Gなら、32ビットに収まる範囲だろ?上位DWORDはゼロでいいんじゃないの?
4G〜8Gが、上位DWORD=1になるんじゃない?
0644デフォルトの名無しさんNGNG
符号拡張だから。

サンプル通りLARGE_INTEGER使えって事だ
0645642NGNG
>>643

DWORD SetFilePointer(
HANDLE hFile, // ファイルのハンドル
LONG lDistanceToMove, // ポインタを移動するべきバイト数(下位32ビット)
PLONG lpDistanceToMoveHigh, // ポインタを移動するべきバイト数(上位32ビット)
DWORD dwMoveMethod // 開始点
);

確かにそうなんですが、下位32ビット lDistanceToMove は符号付って
書いてあるんです...もしかして、lpDistanceToMoveHigh が
Non-NULLのときは、lDistanceToMoveは符号無しとして扱われるのかな?

//実験すればすぐ分かりそうなもんですが...
 今カキコしてる環境では実験できないもんで(;´Д`)
0646642NGNG
>>644 はぁ、そうします。
0647デフォルトの名無しさんNGNG
> もしかして、lpDistanceToMoveHigh が
> Non-NULLのときは、lDistanceToMoveは符号無しとして扱われるのかな?

そりゃそうでしょ。両方が符号ビット持ってどうするのよ。
0648デフォルトの名無しさんNGNG
>>645
644じゃないけど
32ビットで符号つきならMSBと31ビットだけど
64ビットなら符号を上位32ビットに移せば下位32ビットの
MSBは符号を示す必要がなくなるじゃん。
下位32ビットで4GBまで表現できるわけでしょ。
0649デフォルトの名無しさんNGNG
CreateWindow(....... LPARAM lParam) この最後の引数はなににつかうの?
0650デフォルトの名無しさんNGNG
>>649
ウィンドウプロシージャに WM_CREATE が送られるとき、その lParam に渡すために使われます。
0651デフォルトの名無しさんNGNG
>>649
MSDN参照。
ウィンドウを生成したときに WM_CREAT メッセージが
WinProcに飛んでくるがそのときに lParam 値に設定される。
使い方はお好きなようにどうぞ。
0652651NGNG
さっきからかぶってますな。ネマツ。
0653642NGNG
>647-648
こんな夜更けにどうも。勉強になりますた。

>For example, to move in the range from [0] to 4 gigabytes set
>the contents of lpDistanceToMoveHigh to zero, or ・・・
こう書いてくれれば...
■ このスレッドは過去ログ倉庫に格納されています