Win32APIについての質問はこちらへどうぞ。
■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。
英語版( http://msdn.microsoft.com/en-us/library/ )の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで
■過去スレ
Win32API質問箱 Build125
https://mevius.5ch.net/test/read.cgi/tech/1551247748/
Win32API質問箱 Build124
https://mevius.5ch.net/test/read.cgi/tech/1510395780/
■関連スレ
Visual Studio 2019 Part4 https://mevius.5ch.net/test/read.cgi/tech/1585715794/
Visual Studio 2017 Part7 https://mevius.5ch.net/test/read.cgi/tech/1558179898/
【C++】 DirectX初心者質問スレ Part41 【C】 https://mevius.5ch.net/test/read.cgi/tech/1521786252/
探検
Win32API質問箱 Build126
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2020/05/01(金) 22:16:51.96ID:ZJ42fMZB606590
2021/06/14(月) 21:54:18.56ID:CyJY6/R2 次の設定でマウスカーソルが表示できました。
Windowsの設定 → 簡単操作 → マウス → マウスをキーパッドで操作する : オン
または下のレジストリ設定後、一度ログアウトし再度ログオンする。
rem マウスオン
reg add "HKCU\Control Panel\Accessibility\MouseKeys" /v Flags /t REG_SZ /d "159" /f
rem マウスオフ
reg add "HKCU\Control Panel\Accessibility\MouseKeys" /v Flags /t REG_SZ /d "158" /f
レジストリ設定の場合、一度ログアウトが必要なのが解せませんが、これで一応ソフトウェアでカーソルの表示まではできました。
Windowsの設定 → 簡単操作 → マウス → マウスをキーパッドで操作する : オン
または下のレジストリ設定後、一度ログアウトし再度ログオンする。
rem マウスオン
reg add "HKCU\Control Panel\Accessibility\MouseKeys" /v Flags /t REG_SZ /d "159" /f
rem マウスオフ
reg add "HKCU\Control Panel\Accessibility\MouseKeys" /v Flags /t REG_SZ /d "158" /f
レジストリ設定の場合、一度ログアウトが必要なのが解せませんが、これで一応ソフトウェアでカーソルの表示まではできました。
607590
2021/06/14(月) 22:00:24.26ID:CyJY6/R2 なお、ログオフ前もマウスカーソルを表示させたい場合はHKU\.DEFAULTに設定すれば良いようです。
reg add "HKU\.DEFAULT\Control Panel\Accessibility\MouseKeys" /v Flags /t REG_SZ /d "159" /f
とりあえずこれで大丈夫かな?
reg add "HKU\.DEFAULT\Control Panel\Accessibility\MouseKeys" /v Flags /t REG_SZ /d "159" /f
とりあえずこれで大丈夫かな?
608デフォルトの名無しさん
2021/06/15(火) 20:39:42.52ID:yNzX82gi609デフォルトの名無しさん
2021/06/18(金) 04:52:47.87ID:G04bvGTj こんにちは。
C++ でSDIウィンドウを管理するためのラッパークラスを作っているのですが、
正直、継承クラスを作成してウィンドウをカスタマイズするたびに新しい
ウィンドウクラス名を指定する作業が面倒くさいです。当初は
string SDIWindow::get_wndclass_name() const {return typeid(*this).name();}
このような仮想関数を用意していたのですが、std::typeid::name() の返却値は実装依存で、
空文字すら返すことがあると聞き、ボツ案になりました。どうにかウィンドウクラス名を
自動生成したいのですが、妙案はありませんでしょうか。MFCなどのツールではどのように
名前を付けているのでしょう?よろしくお願いいたします。
C++ でSDIウィンドウを管理するためのラッパークラスを作っているのですが、
正直、継承クラスを作成してウィンドウをカスタマイズするたびに新しい
ウィンドウクラス名を指定する作業が面倒くさいです。当初は
string SDIWindow::get_wndclass_name() const {return typeid(*this).name();}
このような仮想関数を用意していたのですが、std::typeid::name() の返却値は実装依存で、
空文字すら返すことがあると聞き、ボツ案になりました。どうにかウィンドウクラス名を
自動生成したいのですが、妙案はありませんでしょうか。MFCなどのツールではどのように
名前を付けているのでしょう?よろしくお願いいたします。
610デフォルトの名無しさん
2021/06/18(金) 11:13:45.48ID:jgOXgIk3612デフォルトの名無しさん
2021/06/18(金) 20:14:25.45ID:Y3n+d/Ne ATLはオブジェクトのアドレスだったような
613609
2021/06/19(土) 01:33:45.59ID:zlIXB2NK ご回答くださった方々、ありがとうございます。
__func__ これだ、と思ったのですが、いま使用しているコンパイラが相当古く、
この機能をサポートしていないようです。何かうまい方法がないかもう少し考えてみます。
>>612
自分もオブジェクトのアドレスを利用できないかと考えていたのですが、インスタンスごとに
アドレスが異なると困るのではと思い、保留していました。
__func__ これだ、と思ったのですが、いま使用しているコンパイラが相当古く、
この機能をサポートしていないようです。何かうまい方法がないかもう少し考えてみます。
>>612
自分もオブジェクトのアドレスを利用できないかと考えていたのですが、インスタンスごとに
アドレスが異なると困るのではと思い、保留していました。
614デフォルトの名無しさん
2021/06/19(土) 05:54:37.84ID:IUR6A6FI uid、guid生成すんのがトレンド
615デフォルトの名無しさん
2021/06/19(土) 13:13:08.67ID:tbYH3ICf コンストラクタの呼び出し位置で __FILE__と__LINE__を使った文字列をセットするとか
616609
2021/06/19(土) 15:58:26.49ID:zlIXB2NK >>614-615
ありがとうございます。
なるほど! __FILE__, __LINE__ の組み合わせは盲点でした。
これなら確かに、オブジェクトとウィンドウクラスを1対1で対応させることができますね。
少なくとも当座はこれでしのげます。
uid、guid 案もありがとうございます。
知識不足のため、勉強してから考えてみたいと思います。
ありがとうございます。
なるほど! __FILE__, __LINE__ の組み合わせは盲点でした。
これなら確かに、オブジェクトとウィンドウクラスを1対1で対応させることができますね。
少なくとも当座はこれでしのげます。
uid、guid 案もありがとうございます。
知識不足のため、勉強してから考えてみたいと思います。
617デフォルトの名無しさん
2021/06/19(土) 16:18:13.72ID:BH9bYKW9 ウインドウクラス名は文字列の他にATOMでも指定できる
ATOMはRegisterClass()が返す
ATOMはRegisterClass()が返す
618デフォルトの名無しさん
2021/07/09(金) 07:17:28.46ID:Qg7nE9lI dllmainの最初の引数のHMODULEっていうかハンドルと同じ値を取得するwin32apiある?
ライブラリ作ってるけど、dllmain自体をライブラリに含めたくないから困ってる。
dllmainからHMODULEをライブラリに渡せ
みたいな変な規則も出来れば避けたい...
ライブラリ作ってるけど、dllmain自体をライブラリに含めたくないから困ってる。
dllmainからHMODULEをライブラリに渡せ
みたいな変な規則も出来れば避けたい...
619デフォルトの名無しさん
2021/07/09(金) 07:19:48.14ID:If26C/4W GetModuleHandle(NULL)をキャストしる
620デフォルトの名無しさん
2021/07/09(金) 07:50:25.45ID:Qg7nE9lI GetModuleHandleのNULLは大元の実行ファイルのパス。
そうじゃなくて.dllのパスが欲しい。
その際dllmainの第一引数を使わない形で欲しい。
そうじゃなくて.dllのパスが欲しい。
その際dllmainの第一引数を使わない形で欲しい。
621デフォルトの名無しさん
2021/07/09(金) 08:17:41.20ID:r/5b40UG んでリンカーでエントリーポイントを自前のにしつつ
コンパイラのスタートアップに渡す過程で hInst をくすねるしかないんじゃないの?
コンパイラのスタートアップに渡す過程で hInst をくすねるしかないんじゃないの?
622620
2021/07/09(金) 08:53:28.23ID:Qg7nE9lI 定義関数自身を渡しつつ、リファレンスカウンタを増やすのを回避する以下の形でいけるっぽい。
HMODULE GetCurrentModule()
{
DWORD flags = GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT;
HMODULE h = 0;
::GetModuleHandleEx(flags, reinterpret_cast<LPCTSTR>(GetCurrentModule), &h);
return h;
}
HMODULE GetCurrentModule()
{
DWORD flags = GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT;
HMODULE h = 0;
::GetModuleHandleEx(flags, reinterpret_cast<LPCTSTR>(GetCurrentModule), &h);
return h;
}
623デフォルトの名無しさん
2021/07/09(金) 11:00:40.24ID:r/5b40UG そのライブラリを利用して
dll を記述するときは dll 自身を指して
アプリケーションを記述するときは実行ファイル自身を指すと
(GetModuleHandle() は、常に実行ファイルを指す)
dll を記述するときは dll 自身を指して
アプリケーションを記述するときは実行ファイル自身を指すと
(GetModuleHandle() は、常に実行ファイルを指す)
624デフォルトの名無しさん
2021/07/09(金) 12:53:16.14ID:If26C/4W Module32First でも使えば〜
625デフォルトの名無しさん
2021/07/09(金) 16:42:11.88ID:egaI+P/a >>618
DLLは、アプリと同じ仮想アドレス空間を共有しており、HMODULEの値は、
DLLの PE イメージの先頭アドレスだと聞いている。
そして、DLLは単なる関数の集まりに過ぎないので、「現在のDLL」という
概念が存在しない。
dllmain が呼び出されて、OSに戻るまでの間の時間、現在どの dllmain が呼び出されているか、
という情報なら OSはどこかに持っているはずではあるが。
なお、DLLの関数群は、通常、dllmain が呼び出されている間以外に使うことが原則。
DLLは、アプリと同じ仮想アドレス空間を共有しており、HMODULEの値は、
DLLの PE イメージの先頭アドレスだと聞いている。
そして、DLLは単なる関数の集まりに過ぎないので、「現在のDLL」という
概念が存在しない。
dllmain が呼び出されて、OSに戻るまでの間の時間、現在どの dllmain が呼び出されているか、
という情報なら OSはどこかに持っているはずではあるが。
なお、DLLの関数群は、通常、dllmain が呼び出されている間以外に使うことが原則。
626デフォルトの名無しさん
2021/07/10(土) 05:25:42.40ID:fmB/UGP2 dllは現在実行中のdllという概念はあるのでは。
あるからこそ、c++/cliでは簡単かつ確実なものとして提供されてるわけで。
あるからこそ、c++/cliでは簡単かつ確実なものとして提供されてるわけで。
627デフォルトの名無しさん
2021/07/10(土) 05:59:03.94ID:fmB/UGP2 あと、現在実行中のニーモニックのアドレスより若い直近アドレスに位置するモジュールのエントリーアドレスであればそれが求めるものだし。
620は関数定義が属するdllのハンドルを得る関数になってるから、実用上問題なく機能するよね。
620は関数定義が属するdllのハンドルを得る関数になってるから、実用上問題なく機能するよね。
628デフォルトの名無しさん
2021/07/10(土) 06:50:44.17ID:JLp3Oijw そもそもDllMainのHMODULEを使わないって縛りプレイでのお話でおすし
629デフォルトの名無しさん
2021/07/10(土) 09:10:30.89ID:e+Cu97LZ630デフォルトの名無しさん
2021/07/10(土) 09:18:08.53ID:CnbTxKRZ631デフォルトの名無しさん
2021/07/10(土) 09:39:49.89ID:e+Cu97LZ632デフォルトの名無しさん
2021/07/10(土) 09:41:14.25ID:e+Cu97LZ633デフォルトの名無しさん
2021/07/10(土) 09:41:47.91ID:e+Cu97LZ634デフォルトの名無しさん
2021/07/10(土) 09:43:15.11ID:MJuwQyYP tool help 32
635デフォルトの名無しさん
2021/07/10(土) 11:50:04.86ID:fmB/UGP2 いや実行中のステップがどのdllかという概念はあるよ。
あるからデバッガでも今の瞬間実行中のステップがどの.dllのどのアドレスかまでわかってるわけで。
あるからデバッガでも今の瞬間実行中のステップがどの.dllのどのアドレスかまでわかってるわけで。
636デフォルトの名無しさん
2021/07/10(土) 11:56:56.14ID:6bm+w6Lu >>635
それをOSが管理してるか?って話だろ
それをOSが管理してるか?って話だろ
637デフォルトの名無しさん
2021/07/10(土) 12:01:47.23ID:fmB/UGP2 各々dllのベースアドレスは管理してるんだから、管理してるだろ。
管理してるかはdllは解放されるんだろ?
ベースアドレスからファイル名が辿れるから何のファイルか解るようになってるんやないか。
だからぶっ飛ぶとシステムログに飛んだdll名が明記されるやないか。
管理してるかはdllは解放されるんだろ?
ベースアドレスからファイル名が辿れるから何のファイルか解るようになってるんやないか。
だからぶっ飛ぶとシステムログに飛んだdll名が明記されるやないか。
638デフォルトの名無しさん
2021/07/10(土) 13:28:51.32ID:nAGZi/ZP 本当に飛躍した話が好きだよなおまえ達は
639デフォルトの名無しさん
2021/07/10(土) 13:41:35.94ID:fmB/UGP2 GetModuleHandleExの仕様をみればOSの管理下にあるのわかるじゃん。
2番目の引数には。モジュールのパスでもよいが、
「モジュール内の任意のアドレス」でもいいわけ。
即ち今プログラムでましに実行中位置であるEIPレジスタやRIPレジスタの値から
dllなりexeなりのハンドルがとれると書いてあるわけで。
もちろんハンドルがとれるからファイルのパスもわかる。
管理下になかったらどうやって取れるんだってのw
2番目の引数には。モジュールのパスでもよいが、
「モジュール内の任意のアドレス」でもいいわけ。
即ち今プログラムでましに実行中位置であるEIPレジスタやRIPレジスタの値から
dllなりexeなりのハンドルがとれると書いてあるわけで。
もちろんハンドルがとれるからファイルのパスもわかる。
管理下になかったらどうやって取れるんだってのw
640蟻人間 ◆T6xkBnTXz7B0
2021/07/10(土) 14:24:30.76ID:aRchcoDj ReactOSでGetModuleHandleExWをたどってみると次のようになる:
https://github.com/reactos/reactos/blob/master/dll/win32/kernel32/client/loader.c#L866
https://github.com/reactos/reactos/blob/master/dll/win32/kernel32/client/loader.c#L716
https://github.com/reactos/reactos/blob/master/dll/win32/kernel32/client/loader.c#L767
https://github.com/reactos/reactos/blob/20c1da7963debb69a46cf9f19f3e4c5e504c7fc9/ntoskrnl/rtl/libsupp.c#L34
https://github.com/reactos/reactos/blob/3fa57b8ff7fcee47b8e2ed869aecaf4515603f3f/ntoskrnl/ke/bug.c#L41
PLDR_DATA_TABLE_ENTRY構造体でプロセスの空間を保持しているようだ。
https://github.com/reactos/reactos/blob/master/dll/win32/kernel32/client/loader.c#L866
https://github.com/reactos/reactos/blob/master/dll/win32/kernel32/client/loader.c#L716
https://github.com/reactos/reactos/blob/master/dll/win32/kernel32/client/loader.c#L767
https://github.com/reactos/reactos/blob/20c1da7963debb69a46cf9f19f3e4c5e504c7fc9/ntoskrnl/rtl/libsupp.c#L34
https://github.com/reactos/reactos/blob/3fa57b8ff7fcee47b8e2ed869aecaf4515603f3f/ntoskrnl/ke/bug.c#L41
PLDR_DATA_TABLE_ENTRY構造体でプロセスの空間を保持しているようだ。
641デフォルトの名無しさん
2021/07/10(土) 15:12:39.28ID:fOJ6OsHP642デフォルトの名無しさん
2021/07/10(土) 15:26:13.52ID:fmB/UGP2 でも結局CPUの命令アドレスからdll名を求められるから、
今CPUが実行中のdllやexeはOSが管理してるし、それ用のwin32apiも提供されている、であってるやん。
今CPUが実行中のdllやexeはOSが管理してるし、それ用のwin32apiも提供されている、であってるやん。
643デフォルトの名無しさん
2021/07/10(土) 15:45:03.11ID:iYY30g0K どこを実行中かをOSが管理してるなら、暴走なんてせんわな
デバッガはbreakしたらやってるだけ
デバッガはbreakしたらやってるだけ
644デフォルトの名無しさん
2021/07/10(土) 16:12:20.61ID:6bm+w6Lu645デフォルトの名無しさん
2021/07/10(土) 16:44:08.48ID:fmB/UGP2 プロセス単位でexeやdllのアドレスを簡易的に言えば配列のように保持してて
あとはEIPが配列のインデックスであるかのように実行時に動くだけだから管理できてるじゃん。
indexに幅があるってだけでしょ。
あとはEIPが配列のインデックスであるかのように実行時に動くだけだから管理できてるじゃん。
indexに幅があるってだけでしょ。
646デフォルトの名無しさん
2021/07/10(土) 17:41:11.37ID:fOJ6OsHP647デフォルトの名無しさん
2021/07/10(土) 17:43:28.93ID:plgO0oJb 激重OSになりそう
648デフォルトの名無しさん
2021/07/10(土) 18:58:44.17ID:fmB/UGP2 いったいいつ関数の話になったんだ。
EIPからいつでもモジュールを辿れる形でプロセス情報を保持してるから管理されてると言ってるんだが。
プロセス情報を保持してないなら管理してないと言えるが。
EIPからいつでもモジュールを辿れる形でプロセス情報を保持してるから管理されてると言ってるんだが。
プロセス情報を保持してないなら管理してないと言えるが。
649デフォルトの名無しさん
2021/07/10(土) 19:18:42.88ID:fmB/UGP2 管理されてるを監視してるに勝手に脳内で置き換えてないやろな?
650デフォルトの名無しさん
2021/07/11(日) 00:19:00.34ID:5nx6GB9W でそれを取得するAPIは?
651デフォルトの名無しさん
2021/07/11(日) 03:01:15.31ID:OgOa7vqd 管理されているというより、EIPアドレスから逆算しているという感じだね。
実行中のマシン語の命令のアドレスが分かれば、リンク時のマップファイルのような
情報があれば、どの関数の中のマシン語かまで分かるから。
実行中のマシン語の命令のアドレスが分かれば、リンク時のマップファイルのような
情報があれば、どの関数の中のマシン語かまで分かるから。
652デフォルトの名無しさん
2021/07/11(日) 03:07:37.40ID:OgOa7vqd どの人がどこにいるかを国は普段は追跡してないけど、科学捜査すればどこにいるか
分かることが多いと言う意味で、「管理はしてなくても見抜くことは出来る」
のと同様の事。
分かることが多いと言う意味で、「管理はしてなくても見抜くことは出来る」
のと同様の事。
653デフォルトの名無しさん
2021/07/11(日) 03:11:46.75ID:OgOa7vqd >>649
各DLLがロードされている場所のアドレス範囲とEIPさえあれば、そりゃ、どのDLL
にいるかは分かるけれど、それは管理とは言わないと思うな。
マシン語で、jmp アドレス、call アドレス で、1クロックですぐに EIP = アドレス
になるが、それをOSはいちいち追跡も管理も全くしていない。だから、
現在どのDLLの関数を実行中かをOSは情報としては持ってない。
ところが、EIPの値からどのDLLの中を実行中かを「逆算」することが可能と言うだけ。
各DLLがロードされている場所のアドレス範囲とEIPさえあれば、そりゃ、どのDLL
にいるかは分かるけれど、それは管理とは言わないと思うな。
マシン語で、jmp アドレス、call アドレス で、1クロックですぐに EIP = アドレス
になるが、それをOSはいちいち追跡も管理も全くしていない。だから、
現在どのDLLの関数を実行中かをOSは情報としては持ってない。
ところが、EIPの値からどのDLLの中を実行中かを「逆算」することが可能と言うだけ。
654デフォルトの名無しさん
2021/07/11(日) 03:17:09.08ID:OgOa7vqd プログラミングの世界で「管理」というのは、
struct SomeInfo {
int curDllIndex; // 現在実行中のDLLのインデックス番号(0-)
};
のようなデータ構造があり、idx1 という番号の DLL の中の関数を呼び出すときに、
プログラムで curDllIndex = idx1 にちゃんと書き込む、ということをイメージする。
このような意味での書き込みは行われてない。
struct SomeInfo {
int curDllIndex; // 現在実行中のDLLのインデックス番号(0-)
};
のようなデータ構造があり、idx1 という番号の DLL の中の関数を呼び出すときに、
プログラムで curDllIndex = idx1 にちゃんと書き込む、ということをイメージする。
このような意味での書き込みは行われてない。
655デフォルトの名無しさん
2021/07/11(日) 03:24:26.40ID:OgOa7vqd OSに管理されているのであれば、idx1 番の DLLから、main モジュールの関数 f()が
コールバックされたような場合でも、どのDLLから呼び出されたかまで分かるはずだが、
現実にはEIPは、f()の中をポイントしているから EIP だけからは、idx1 を逆算する
ことは不可能。
デバッガが出来てしまうのは、デバッグしやすい様にコンパイラが
「スタックフレーム」という構造が出来るようなコードをわざと作っているから。
その構造によれば、スタックとEBPの値で呼び出しもとの関数の履歴を全て辿って
いける。
しかしこれは、OSが管理しているのではなく、デバッグ版ではそのようなコードを
コンパイラが生成しているからに過ぎない。
リリース版では効率向上のためスタックフレームが省略されることもあり、その
場合は呼び出しもとの関数が辿れなくなるので idx1 という番号を算出することは
原則的には出来なくなる。
コールバックされたような場合でも、どのDLLから呼び出されたかまで分かるはずだが、
現実にはEIPは、f()の中をポイントしているから EIP だけからは、idx1 を逆算する
ことは不可能。
デバッガが出来てしまうのは、デバッグしやすい様にコンパイラが
「スタックフレーム」という構造が出来るようなコードをわざと作っているから。
その構造によれば、スタックとEBPの値で呼び出しもとの関数の履歴を全て辿って
いける。
しかしこれは、OSが管理しているのではなく、デバッグ版ではそのようなコードを
コンパイラが生成しているからに過ぎない。
リリース版では効率向上のためスタックフレームが省略されることもあり、その
場合は呼び出しもとの関数が辿れなくなるので idx1 という番号を算出することは
原則的には出来なくなる。
656デフォルトの名無しさん
2021/07/11(日) 03:33:02.64ID:OgOa7vqd >>655
[補足]
スタックフレームは、「ユーザーランド」のアドレス空間に構成された構造で、
OSが「管理」する「システムランド」のアドレス空間にはない。
前者はプログラムに誤りが有ると壊れることがあるし、コンパイラのオプション次第
で省略されることもあるから、いつでも存在するわけでも無いし、いつでも正しい
訳でもない。
その意味で、OSの管理する構造ではない。
[補足]
スタックフレームは、「ユーザーランド」のアドレス空間に構成された構造で、
OSが「管理」する「システムランド」のアドレス空間にはない。
前者はプログラムに誤りが有ると壊れることがあるし、コンパイラのオプション次第
で省略されることもあるから、いつでも存在するわけでも無いし、いつでも正しい
訳でもない。
その意味で、OSの管理する構造ではない。
657デフォルトの名無しさん
2021/07/11(日) 03:48:47.46ID:NwP/aFzk Tool Help Library ぐらいは調べて
から書きたまえ。
から書きたまえ。
658デフォルトの名無しさん
2021/07/11(日) 07:22:23.17ID:k3ZSGeVZ659デフォルトの名無しさん
2021/07/11(日) 09:13:47.20ID:NwP/aFzk とっくに書いてるよばーか
660デフォルトの名無しさん
2021/07/11(日) 09:20:59.49ID:LL6sPKEi 「管理」の定義が独り歩きしているがもともとは>>629-632だろ?
その意味では「管理」されているでいいんじゃね?
その意味では「管理」されているでいいんじゃね?
661デフォルトの名無しさん
2021/07/11(日) 10:40:25.91ID:cuQ6hQba662デフォルトの名無しさん
2021/07/11(日) 10:42:50.54ID:cuQ6hQba663デフォルトの名無しさん
2021/07/11(日) 10:50:14.49ID:f8Vvx+nx これは話をループさせる手段なのか?w
664デフォルトの名無しさん
2021/07/11(日) 11:20:11.96ID:zTx2mwKY 「Hacking: 美しき策謀 」ぐらいは読んでこいよ
665デフォルトの名無しさん
2021/07/11(日) 11:49:37.25ID:OgOa7vqd 本当に管理されていると言うのなら、別のlibで定義されている
HMODULE get_this_dll_module();
という関数によって、あらゆるDLLのHMODULEを取得できるようになるはずで
あるが、この関数は、スタックフレームを前提にしない限りは基本的に
作ることが出来ない。なぜなら
void get_this_dll_module() {
// ここの EIP の値は、呼び出しもとの DLL のものとは違っている。
}
からである。
HMODULE get_this_dll_module();
という関数によって、あらゆるDLLのHMODULEを取得できるようになるはずで
あるが、この関数は、スタックフレームを前提にしない限りは基本的に
作ることが出来ない。なぜなら
void get_this_dll_module() {
// ここの EIP の値は、呼び出しもとの DLL のものとは違っている。
}
からである。
666デフォルトの名無しさん
2021/07/11(日) 11:51:10.61ID:OgOa7vqd667デフォルトの名無しさん
2021/07/13(火) 12:38:32.06ID:WUJYnH4r だらだらしてるので
3行でまとめてくれ
3行でまとめてくれ
668デフォルトの名無しさん
2021/07/13(火) 12:47:15.46ID:oy1AsII3669デフォルトの名無しさん
2021/07/13(火) 13:19:09.51ID:bYykchBX そういうのは動物園でやれよ
670デフォルトの名無しさん
2021/07/13(火) 13:50:43.04ID:EtxXgsUj 無駄な議論ではなく、質問者が、現在実行中の関数の所属する
DLLを正確に取得する方法があると思い込んでいた可能性があるので
大事な指摘だった可能性がある。
結論から言えば、安定してそれを取得する方法は無い。
DLLを正確に取得する方法があると思い込んでいた可能性があるので
大事な指摘だった可能性がある。
結論から言えば、安定してそれを取得する方法は無い。
671デフォルトの名無しさん
2021/07/13(火) 14:46:12.78ID:imApokgP 質問者は普通に安定した方法で自己解決していったな
672デフォルトの名無しさん
2021/07/13(火) 16:28:34.84ID:NGIJbx4Y get_this_dll_moduleてなんなんってぐぐったら
このスレが引っかかってわろた
脳内の関数だったか
このスレが引っかかってわろた
脳内の関数だったか
673デフォルトの名無しさん
2021/07/13(火) 17:47:39.31ID:QuGmZAoV 未解決のせいで盛り上がってたのかと思ったら>>622で解決してたのか
674デフォルトの名無しさん
2021/07/14(水) 20:59:18.35ID:bf5Y3F+J >>620
他のこと調べてたら見つけたけど__ImageBaseって変数のアドレスがまさに目的そのものっぽいわね
https://devblogs.microsoft.com/oldnewthing/20041025-00/?p=37483
他のこと調べてたら見つけたけど__ImageBaseって変数のアドレスがまさに目的そのものっぽいわね
https://devblogs.microsoft.com/oldnewthing/20041025-00/?p=37483
675デフォルトの名無しさん
2021/07/14(水) 21:06:59.94ID:v50kRHgT 「D:\aaaa\bbbb」などの、ファイルやフォルダのパス名から、
そこがCDやDVDなどの光学ドライブかを判定する仕組みはありますか?
そこがCDやDVDなどの光学ドライブかを判定する仕組みはありますか?
676デフォルトの名無しさん
2021/07/14(水) 21:11:04.17ID:DOxWmp+E GetLogicalDriveStringsかな
677デフォルトの名無しさん
2021/07/14(水) 21:13:56.34ID:DOxWmp+E 途中送信ごめん
全ドライブ文字と種類がわかるから
後は比較するオレオレ関数作る感じ
全ドライブ文字と種類がわかるから
後は比較するオレオレ関数作る感じ
678デフォルトの名無しさん
2021/07/14(水) 21:15:40.83ID:DOxWmp+E 何度もごめん
種類はGetDriveTypeね
種類はGetDriveTypeね
679デフォルトの名無しさん
2021/07/14(水) 21:36:03.70ID:v50kRHgT >>678
ありがとうございます。
GetDriveTypeは、"D:\"の3文字の部分しか渡せないようですが、
PathGetDriveNumberでも使えば、"D:\"の部分だけを作れそうですね。
ありがとうございます。
GetDriveTypeは、"D:\"の3文字の部分しか渡せないようですが、
PathGetDriveNumberでも使えば、"D:\"の部分だけを作れそうですね。
680デフォルトの名無しさん
2021/07/15(木) 01:52:58.00ID:0fB1tPL7 リッチエディットに複数行の文字列をプログラムから定期的に送って全内容を更新するプログラムを作成しています。
更新中は垂直スクロールバーで任意の行に移動できるようにしています。
コードは下記です。
LRESULT Line = SendMessage( hEdit, EM_GETFIRSTVISIBLELINE, 0, 0 ); // 現在の表示行を控えておく
SendMessage( hEdit, WM_SETREDRAW, FALSE, 0 ); // 文字列更新中の状態が露呈しないよう再描画を抑制する
SetWindowText( hEdit, str ); // 全文字列更新
SendMessage( hEdit, EM_LINESCROLL, 0, -INT_MAX ); // 表示行を一番上に移動する
SendMessage( hEdit, EM_LINESCROLL, 0, Line ); // 表示行を、控えておいた位置に移動する
SendMessage( hEdit, WM_SETREDRAW, TRUE, 0 ); // 再描画再開
InvalidateRect( hEdit, NULL, FALSE ); // 表示を促す
これで、ある程度までの行数の文字列であれば、意図通りの挙動となるのですが、
行数が多くなってくると、動かしていたスクロールバーが一瞬一番下まで下がってから
元の位置に戻るという現象が文字列更新の度に起こります。
ただ、リッチエディット内の表示位置は、動かしていたスクロールバー位置に対応する位置のままで、
スクロールバーが一瞬一番下がる動きとは連動しません。
一体何が起こっており、どのようにすれば回避できそうでしょうか?
更新中は垂直スクロールバーで任意の行に移動できるようにしています。
コードは下記です。
LRESULT Line = SendMessage( hEdit, EM_GETFIRSTVISIBLELINE, 0, 0 ); // 現在の表示行を控えておく
SendMessage( hEdit, WM_SETREDRAW, FALSE, 0 ); // 文字列更新中の状態が露呈しないよう再描画を抑制する
SetWindowText( hEdit, str ); // 全文字列更新
SendMessage( hEdit, EM_LINESCROLL, 0, -INT_MAX ); // 表示行を一番上に移動する
SendMessage( hEdit, EM_LINESCROLL, 0, Line ); // 表示行を、控えておいた位置に移動する
SendMessage( hEdit, WM_SETREDRAW, TRUE, 0 ); // 再描画再開
InvalidateRect( hEdit, NULL, FALSE ); // 表示を促す
これで、ある程度までの行数の文字列であれば、意図通りの挙動となるのですが、
行数が多くなってくると、動かしていたスクロールバーが一瞬一番下まで下がってから
元の位置に戻るという現象が文字列更新の度に起こります。
ただ、リッチエディット内の表示位置は、動かしていたスクロールバー位置に対応する位置のままで、
スクロールバーが一瞬一番下がる動きとは連動しません。
一体何が起こっており、どのようにすれば回避できそうでしょうか?
681デフォルトの名無しさん
2021/07/15(木) 09:58:52.50ID:ux6gJq+a もしかしてそれって32767行くらい超えてから?
682680
2021/07/15(木) 12:02:49.75ID:0fB1tPL7 >>681
改行文字(\n)だけの80行くらいでも発生しました。
そして>>680の内容に訂正があります。
>動かしていたスクロールバーが一瞬一番下まで下がってから
は、一番下までは下がっていませんでした。
また、下がったときはバーが長くなっており、
あたかも行数が少なくなったかのよう(エディット内の表示は意図通り)な挙動です。
さらに、以下のような性質も分かりました。
・スクロールバー位置が一番上のときは一瞬下がる症状が発生しない
・スクロールバー位置が一定より下になると一瞬下がる症状が発生しない
・この位置は全体行数とリッチエディットの縦幅との関係によって変わり、
スクロールバーの長さが全体の大半を占める場合はどの位置でも発症しなくなる
改行文字(\n)だけの80行くらいでも発生しました。
そして>>680の内容に訂正があります。
>動かしていたスクロールバーが一瞬一番下まで下がってから
は、一番下までは下がっていませんでした。
また、下がったときはバーが長くなっており、
あたかも行数が少なくなったかのよう(エディット内の表示は意図通り)な挙動です。
さらに、以下のような性質も分かりました。
・スクロールバー位置が一番上のときは一瞬下がる症状が発生しない
・スクロールバー位置が一定より下になると一瞬下がる症状が発生しない
・この位置は全体行数とリッチエディットの縦幅との関係によって変わり、
スクロールバーの長さが全体の大半を占める場合はどの位置でも発症しなくなる
683デフォルトの名無しさん
2021/07/15(木) 13:08:28.58ID:ux6gJq+a >>682
キャレットが画面外にあるか画面内にあるかで挙動は変わったりする?
キャレットが画面外にあるか画面内にあるかで挙動は変わったりする?
684デフォルトの名無しさん
2021/07/15(木) 13:18:19.61ID:dBy6yJWz 一口にリッチエディットっていってもバージョンが4種類くらいあって
それぞれ微妙に動作が違ったような気がする
それぞれ微妙に動作が違ったような気がする
685680
2021/07/15(木) 14:06:57.14ID:0fB1tPL7686デフォルトの名無しさん
2021/07/15(木) 15:02:56.70ID:GxcfqrJG 特定プロセス(PID)のアドレス空間の情報を取得するAPIはありますか?
687デフォルトの名無しさん
2021/07/15(木) 15:17:12.92ID:ygp86UHP スクロールバーの描画も同時に禁止するとか
スクロール範囲の最大値も強制的に変更してから描画再開するとか
スクロール範囲の最大値も強制的に変更してから描画再開するとか
688デフォルトの名無しさん
2021/07/15(木) 15:39:38.74ID:SuupqHo1689680
2021/07/15(木) 16:21:18.89ID:0fB1tPL7 >>687
スクロールバーのハンドルを取得する方法が分からなかったので、
テキスト&スクロールバー位置更新時、ダイアログ全体の再描画を抑制してみましたが、
再描画がかかるタイミングでやはりスクロールバーが一瞬動きます。
スクロール範囲の最大値もテキスト更新前に控えておいた数値を、テキスト更新後に設定しましたが変わらずでした。
>>685
はい、>>682の条件です。
進展がありました。
SetWindowText()でテキスト更新をしていた部分を
SendMessage( hEdit, EM_SETSEL, 0, -1 );
SendMessage( hEdit, EM_REPLACESEL, FALSE, ( LPARAM )str );
と置き換えたところ、
スクロールバーを動かしても、その後、一瞬下に動くといったことがなくなり、
期待通りその場に留まり続けてくれました!
しかし、ダイアログのフォーカスを外した後、再度フォーカスを得ると、一番下に飛んでしまいます・・・。
惜しい・・・。
フォーカス取得の際、スクロールバー位置が更新されるものと思われますので、
そのときのウインドウメッセージを捕えて、テキスト更新時と同様にスクロールバー位置を制御すればいけるかもです。
スクロールバーのハンドルを取得する方法が分からなかったので、
テキスト&スクロールバー位置更新時、ダイアログ全体の再描画を抑制してみましたが、
再描画がかかるタイミングでやはりスクロールバーが一瞬動きます。
スクロール範囲の最大値もテキスト更新前に控えておいた数値を、テキスト更新後に設定しましたが変わらずでした。
>>685
はい、>>682の条件です。
進展がありました。
SetWindowText()でテキスト更新をしていた部分を
SendMessage( hEdit, EM_SETSEL, 0, -1 );
SendMessage( hEdit, EM_REPLACESEL, FALSE, ( LPARAM )str );
と置き換えたところ、
スクロールバーを動かしても、その後、一瞬下に動くといったことがなくなり、
期待通りその場に留まり続けてくれました!
しかし、ダイアログのフォーカスを外した後、再度フォーカスを得ると、一番下に飛んでしまいます・・・。
惜しい・・・。
フォーカス取得の際、スクロールバー位置が更新されるものと思われますので、
そのときのウインドウメッセージを捕えて、テキスト更新時と同様にスクロールバー位置を制御すればいけるかもです。
690デフォルトの名無しさん
2021/07/15(木) 16:33:06.78ID:t/RIbQSu >SendMessage( hEdit, EM_LINESCROLL, 0, -INT_MAX ); // 表示行を一番上に移動する
>SendMessage( hEdit, EM_LINESCROLL, 0, Line ); // 表示行を、控えておいた位置に移動する
これで振動してるような気もする
フォント高さ x 行数 と クライアント領域の高さが不一致な状態で
SetWindowText() で更新したとき、クライアント領域内の先頭行側が欠けて 最終行側がきっちり見えてるんだけど
上の2行の変わりに
SendMessage( hEdit, EM_LINESCROLL, 0, 0);
を投げると先頭行がきっちり収まる位置にきて、スクロールバーがピコピコすることもない雰囲気
>SendMessage( hEdit, EM_LINESCROLL, 0, Line ); // 表示行を、控えておいた位置に移動する
これで振動してるような気もする
フォント高さ x 行数 と クライアント領域の高さが不一致な状態で
SetWindowText() で更新したとき、クライアント領域内の先頭行側が欠けて 最終行側がきっちり見えてるんだけど
上の2行の変わりに
SendMessage( hEdit, EM_LINESCROLL, 0, 0);
を投げると先頭行がきっちり収まる位置にきて、スクロールバーがピコピコすることもない雰囲気
691デフォルトの名無しさん
2021/07/15(木) 17:34:53.12ID:SuupqHo1692蟻人間 ◆T6xkBnTXz7B0
2021/07/15(木) 18:00:01.33ID:P7zOCeng WM_VSCROLL.SB_TOP使った方がいいんじゃね?
693デフォルトの名無しさん
2021/07/15(木) 18:23:17.10ID:L0wYNjuD >>680
>SendMessage( hEdit, WM_SETREDRAW, FALSE, 0 ); // 文字列更新中の状態が露呈しないよう再描画を抑制する
↑は、RichEditControl のメッセージではなく、Win32のWindow一般のものらしい。
但し、MSDNには、ListBoxで複数のアイテムを追加するときに便利だと書いてある。
質問者の実験を聞く限り、RichEditControlにのみこのメッセージを送っただけでは、
そこにくっついているスクロールバーに対しては効果が無いようだ。
>SendMessage( hEdit, WM_SETREDRAW, FALSE, 0 ); // 文字列更新中の状態が露呈しないよう再描画を抑制する
↑は、RichEditControl のメッセージではなく、Win32のWindow一般のものらしい。
但し、MSDNには、ListBoxで複数のアイテムを追加するときに便利だと書いてある。
質問者の実験を聞く限り、RichEditControlにのみこのメッセージを送っただけでは、
そこにくっついているスクロールバーに対しては効果が無いようだ。
694デフォルトの名無しさん
2021/07/15(木) 18:45:09.69ID:L0wYNjuD Rich Edit Control を作成する時のスタイルに
WS_VSCROLL
を付け、
ES_DISABLENOSCROLL
を付け、
ES_AUTOVSCROLL
を外すと縦スクロールバーが出るが、勝手に制御されにくくなるかも。
WS_VSCROLL
を付け、
ES_DISABLENOSCROLL
を付け、
ES_AUTOVSCROLL
を外すと縦スクロールバーが出るが、勝手に制御されにくくなるかも。
695デフォルトの名無しさん
2021/07/15(木) 18:49:18.52ID:L0wYNjuD WM_SETREDRAWは、ListBoxに関しては色々語られている:
https://devblogs.microsoft.com/oldnewthing/20110124-00/?p=11683
https://devblogs.microsoft.com/oldnewthing/20110124-00/?p=11683
696デフォルトの名無しさん
2021/07/15(木) 18:55:04.61ID:L0wYNjuD SendMessage( hEdit, WM_SETREDRAW, FALSE, 0 );
は効果は有るにはあるが、アプリ側が自らスクロールバーを制御するようなメッセージを
Rich Edit Control に送った場合、↑の設定が無視されて、スクロールバーの描画が
起きてしまっている可能性がある。なので、
>SendMessage( hEdit, EM_LINESCROLL, 0, -INT_MAX ); // 表示行を一番上に移動する
>SendMessage( hEdit, EM_LINESCROLL, 0, Line ); // 表示行を、控えておいた位置に移動する
の部分、上の行を省いて、下の行だけにするとちらつかなくなる可能性が高い。
また、上の行の役割の代わりとして、カーソルの位置はスクロールの位置とは別に制御すると良いはず。
は効果は有るにはあるが、アプリ側が自らスクロールバーを制御するようなメッセージを
Rich Edit Control に送った場合、↑の設定が無視されて、スクロールバーの描画が
起きてしまっている可能性がある。なので、
>SendMessage( hEdit, EM_LINESCROLL, 0, -INT_MAX ); // 表示行を一番上に移動する
>SendMessage( hEdit, EM_LINESCROLL, 0, Line ); // 表示行を、控えておいた位置に移動する
の部分、上の行を省いて、下の行だけにするとちらつかなくなる可能性が高い。
また、上の行の役割の代わりとして、カーソルの位置はスクロールの位置とは別に制御すると良いはず。
697680
2021/07/16(金) 01:36:18.95ID:iUp23Wxq >>690
EM_LINESCROLLは現在位置からの移動を指示するので、
SendMessage( hEdit, EM_LINESCROLL, 0, 0);
だと何も作用がありませんね。
>>691
>>689の処理ですが、WM_ACTIVATE後、次のテキスト更新までの間に、スクロールバーが一番下に移動する動きが確認できました。
>>692
SB_TOPで一番上に戻しても症状は同じでした。
>>693
再描画抑制をしないと、テキスト更新の際の過渡的な状態が露呈し、スクロールバーも一瞬動くのが見えたりするのですが、
再描画抑制により、これらが露呈しなくなるので、スクロールバーにも効果があるようです。
>>694
試してみましたが症状変わらずでした。
>>695
英語が苦手で完全には理解できないのですが、
再描画抑制解除後のWM_PAINTあたりでスクロールバー位置が更新され動いてしまうということがあり得そうですね。
>>696
上記の通り、
EM_LINESCROLLは現在位置からの移動を指示するので、
SendMessage( hEdit, EM_LINESCROLL, 0, Line );
だと下に動き続けてしまいます。
試しにリッチじゃないエディットボックス(MultiLine有効)に置き換えたところ、すんなりいきました。
前にも試したことがあったんですが、リッチエディットが\nだけで改行されるのに対し、
エディットボックスでは改行されなかったのでダメだと思っていました。
本日、エディットボックスの場合は\r\nで改行されることを知り、これでうまくいきました。
\rが増える分、更新(転送)する文字量が増えてしまいますし、その他、リッチエディットとは異なり、
・ReadOnlyだと背景がグレーになる(審美的にはリッチエディットのような白が好ましい)
・表示矩形内に文字が収まっていてもスクロールバーの枠が表示される
・表示がたまにチラツく
といった気になる点があるのですが、不安定なスクロールバーに比べたら許容範囲です。
多数のご助言をいただき、ありがとうございました。
EM_LINESCROLLは現在位置からの移動を指示するので、
SendMessage( hEdit, EM_LINESCROLL, 0, 0);
だと何も作用がありませんね。
>>691
>>689の処理ですが、WM_ACTIVATE後、次のテキスト更新までの間に、スクロールバーが一番下に移動する動きが確認できました。
>>692
SB_TOPで一番上に戻しても症状は同じでした。
>>693
再描画抑制をしないと、テキスト更新の際の過渡的な状態が露呈し、スクロールバーも一瞬動くのが見えたりするのですが、
再描画抑制により、これらが露呈しなくなるので、スクロールバーにも効果があるようです。
>>694
試してみましたが症状変わらずでした。
>>695
英語が苦手で完全には理解できないのですが、
再描画抑制解除後のWM_PAINTあたりでスクロールバー位置が更新され動いてしまうということがあり得そうですね。
>>696
上記の通り、
EM_LINESCROLLは現在位置からの移動を指示するので、
SendMessage( hEdit, EM_LINESCROLL, 0, Line );
だと下に動き続けてしまいます。
試しにリッチじゃないエディットボックス(MultiLine有効)に置き換えたところ、すんなりいきました。
前にも試したことがあったんですが、リッチエディットが\nだけで改行されるのに対し、
エディットボックスでは改行されなかったのでダメだと思っていました。
本日、エディットボックスの場合は\r\nで改行されることを知り、これでうまくいきました。
\rが増える分、更新(転送)する文字量が増えてしまいますし、その他、リッチエディットとは異なり、
・ReadOnlyだと背景がグレーになる(審美的にはリッチエディットのような白が好ましい)
・表示矩形内に文字が収まっていてもスクロールバーの枠が表示される
・表示がたまにチラツく
といった気になる点があるのですが、不安定なスクロールバーに比べたら許容範囲です。
多数のご助言をいただき、ありがとうございました。
698デフォルトの名無しさん
2021/07/16(金) 01:48:03.35ID:5FJrAAJE どうでもいいけどWin32とかの文字列の型名わかりずらすぎて嫌がらせとしか思えない
なんだよLPCTSTRってconst wchar_t*でいいだろ
なんだよLPCTSTRってconst wchar_t*でいいだろ
699デフォルトの名無しさん
2021/07/16(金) 11:06:31.00ID:rEsqDZWm それだとLPCWSTRでは
700デフォルトの名無しさん
2021/07/16(金) 11:36:36.57ID:teDb7k99 スカラ値へのポインタではなく配列先頭アドレスですよという意図は一応あるのかもしれない
701デフォルトの名無しさん
2021/07/16(金) 11:42:16.54ID:5FJrAAJE702デフォルトの名無しさん
2021/07/16(金) 11:57:18.77ID:teDb7k99 UNICODE マクロが定義されていればそれはそう
703デフォルトの名無しさん
2021/07/16(金) 11:58:40.86ID:wMimqxZO Tがつく奴はUNICODEの定義の有無でwchar_tかcharに変わるから
704デフォルトの名無しさん
2021/07/16(金) 13:31:01.23ID:rEsqDZWm705デフォルトの名無しさん
2021/07/16(金) 14:39:23.11ID:qFBlhvM+ UNICODE対応とはいわばUTF8に対応していると思っている僕がかつて居ました
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国側が首相答弁の撤回要求、日本側拒否★6 [夜のけいちゃん★]
- 「厚かましい挑発的発言だ」中国国連大使が高市首相発言に強く反発 日本の常任理事国入りに明確に反対 [ぐれ★]
- 自民、経済対策で子ども1人に2万円給付へ 児童手当に上乗せ 所要額は約4000億円 [ぐれ★]
- 解体ごみ約2.3トンを山に不法投棄か トルコ国籍解体工を逮捕 埼玉 [どどん★]
- 債券・円・株「トリプル安」に…長期金利1.755%まで上昇、円は対ユーロで史上最安値 ★3 [蚤の市★]
- 【おこめ】10月のコメ取引価格が過去最高値を更新…2024年より6割上昇 販売価格は高値が続く可能性 [ぐれ★]
- 【安倍悲報】ワイ、山上裁判傍聴、またも落選 [947332727]
- 【高市悲報】官房長官「局長がペコペコしてる画像が拡散しているが日本は承知しとらん😡中国に申し入れした!」🤔 [359965264]
- 【悲報】高市早苗さん、たった一人で日本を崩壊へ導く [714769305]
- 【悲報】「やったー!こだわりまくった洋館仕立ての家を建てたぞ!」➡「「離婚したんで住まずに売ります……」 [158478931]
- 精神する時の🏡
- 愛国者「高市総理が威勢よく吠えてなければこんな事態にはなってないって話に変わってるけど、元はといえばこいつがきっかけだからね?」 [856698234]
