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:ZJ42fMZB384デフォルトの名無しさん
2020/11/12(木) 12:17:21.07ID:f5BAQJxF あと 6 だけ実行する別のアプリを造っておいて
アプリ終了後にそれを呼ぶとか
アプリ終了後にそれを呼ぶとか
385デフォルトの名無しさん
2020/11/12(木) 12:23:11.40ID:Twa29Hwt >>383
モニタしてみる。
モニタしてみる。
386デフォルトの名無しさん
2020/11/12(木) 12:25:59.48ID:Twa29Hwt ・・・呼ばれてない
387デフォルトの名無しさん
2020/11/12(木) 12:31:44.05ID:Twa29Hwt 379です。進展しそうなので、この質問はいったんクローズさせてください。
グーグル先生に「dll_process_detach 呼ばれない」と聞くと、イロイロ出て
きそうです。
381、383 ありがとうございました m(_ _)m
グーグル先生に「dll_process_detach 呼ばれない」と聞くと、イロイロ出て
きそうです。
381、383 ありがとうございました m(_ _)m
388デフォルトの名無しさん
2020/11/12(木) 17:06:23.69ID:n8RQesMu 呼び出しプロセスが終了するまではDLLの解放はされなかった気がする
つまり>>384が正解なのではないかと
つまり>>384が正解なのではないかと
389デフォルトの名無しさん
2020/11/12(木) 20:28:25.76ID:g7bSPYZf 32bitアプリからShellExecuteでバッチファイルを呼ぶと当然ながら32bit環境で実行されるんだけど
これを64bitに強制できないかな
これを64bitに強制できないかな
390蟻人間 ◆T6xkBnTXz7B0
2020/11/12(木) 20:47:44.37ID:vr1SOjIj >>389
Wow64DisableWow64FsRedirectionを使う痛い方法があるけど、推奨できない。64bit processを経由した方が痛みは少ない。
Wow64DisableWow64FsRedirectionを使う痛い方法があるけど、推奨できない。64bit processを経由した方が痛みは少ない。
391デフォルトの名無しさん
2020/11/12(木) 20:48:10.58ID:g7bSPYZf でてきた
PVOID m_lpOldVar = 0;
Wow64DisableWow64FsRedirection(&m_lpOldVar);
//この間に書けばいいらしい
ShellExecute(hWnd,"open","cmd","param","dir",SW_SHOWNORMAL);
Wow64RevertWow64FsRedirection(&m_lpOldVar);
これでいいのかな?
PVOID m_lpOldVar = 0;
Wow64DisableWow64FsRedirection(&m_lpOldVar);
//この間に書けばいいらしい
ShellExecute(hWnd,"open","cmd","param","dir",SW_SHOWNORMAL);
Wow64RevertWow64FsRedirection(&m_lpOldVar);
これでいいのかな?
392デフォルトの名無しさん
2020/11/12(木) 20:53:06.64ID:g7bSPYZf ほんとは32bitアプリを64bit化すりゃいいんだけど思いの外大変なので諦めた
以下バッチ側で判定する方法
@echo off
if %PROCESSOR_ARCHITECTURE%==x86 (
if "%PROCESSOR_ARCHITEW6432%" == "AMD64" (
rem 32bit WOW64
C:\Windows\sysnative\cmd.exe /c %~dp0%~n0%~x0
exit /b 0
) else (
goto :PASSX64
)
) else (
goto :PASSX64
)
:PASSX64
以降x64前提の処理
以下バッチ側で判定する方法
@echo off
if %PROCESSOR_ARCHITECTURE%==x86 (
if "%PROCESSOR_ARCHITEW6432%" == "AMD64" (
rem 32bit WOW64
C:\Windows\sysnative\cmd.exe /c %~dp0%~n0%~x0
exit /b 0
) else (
goto :PASSX64
)
) else (
goto :PASSX64
)
:PASSX64
以降x64前提の処理
393蟻人間 ◆T6xkBnTXz7B0
2020/11/12(木) 20:54:02.43ID:vr1SOjIj リダイレクトを無効化して、system32のcmdを指定すればいけるやろ。
394デフォルトの名無しさん
2020/11/12(木) 22:20:33.81ID:4764QnvC プロセス起動だけを担当する小さな64bitアプリを作ればいいじゃない。
395デフォルトの名無しさん
2020/11/15(日) 15:23:41.28ID:18uzJ+HT 379です。
LoadLibrary()でロードしたDLLが呼び出しプロセスから削除できない件のご報告。
方法が正しいのか悪いのか(不具合を発生させる可能性を持つのか)わかりませんが、
削除することには成功しました。383さんがご指摘の「DLL_PROCESS_DETACH
が呼ばれてないんじゃない?」とMSDNのFreeLibraryの文書をヒントに、
FreeLibrary()がゼロを返すまで複数回繰り返す方法で対処できました。DLLモ
ジュールへの参照数が無くなった時点でDLL_PROCESS_DETACHが発生するよう
です。また、ゼロを返した時のGetLastError()値は126(ERROR_MOD_NOT_FOUND)
です。
適当にいじりながらモニタしてみるました。すると、DLL_PROCESS_ATTACHは
1回しか呼び出されていないにもかかわらず、DLLモジュールは1または2の参照カ
ウントを持っているようです。どのタイミングで2になるのか、また3回目が発生
しないのかは、追い切れていません(汗。エラー検出で正常・・・的な行儀のよい
コードとは思えませんが、とりあえず、要モニタリングで先に進みたいとおもいま
す。
このあたり、お詳しい方がおられましたらご指導いただけると助かります。今のと
ころ困ってはいませんので、お暇なときにでも^^。ありがとうございました。
LoadLibrary()でロードしたDLLが呼び出しプロセスから削除できない件のご報告。
方法が正しいのか悪いのか(不具合を発生させる可能性を持つのか)わかりませんが、
削除することには成功しました。383さんがご指摘の「DLL_PROCESS_DETACH
が呼ばれてないんじゃない?」とMSDNのFreeLibraryの文書をヒントに、
FreeLibrary()がゼロを返すまで複数回繰り返す方法で対処できました。DLLモ
ジュールへの参照数が無くなった時点でDLL_PROCESS_DETACHが発生するよう
です。また、ゼロを返した時のGetLastError()値は126(ERROR_MOD_NOT_FOUND)
です。
適当にいじりながらモニタしてみるました。すると、DLL_PROCESS_ATTACHは
1回しか呼び出されていないにもかかわらず、DLLモジュールは1または2の参照カ
ウントを持っているようです。どのタイミングで2になるのか、また3回目が発生
しないのかは、追い切れていません(汗。エラー検出で正常・・・的な行儀のよい
コードとは思えませんが、とりあえず、要モニタリングで先に進みたいとおもいま
す。
このあたり、お詳しい方がおられましたらご指導いただけると助かります。今のと
ころ困ってはいませんので、お暇なときにでも^^。ありがとうございました。
396デフォルトの名無しさん
2020/11/15(日) 15:57:26.98ID:1cE4y5+G >FreeLibrary()がゼロを返すまで複数回繰り返す
なるほど
自分以外が使ってないことが確実に言えるならこれで良いんじゃないかな
なるほど
自分以外が使ってないことが確実に言えるならこれで良いんじゃないかな
397デフォルトの名無しさん
2020/11/15(日) 16:00:32.57ID:U+/Dwi3J 実は自分で 2回 LoadLibrary してましたというオチですね判ります
398デフォルトの名無しさん
2020/11/15(日) 16:26:04.91ID:e/1XaXi9 ズコー
LoadLibraryをAPIHookしちゃおうぜ
LoadLibraryをAPIHookしちゃおうぜ
399デフォルトの名無しさん
2020/11/15(日) 18:00:54.67ID:18uzJ+HT 長文で申し訳ない。
396
自分しか使っていないDLLであることは間違い無いので・・・とりあえず現状で
すすめる感じ。動いてるからOKは無能感アリアリです。リファレンスカウント
を追いかける事もできるようですが、沼入間違いなし。もし3回目が発生したら
ワーニング出してるので、報告してもらいます。ありがと。フックの時、DLLイン
スタンスを与えてるので、その時、参照が追加されるのかな、などと妄想するわけ
です。
297
判りますか!・・・さすがです。あおりでないと思ってマジレス。
ユーザの起因でLoadLibraryが2回実行される可能性として思い当たるのが:
1.メインプロセスが終了していないうちにデバグなどで再度起動しちゃった。
2.LoadLibrary呼び出しのの箇所をプログラムカウンタが2回通過している。
辺りでしょうか。1は、多重起動が排除されていて、かつタスクマネジャにも出て
いないので可能性が低い。2は、ブレークポイントとprintf()でモニタしてて多分
ないかなぁ。他アドバイスありましたらよろしくお願いいたしますm(_ _)m。
398
LoadLibraryをフックして、どのタイミングで呼び出されるのかを理解する感じ
ですか?APIフックかぁ・・・経験値が足りないのでハマりそうだなぁ。thx。
396
自分しか使っていないDLLであることは間違い無いので・・・とりあえず現状で
すすめる感じ。動いてるからOKは無能感アリアリです。リファレンスカウント
を追いかける事もできるようですが、沼入間違いなし。もし3回目が発生したら
ワーニング出してるので、報告してもらいます。ありがと。フックの時、DLLイン
スタンスを与えてるので、その時、参照が追加されるのかな、などと妄想するわけ
です。
297
判りますか!・・・さすがです。あおりでないと思ってマジレス。
ユーザの起因でLoadLibraryが2回実行される可能性として思い当たるのが:
1.メインプロセスが終了していないうちにデバグなどで再度起動しちゃった。
2.LoadLibrary呼び出しのの箇所をプログラムカウンタが2回通過している。
辺りでしょうか。1は、多重起動が排除されていて、かつタスクマネジャにも出て
いないので可能性が低い。2は、ブレークポイントとprintf()でモニタしてて多分
ないかなぁ。他アドバイスありましたらよろしくお願いいたしますm(_ _)m。
398
LoadLibraryをフックして、どのタイミングで呼び出されるのかを理解する感じ
ですか?APIフックかぁ・・・経験値が足りないのでハマりそうだなぁ。thx。
400デフォルトの名無しさん
2020/11/15(日) 18:03:54.84ID:pziaxEZW >>395
FreeLibrary()は何回呼び出して何回目でゼロが返ってきてるの?
FreeLibrary()は何回呼び出して何回目でゼロが返ってきてるの?
401デフォルトの名無しさん
2020/11/15(日) 18:54:05.48ID:18uzJ+HT 400さん、レスありがとう。実際のコードはi値の制限などもちっと複雑なので
すが、感じとしては、WinMainに以下のように記されています。
1: i=0;
2: for(;;) {
3: i++;
4: ret=FreeLibrary(dllinst);
5: if(res==0) {
6: n=GetLastError();
7: break;
8: }
9: }
場合によるのですが、ループを出た時のi値は2か3を示します。nは126です。
i値が2になるケース、3になるケースは、初回投稿 >>379 に示してあります。
フックの初回呼び出しにリファレンスが追加・・・かなぁ(妄想。
すが、感じとしては、WinMainに以下のように記されています。
1: i=0;
2: for(;;) {
3: i++;
4: ret=FreeLibrary(dllinst);
5: if(res==0) {
6: n=GetLastError();
7: break;
8: }
9: }
場合によるのですが、ループを出た時のi値は2か3を示します。nは126です。
i値が2になるケース、3になるケースは、初回投稿 >>379 に示してあります。
フックの初回呼び出しにリファレンスが追加・・・かなぁ(妄想。
402デフォルトの名無しさん
2020/11/15(日) 19:40:59.29ID:pziaxEZW >>401
4でretなのに5でresなのは誤字かな?
4でretなのに5でresなのは誤字かな?
403デフォルトの名無しさん
2020/11/15(日) 19:54:35.90ID:pziaxEZW というか>>379でいうと
> 3: ...あれやこれやの処理...
ここに原因があるってことでしょ
そこ次第じゃないの?
> 3: ...あれやこれやの処理...
ここに原因があるってことでしょ
そこ次第じゃないの?
404デフォルトの名無しさん
2020/11/15(日) 20:18:38.41ID:qoaGDZ/5 まず>>379の1の直前・直後での山椒カウンターから調べてみるとか
405デフォルトの名無しさん
2020/11/15(日) 20:46:59.18ID:ALi3WLRE LoadLibraryの参照カウンタって簡単に取れたっけ?
昔DDKのヘッダ持ってきてゴニョゴニョやった気がする。
しかもwin7と8以降で構造体定義が違ったり。
昔DDKのヘッダ持ってきてゴニョゴニョやった気がする。
しかもwin7と8以降で構造体定義が違ったり。
406デフォルトの名無しさん
2020/11/15(日) 20:52:47.67ID:gutimSe2 成功するまで n回 FreeLibraryを試みて LoadLibrary しなおす?
ATTACH と DETACH が副作用おこすかもだけど
ATTACH と DETACH が副作用おこすかもだけど
407デフォルトの名無しさん
2020/11/15(日) 21:30:45.30ID:18uzJ+HT みなさん、こんな漠然とした質問に答えてくださってありがとう。
404さん、405さん。参照カウンタの取得は、現象の理解に役に立つとは思います
が・・・なにぶん日曜プログラマなものですから。
google先生 「win32api how to get dll reference count」
でめぼしい情報はPEB(Process environment block)のLDR_MODULE構造体がう
んちゃらで(マト違い?)、ハードルの高さを感じました。
406さん。おっしゃる通りです。ユーザーのコード内でLoadLibraryが1度だけ
呼ばれるのだけど、参照カウンタが2になっている点は重要と認識しています。
3になるかもしれないし、いつ増えるかも妄想の範囲を出ません。FreeLibrary
するループ内で参照カウンタが変化かもとかゾッとします。
というわけで、今のところ警告を出して他の現象も集めてみたいと思っています。
が、人に使ってもらうレベルでは、参照カウンタの振る舞いは押さえておかないと
いけないという認識です。
404さん、405さん。参照カウンタの取得は、現象の理解に役に立つとは思います
が・・・なにぶん日曜プログラマなものですから。
google先生 「win32api how to get dll reference count」
でめぼしい情報はPEB(Process environment block)のLDR_MODULE構造体がう
んちゃらで(マト違い?)、ハードルの高さを感じました。
406さん。おっしゃる通りです。ユーザーのコード内でLoadLibraryが1度だけ
呼ばれるのだけど、参照カウンタが2になっている点は重要と認識しています。
3になるかもしれないし、いつ増えるかも妄想の範囲を出ません。FreeLibrary
するループ内で参照カウンタが変化かもとかゾッとします。
というわけで、今のところ警告を出して他の現象も集めてみたいと思っています。
が、人に使ってもらうレベルでは、参照カウンタの振る舞いは押さえておかないと
いけないという認識です。
408デフォルトの名無しさん
2020/11/15(日) 21:38:16.46ID:18uzJ+HT 追記:
LoadLibraryが2度呼ばれてましたとかいうオチの時は、正直に詫びを入れることを
お約束いたします。いやマジで、ユーザーコード全部で記述は1ヶ所だけし、2回通っ
てないし(大汗。
LoadLibraryが2度呼ばれてましたとかいうオチの時は、正直に詫びを入れることを
お約束いたします。いやマジで、ユーザーコード全部で記述は1ヶ所だけし、2回通っ
てないし(大汗。
409蟻人間 ◆T6xkBnTXz7B0
2020/11/15(日) 21:50:53.68ID:Ixphny8D LoadLibraryしたライブラリの名前は何ですか?
410デフォルトの名無しさん
2020/11/15(日) 22:22:34.55ID:18uzJ+HT exeと同じディレクトリに置かれたtmp.dllという名前です。DLLによっては、
参照が増える可能性があるということでしょうか。私が書いたコードですが中
身はほぼ空っぽです。たまにデバグやモニタの為にprintfします。コピペで手
加工のためtypoしてたらごめんなさい。
* tmpdll.cppの中身
01: BOOL APIENTRY DllMain(
02: HINSTANCE hinst,
03: DWORD reason,
04: LPVOID rsv
05: ) {
06: switch (reason) {
07: case DLL_PROCESS_ATTACH:
08: DisableThreadLibraryCalls(hinst);
09: break;
10: case DLL_PROCESS_DETACH:
11: break;
12: case DLL_THREAD_ATTACH:
13: break;
14: case DLL_THREAD_DETACH:
15: break;
16: default:
17: break;
18: }
19: return TRUE;
20: }
* コンパイルコマンド:
>cl.exe /LD tmpdll.cpp User32.lib
>move tmpdll.dll tmp.dll
すいませんが、今日はもうレスできません。作業は停滞から抜け出れてますので、
どうかヒマつぶし程度の軽い気持ちで受け答えください(大汗。
参照が増える可能性があるということでしょうか。私が書いたコードですが中
身はほぼ空っぽです。たまにデバグやモニタの為にprintfします。コピペで手
加工のためtypoしてたらごめんなさい。
* tmpdll.cppの中身
01: BOOL APIENTRY DllMain(
02: HINSTANCE hinst,
03: DWORD reason,
04: LPVOID rsv
05: ) {
06: switch (reason) {
07: case DLL_PROCESS_ATTACH:
08: DisableThreadLibraryCalls(hinst);
09: break;
10: case DLL_PROCESS_DETACH:
11: break;
12: case DLL_THREAD_ATTACH:
13: break;
14: case DLL_THREAD_DETACH:
15: break;
16: default:
17: break;
18: }
19: return TRUE;
20: }
* コンパイルコマンド:
>cl.exe /LD tmpdll.cpp User32.lib
>move tmpdll.dll tmp.dll
すいませんが、今日はもうレスできません。作業は停滞から抜け出れてますので、
どうかヒマつぶし程度の軽い気持ちで受け答えください(大汗。
411デフォルトの名無しさん
2020/11/15(日) 23:47:17.82ID:+e2tZbOG 参照カウントは、読み込んだ・実行した回数と関係ないだろ。
複数のプロセスから、参照されていれば、2 以上になるだけだろ
自分が参照すれば1で、
OS も参照すれば、2じゃないの?
自分で参照回数を、0にすべきじゃない。
OSが使っているかも知れないし
OSが何をやっているのか、勉強していない香具師は、妙な事を考えない方がよい。
OSの勉強だけで、何十年も掛かるから
複数のプロセスから、参照されていれば、2 以上になるだけだろ
自分が参照すれば1で、
OS も参照すれば、2じゃないの?
自分で参照回数を、0にすべきじゃない。
OSが使っているかも知れないし
OSが何をやっているのか、勉強していない香具師は、妙な事を考えない方がよい。
OSの勉強だけで、何十年も掛かるから
412デフォルトの名無しさん
2020/11/16(月) 00:11:34.75ID:o4udgoJm ウイルス対策ソフトによる介入まで考えたらさらに増える。
413デフォルトの名無しさん
2020/11/16(月) 00:34:28.20ID:QRq3yxwv >>411
ここで言ってるのはプロセス内の話だぞ?
LoadLibraryを2回やったらFreeLibraryも2回呼ばなきゃならんという話。
>OSが何をやっているのか、勉強していない香具師は、妙な事を考えない方がよい。
ここで言ってるのはプロセス内の話だぞ?
LoadLibraryを2回やったらFreeLibraryも2回呼ばなきゃならんという話。
>OSが何をやっているのか、勉強していない香具師は、妙な事を考えない方がよい。
414411
2020/11/16(月) 01:24:18.28ID:9JpVGitI DLL を2回も呼ぶのか?
一々、DLLをロードしてから、フリーするとか、
そんなに厳密に、メモリを気にしなくても良いのでは?
初心者は、そんな些末な事に、時間を掛けるべきじゃないと思う。
どうせ、1MB とか、ほぼ64 bit では無意味な節約だろ
そういうのを気にしていたら、Ruby などでプログラミングできない。
皆、富豪プログラミングなのにw
一々、DLLをロードしてから、フリーするとか、
そんなに厳密に、メモリを気にしなくても良いのでは?
初心者は、そんな些末な事に、時間を掛けるべきじゃないと思う。
どうせ、1MB とか、ほぼ64 bit では無意味な節約だろ
そういうのを気にしていたら、Ruby などでプログラミングできない。
皆、富豪プログラミングなのにw
415デフォルトの名無しさん
2020/11/16(月) 01:34:45.83ID:X7NjX7T3 411は何も解ってない
416デフォルトの名無しさん
2020/11/16(月) 03:56:24.82ID:+pimEm7D LoadLibraryの参照カウンタはプロセス単位
質問者はDLL_PROCESS_ATTACHが複数回呼ばれると思ってるようだが複数回LoadLibraryしても呼ばれるのは最初の1回だけ
質問者はDLL_PROCESS_ATTACHが複数回呼ばれると思ってるようだが複数回LoadLibraryしても呼ばれるのは最初の1回だけ
417デフォルトの名無しさん
2020/11/16(月) 08:05:49.89ID:cFXcINFw おはようさん。ゆるくいってもらえるとうれしい。
413さん。LoadLibraryを複数回呼べば参照カウンタはそれだけ増えます。
その場合、増えた原因がLoadLibraryと明らかなので特に問題ないと考えます。
わからないのはLoadLibraryが1度のつもりなのに、場合によって一つ増える
現象が不思議だなってあたり。
414さん。まったくその通りです。実際、削除してみたいというのは今のところ
技術的な興味だけで、参照カウンタの増加原因がコードのどの部分なのかが
わかれば自分が面白いという点だけです。対応策は削除しない策も含めて2、3
考えていて重大ではなくなっています。時間がもったいないですね。
461さん。アプリケーションが起動されたプロセスで、DLL_PROCESS_ATTACH
はLoadLibraryの時に1度、DLL_PROCESS_DETACHはFreeLibraryにより参照カ
ウンタが0になった時に1度だけです。このように理解していますが^^;。
参照カウンタはプロセス毎に持っていて、自プロセスのFreeLibraryが2回成功
するということは、自プロセスの参照カウンタが2になっていると考えていま
す。他のプロセスがtmp.dllをロードしても、自プロセスの持つ参照カウンタは
増えません。予想の範囲をでませんが、自分の書いたコードの中のあるAPI関数
が参照カウンタを増やしている、たぶん初回のフックプロシジャ起動の時に増え
てるっぽい。ですので、現象を正しく理解するには、結局の所、参照カウンタを
モニタして増減のポイントを押さえ、可否を判断するのが本道かなとも思います
・・・難しそうですよね。APIは勝手に参照カウンタ増やすよ?なんてアドバイ
スがあると、よかったのですが。
長文でくどくなって、イラついている人がいそうですね。この辺で、一度この話
題から私は離れたいと思います。アドバイスくださった方がた、どうもありがと
うございました。
413さん。LoadLibraryを複数回呼べば参照カウンタはそれだけ増えます。
その場合、増えた原因がLoadLibraryと明らかなので特に問題ないと考えます。
わからないのはLoadLibraryが1度のつもりなのに、場合によって一つ増える
現象が不思議だなってあたり。
414さん。まったくその通りです。実際、削除してみたいというのは今のところ
技術的な興味だけで、参照カウンタの増加原因がコードのどの部分なのかが
わかれば自分が面白いという点だけです。対応策は削除しない策も含めて2、3
考えていて重大ではなくなっています。時間がもったいないですね。
461さん。アプリケーションが起動されたプロセスで、DLL_PROCESS_ATTACH
はLoadLibraryの時に1度、DLL_PROCESS_DETACHはFreeLibraryにより参照カ
ウンタが0になった時に1度だけです。このように理解していますが^^;。
参照カウンタはプロセス毎に持っていて、自プロセスのFreeLibraryが2回成功
するということは、自プロセスの参照カウンタが2になっていると考えていま
す。他のプロセスがtmp.dllをロードしても、自プロセスの持つ参照カウンタは
増えません。予想の範囲をでませんが、自分の書いたコードの中のあるAPI関数
が参照カウンタを増やしている、たぶん初回のフックプロシジャ起動の時に増え
てるっぽい。ですので、現象を正しく理解するには、結局の所、参照カウンタを
モニタして増減のポイントを押さえ、可否を判断するのが本道かなとも思います
・・・難しそうですよね。APIは勝手に参照カウンタ増やすよ?なんてアドバイ
スがあると、よかったのですが。
長文でくどくなって、イラついている人がいそうですね。この辺で、一度この話
題から私は離れたいと思います。アドバイスくださった方がた、どうもありがと
うございました。
418デフォルトの名無しさん
2020/11/16(月) 08:26:01.14ID:bJvdDL6U 自発的なdllの削除ってなると >>412 の件は厄介かもな
419411
2020/11/16(月) 09:50:44.37ID:9JpVGitI Windows は、クローズドOS だから、何をやってるか分からない
ファイルをロックするためにとか、メモリから追い出されないために、
参照回数を増加させるかも知れない
だから、自分が1回しか呼んでいなのなら、参照回数を2回減らしてはいけない。
2回減らしても、無視されるだけかも知れないけど
自分が増やした分だけを、減らすべき!
ファイルをロックするためにとか、メモリから追い出されないために、
参照回数を増加させるかも知れない
だから、自分が1回しか呼んでいなのなら、参照回数を2回減らしてはいけない。
2回減らしても、無視されるだけかも知れないけど
自分が増やした分だけを、減らすべき!
420デフォルトの名無しさん
2020/11/16(月) 12:14:15.53ID:Hr3Y8q39 なんか参照カウントと単なるカウンタが入り乱れてそうな流れ
421デフォルトの名無しさん
2020/11/16(月) 12:21:40.31ID:sF1WJXNT 全部読まずにresするが
元々自分のexeの依存dllにそのdllを入れちゃってるのに
さらにLoadLibraryしてるとかかな
元々自分のexeの依存dllにそのdllを入れちゃってるのに
さらにLoadLibraryしてるとかかな
422デフォルトの名無しさん
2020/11/16(月) 20:18:45.97ID:kmoq+Q7j DLLのコードもあるなら別にDLLで無くてもいいのではと思ってしまうw
423デフォルトの名無しさん
2020/11/24(火) 20:44:41.98ID:/h51r/r1424デフォルトの名無しさん
2020/11/26(木) 18:31:15.60ID:ryn8MPPQ どうなってんの?
void ListView_GetItemCount(
hwnd
);
https://docs.microsoft.com/en-us/windows/win32/api/commctrl/nf-commctrl-listview_getitemcount
void ListView_GetItemCount(
hwnd
);
https://docs.microsoft.com/en-us/windows/win32/api/commctrl/nf-commctrl-listview_getitemcount
425デフォルトの名無しさん
2020/11/26(木) 19:21:32.18ID:+pStE+xj 普通そういう時はメッセージの方見るよね
426デフォルトの名無しさん
2020/11/26(木) 19:21:58.33ID:AZoEWn7U 言語的お作法
427デフォルトの名無しさん
2020/11/26(木) 19:47:30.99ID:35iFwdoe マクロだし
428デフォルトの名無しさん
2020/11/26(木) 20:19:49.68ID:ryn8MPPQ なんか滅茶苦茶だな
古いMSDNライブラリ2008ではshellコントロールもCE5.0も正しい定義が出てる
メンテ止めても表示崩す必要無いだろに...
https://docs.microsoft.com/en-us/previous-versions/windows/embedded/aa453326(v=msdn.10)
久々にapi使ってコード書こうかと思ったがガックリだわ
古いMSDNライブラリ2008ではshellコントロールもCE5.0も正しい定義が出てる
メンテ止めても表示崩す必要無いだろに...
https://docs.microsoft.com/en-us/previous-versions/windows/embedded/aa453326(v=msdn.10)
久々にapi使ってコード書こうかと思ったがガックリだわ
429デフォルトの名無しさん
2020/11/27(金) 18:59:42.70ID:Iha9xPer ListView_GetItemCount
Retrieves the number of items in a list-view control. You can use this macro or send the LVM_GETITEMCOUNT message explicitly.
int ListView_GetItemCount(
HWND hwnd
);
Parameters
hwnd
Handle to the list-view control.
Return Values
Returns the number of items.
Retrieves the number of items in a list-view control. You can use this macro or send the LVM_GETITEMCOUNT message explicitly.
int ListView_GetItemCount(
HWND hwnd
);
Parameters
hwnd
Handle to the list-view control.
Return Values
Returns the number of items.
430デフォルトの名無しさん
2020/11/27(金) 20:15:59.56ID:k8xXZ238 エラーの詳細を取得するには、関数を使います。
431デフォルトの名無しさん
2020/12/08(火) 15:48:41.35ID:jRmhdWmE なぜですか?
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13212452128
質問者からのお礼コメント
小学生でもわかるような回答ではなく、なぜそうなのかも回答できないと社会人として微妙ですよ。
わかる箇所だけ答えるのはニワカです。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13212452128
質問者からのお礼コメント
小学生でもわかるような回答ではなく、なぜそうなのかも回答できないと社会人として微妙ですよ。
わかる箇所だけ答えるのはニワカです。
432デフォルトの名無しさん
2020/12/12(土) 17:55:49.91ID:UcE3yZq1 浣腸電灯めりくり
433デフォルトの名無しさん
2020/12/13(日) 17:26:48.55ID:/mwshU+q AllocConsoleでコンソールを開いてそこからstdio.hのscanfしたいのですが、
ノンブロッキングではないので呼び出し側が固まってしまいます。
そこでscanf的な機能をもつノンブロッキングな関数をつくりたい。
FILE_FLAG_OVERLAPPEDでCONIN$を開いてReadFileで読むまではいいのですが
ReadFileしていない間の入力もバッファリングしてしまいます。そういう機能だから当然ですが。
このバッファリングをうまくオンオフする方法、もしくはバッファを棄てる方法はないでしょうか?
それともFILE_FLAG_OVERLAPPEDではない別の方法があるのでしょうか?
ノンブロッキングではないので呼び出し側が固まってしまいます。
そこでscanf的な機能をもつノンブロッキングな関数をつくりたい。
FILE_FLAG_OVERLAPPEDでCONIN$を開いてReadFileで読むまではいいのですが
ReadFileしていない間の入力もバッファリングしてしまいます。そういう機能だから当然ですが。
このバッファリングをうまくオンオフする方法、もしくはバッファを棄てる方法はないでしょうか?
それともFILE_FLAG_OVERLAPPEDではない別の方法があるのでしょうか?
434デフォルトの名無しさん
2020/12/13(日) 17:32:24.33ID:cAYsSKhI 読み込んだ文字列をsscanf
435デフォルトの名無しさん
2020/12/13(日) 17:35:08.88ID:/mwshU+q CONIN$を開いたハンドルをCloseHandleで閉じたりFlushFileBuffersしたりは試しました。
436デフォルトの名無しさん
2020/12/13(日) 17:37:07.75ID:/mwshU+q437デフォルトの名無しさん
2020/12/13(日) 17:40:51.11ID:cAYsSKhI setvbuf
438蟻人間 ◆T6xkBnTXz7B0
2020/12/13(日) 17:48:17.56ID:zFOj0dh9439デフォルトの名無しさん
2020/12/13(日) 18:26:49.33ID:/mwshU+q setvbufやfreopenはcランタイムの関数で、バッファもOVERLAPPEDのバッファとは違う気がします
freopenしたstdinからのscanfがブロックされてしまうというのが443の話なので
そこからノンブロッキングのAPIを使う必要があるのでは、ということになったわけです
freopenしたstdinからのscanfがブロックされてしまうというのが443の話なので
そこからノンブロッキングのAPIを使う必要があるのでは、ということになったわけです
440デフォルトの名無しさん
2020/12/13(日) 19:01:38.77ID:/mwshU+q ReadConsoleってAPIもブロッキングなので使えないわけですが、低レベルなReadConsoleInputというのもあるらしく
OverlappedでのReadFileよりこっちの方が正攻法なようです。
ともかくやってみます。
ありがとうございました。
OverlappedでのReadFileよりこっちの方が正攻法なようです。
ともかくやってみます。
ありがとうございました。
441デフォルトの名無しさん
2020/12/13(日) 20:23:25.03ID:casXcC2M442デフォルトの名無しさん
2020/12/13(日) 21:23:50.52ID:w0iK+TRN 生のコンソールは制約が多いから
コンソールアプリの入出力を奪って適当なコンソールもどき作った方が早そうだけど
コンソールアプリの入出力を奪って適当なコンソールもどき作った方が早そうだけど
443デフォルトの名無しさん
2020/12/14(月) 00:15:39.66ID:pdqk93XN444デフォルトの名無しさん
2020/12/14(月) 11:31:29.18ID:AspHUlaN445デフォルトの名無しさん
2020/12/14(月) 12:14:03.24ID:GY9gb+Ps コマンドプロンプトのコンソールを使う案件は、スクリプト言語とのプロセス通信を使ったほうが幸せになれる確立が高い。
446デフォルトの名無しさん
2020/12/19(土) 12:04:23.50ID:+WDUx37o GetProcAddressってAやWないよね?
それでいてwcharでもcharでも機能するのは仕様?
それでいてwcharでもcharでも機能するのは仕様?
447デフォルトの名無しさん
2020/12/19(土) 12:37:56.57ID:/QQvHqFx wchar_t*渡して正常に動作するか?
448デフォルトの名無しさん
2020/12/28(月) 00:26:19.90ID:222C9err __declspec(thread)の変数ってスレッドごとに記憶域をもつわけですが
APIのTlsGetValue等でどうやって実現してるんでしょうか?
TLSインデックスをうまくスレッドハンドルと結び付けなけりゃならないと思うんですが。
APIのTlsGetValue等でどうやって実現してるんでしょうか?
TLSインデックスをうまくスレッドハンドルと結び付けなけりゃならないと思うんですが。
449デフォルトの名無しさん
2020/12/28(月) 02:51:22.15ID:p5Tcw1Ej 正直、このあたりは深く考えないことをオススメするのですが。
興味があるということであれば↓を参照しつつ。
http://www.interq.or.jp/chubu/r6/reasm/PE_FORMAT/6_6.html
コンパイラが__declspec(thread)の変数があった時に、どのようなコードを出力しているか
逆アセンブルしてみると理解が深まると思われます
興味があるということであれば↓を参照しつつ。
http://www.interq.or.jp/chubu/r6/reasm/PE_FORMAT/6_6.html
コンパイラが__declspec(thread)の変数があった時に、どのようなコードを出力しているか
逆アセンブルしてみると理解が深まると思われます
450デフォルトの名無しさん
2020/12/28(月) 09:50:34.64ID:222C9err451デフォルトの名無しさん
2021/01/01(金) 22:20:09.03ID:kFKOiQ+I VirtualAllocとHeapAllocの違いについてなんだけど
HeapAllocもヒープ残量以上のサイズを渡したらどの道VirtualAlloc呼ばれるって認識でいい?
HeapAllocもヒープ残量以上のサイズを渡したらどの道VirtualAlloc呼ばれるって認識でいい?
452デフォルトの名無しさん
2021/01/01(金) 22:30:52.02ID:3Cyk3fUO HeapCreate以上のメモリはHeapAlloc
からは作れない。
からは作れない。
453デフォルトの名無しさん
2021/01/02(土) 09:33:50.89ID:Li/cNK13 >>452
ある程度大きいサイズのメモリ確保だとVirtualAllocの方が早くなるからそう勘違いしてたけどそういう訳じゃないんだね
最初に実際にアクセスした時に初めて実際にメモリ割り当てが行われるとかの挙動がHeapAllocでも走るってだけか
ある程度大きいサイズのメモリ確保だとVirtualAllocの方が早くなるからそう勘違いしてたけどそういう訳じゃないんだね
最初に実際にアクセスした時に初めて実際にメモリ割り当てが行われるとかの挙動がHeapAllocでも走るってだけか
454デフォルトの名無しさん
2021/01/02(土) 09:59:10.06ID:r4407Ytg virtualの方がよりローレベルなので
チャンクアロケーターをMSのレベルを
超えて作れるか、ほぼ解放しない前提
のブロックを確保するとかでないと使わない。
普通のmalloc風に使うなら、ヒープ領域毎
あぼーん出来るCreateHeapの方が使い易い
チャンクアロケーターをMSのレベルを
超えて作れるか、ほぼ解放しない前提
のブロックを確保するとかでないと使わない。
普通のmalloc風に使うなら、ヒープ領域毎
あぼーん出来るCreateHeapの方が使い易い
455デフォルトの名無しさん
2021/01/12(火) 15:11:58.85ID:LUlB/OIG あるstaticなlibが既存の場合(.hで関数の引数がTCHAR *使用)
それがANSI用にコンパイルされたlibなのか
それともUNICODE用にコンパイルされたlibなのか
既存のバイナリのlibだけから判断する方法はありますか?
#ソースは.cppでTCHARで書かれているものがあったので
#そこから-DUNICODEであらためてコンパイルすれば解決はしたのですが
#上の質問の解決策があるなら知りたいです
それがANSI用にコンパイルされたlibなのか
それともUNICODE用にコンパイルされたlibなのか
既存のバイナリのlibだけから判断する方法はありますか?
#ソースは.cppでTCHARで書かれているものがあったので
#そこから-DUNICODEであらためてコンパイルすれば解決はしたのですが
#上の質問の解決策があるなら知りたいです
456デフォルトの名無しさん
2021/01/12(火) 15:19:23.66ID:gjvDcKpD >>455
C++の場合なら、ライブラリをdumpbinなどで調べて関数のマングリン化名を見れば分かる。
plain Cの場合は、実際にライブラリに1文字が2バイト以上のUNICODE文字を送ってみて、
正しく動作するかどうかテストしてみると分かる。
C++の場合なら、ライブラリをdumpbinなどで調べて関数のマングリン化名を見れば分かる。
plain Cの場合は、実際にライブラリに1文字が2バイト以上のUNICODE文字を送ってみて、
正しく動作するかどうかテストしてみると分かる。
457デフォルトの名無しさん
2021/01/12(火) 15:40:36.07ID:gjvDcKpD >>456
plain C の場合、他の方法としては、
1. dumpbinでライブラリ関数を逆アセンブルしてみて、引数の扱いがbyteに
なっているか、wordになっているかを調べれば分かる。
2. ライブラリの関数を呼び出すコードを書いてみて、デバッガで、ライブラリ関数の
中を逆アセンブルする。
plain C の場合、他の方法としては、
1. dumpbinでライブラリ関数を逆アセンブルしてみて、引数の扱いがbyteに
なっているか、wordになっているかを調べれば分かる。
2. ライブラリの関数を呼び出すコードを書いてみて、デバッガで、ライブラリ関数の
中を逆アセンブルする。
458デフォルトの名無しさん
2021/01/12(火) 15:41:24.71ID:LUlB/OIG もしかしてマングリの PEB_W とかのが UNICODE 用ってことでしょうか?
459デフォルトの名無しさん
2021/01/12(火) 15:52:56.37ID:gjvDcKpD460デフォルトの名無しさん
2021/01/12(火) 15:54:26.07ID:gjvDcKpD461デフォルトの名無しさん
2021/01/12(火) 21:18:12.25ID:80wnOS0a VCにはundnameというツールが標準でついてくるし、gccにはc++filtがある
462デフォルトの名無しさん
2021/01/15(金) 15:06:23.40ID:4rSXG5WT STDAPI と __declspec(dllexport) を同時に使うと怒られるんだけど
原因は何が考えられますか?
__declspec(dllexport) を使わずに .def ファイルで .dll を作成することは可能なのですが
.def を使わずに __declspec(dllexport) で .dll を作成しようとすると失敗します
原因は何が考えられますか?
__declspec(dllexport) を使わずに .def ファイルで .dll を作成することは可能なのですが
.def を使わずに __declspec(dllexport) で .dll を作成しようとすると失敗します
463デフォルトの名無しさん
2021/01/15(金) 15:12:37.26ID:Xgv++hhu 64bit?
465デフォルトの名無しさん
2021/01/15(金) 15:16:41.23ID:PcvYNCYN STDAPI は 暗に extern "C" を含んでてでマングリングなしの素
C++で _declspec(dllexport) の場合マングリングする
それで衝突してるんでないの?
C++で _declspec(dllexport) の場合マングリングする
それで衝突してるんでないの?
466デフォルトの名無しさん
2021/01/15(金) 15:43:21.85ID:4rSXG5WT467デフォルトの名無しさん
2021/01/15(金) 15:55:06.66ID:4rSXG5WT 解決っぽいです
https://python5.com/q/ntrrycea
https://python5.com/q/ntrrycea
468デフォルトの名無しさん
2021/01/19(火) 04:48:40.40ID:gq4TTO9r Windows10環境、お互いに管理者権限ありでPostMessageしても反応してくれないソフトがあったのですが
互換モードでWindows7を選択すると反応してくれるようになりました
そこで疑問に思ったのですがこの違いの原因は何でしょうか?
互換モードでWindows7を選択すると反応してくれるようになりました
そこで疑問に思ったのですがこの違いの原因は何でしょうか?
469蟻人間 ◆T6xkBnTXz7B0
2021/01/19(火) 16:33:42.40ID:dOqXDJ4/ >>468
http://home.att.ne.jp/delta/hrymkt/PTIPS/UACvsAPI.txt
>PostMessage は 同じプログラムでも 一方が管理者権限で走っていると此にそのソフト特有の
>メッセージの ポストも出来ません。
>個々の メッセージは 受けとる方で ChangeWindowMessageFilter API で指定すれば受けとる様に出来ます。
http://home.att.ne.jp/delta/hrymkt/PTIPS/UACvsAPI.txt
>PostMessage は 同じプログラムでも 一方が管理者権限で走っていると此にそのソフト特有の
>メッセージの ポストも出来ません。
>個々の メッセージは 受けとる方で ChangeWindowMessageFilter API で指定すれば受けとる様に出来ます。
470蟻人間 ◆T6xkBnTXz7B0
2021/01/19(火) 16:36:03.29ID:dOqXDJ4/ ここを見ている人のために念のため貼っておくよ。ご参考に。
Win32のリファレンス マニュアル
Win32.chm http://laurencejackson.com/win32/
右クリックして「プロパティ」を選び、「許可する」をクリックして「OK」ボタンを押せばセキュリティのブロックを解除できます。
Win32のリファレンス マニュアル
Win32.chm http://laurencejackson.com/win32/
右クリックして「プロパティ」を選び、「許可する」をクリックして「OK」ボタンを押せばセキュリティのブロックを解除できます。
471デフォルトの名無しさん
2021/01/20(水) 05:28:55.77ID:4MsON1Bd >>469
ありがとうございます
そのページは私も確認したのですがお互いに管理者権限ありなので下記に該当すると思います
>自身が 管理者権限で走っていれば この制限は無くなります。
ポストに成功する互換モードでもお互いに管理者権限ありなのでWindows7と10の違いが原因だと思ったのですが具体的に何が違うのか分からず…
ありがとうございます
そのページは私も確認したのですがお互いに管理者権限ありなので下記に該当すると思います
>自身が 管理者権限で走っていれば この制限は無くなります。
ポストに成功する互換モードでもお互いに管理者権限ありなのでWindows7と10の違いが原因だと思ったのですが具体的に何が違うのか分からず…
472デフォルトの名無しさん
2021/01/22(金) 11:43:02.03ID:LpWHKWeZ 64bitと32bit混在とか
LONG/HWNDの長さ違いとか
LONG/HWNDの長さ違いとか
473デフォルトの名無しさん
2021/01/22(金) 23:19:48.79ID:yGCss6uQ やんわりとrustに移行させようとしてるマイクロソフト
474デフォルトの名無しさん
2021/01/23(土) 17:16:39.51ID:5Na5U87Z C#は?
475デフォルトの名無しさん
2021/01/27(水) 11:53:32.96ID:cJSBZXf9476デフォルトの名無しさん
2021/01/27(水) 16:13:17.46ID:ZPuhQ2SN >>475
登録数だけ見るとやんわりには見えない
登録数だけ見るとやんわりには見えない
477デフォルトの名無しさん
2021/01/28(木) 11:08:41.51ID:dNWrUHbO 生暖かく応援するである
478デフォルトの名無しさん
2021/02/04(木) 20:13:07.23ID:m67WeuC9 フルパス以外でのファイル固有のユニーク値ってBY_HANDLE_FILE_INFORMATIONのnFileIndexHigh、nFileIndexLow以外に何かない?
479デフォルトの名無しさん
2021/02/04(木) 21:39:45.02ID:NI9TS1Gg ハッシュ?
480デフォルトの名無しさん
2021/02/05(金) 00:39:50.48ID:AkHBgQOB GetOpenFileName()でファイルを開くダイアログが使えますが、
https://dotup.org/uploda/dotup.org2378520.png
このダイアログの赤枠内のように、チェックボックス等が追加されたカスタムのダイアログはどのようにすれば実現できるのでしょうか?
https://dotup.org/uploda/dotup.org2378520.png
このダイアログの赤枠内のように、チェックボックス等が追加されたカスタムのダイアログはどのようにすれば実現できるのでしょうか?
481デフォルトの名無しさん
2021/02/05(金) 00:56:51.01ID:Nx26rnNw >>478
FILE_ID_INFOのFileIdで128bitに拡張されてるな
FILE_ID_INFOのFileIdで128bitに拡張されてるな
482蟻人間 ◆T6xkBnTXz7B0
2021/02/05(金) 01:06:52.68ID:U+NO2W2G■ このスレッドは過去ログ倉庫に格納されています
