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:ZJ42fMZB302デフォルトの名無しさん
2020/09/07(月) 10:56:37.10ID:9HEBPbyG おセックスしたいです
303デフォルトの名無しさん
2020/09/07(月) 13:52:28.70ID:X4wk0IcB MFCならCCommandLineInfoなんだがな。
304デフォルトの名無しさん
2020/09/07(月) 14:10:25.67ID:MtDNWdkb CreateProcess見るといろいろな指定の仕方ができそうで不安になるよね
305デフォルトの名無しさん
2020/09/07(月) 14:32:13.03ID:ibXVM4v9 >>296
そんなの使わずにWinMainの3rdパラメータ使う
そんなの使わずにWinMainの3rdパラメータ使う
306デフォルトの名無しさん
2020/09/07(月) 15:26:51.28ID:DSNLMJBI /a //b /c:"text"
この場合b無視すんの?
この場合b無視すんの?
307デフォルトの名無しさん
2020/09/07(月) 18:53:34.42ID:XlcRu9mb >>303
CWinApp::ParseCommandLine()は__argcと__argvを見ているだけだけどな
CWinApp::ParseCommandLine()は__argcと__argvを見ているだけだけどな
308デフォルトの名無しさん
2020/09/08(火) 01:38:27.47ID:BXhGoa38 質問なんですがWindowsのカレントディレクトリって
アプリ毎に持ってるものなんでしょうか?
それとも全アプリ共通なのでしょうか?
アプリ毎に持ってるものなんでしょうか?
それとも全アプリ共通なのでしょうか?
310デフォルトの名無しさん
2020/09/08(火) 01:54:21.79ID:BXhGoa38 >>309
スレッド毎に違うんですね!ありがとうございました。安心しました。
スレッド毎に違うんですね!ありがとうございました。安心しました。
311デフォルトの名無しさん
2020/09/08(火) 11:55:58.97ID:POT3YWIT プロセスごとだろ
嘘つくなよ
嘘つくなよ
312デフォルトの名無しさん
2020/09/08(火) 12:00:43.95ID:VotMLAWA この板には嘘つき朝鮮人しかいない
313デフォルトの名無しさん
2020/09/08(火) 13:00:32.46ID:HYZN+BkE >>312
自分がそうだからといって他人もそうだと思うのはよくないな
自分がそうだからといって他人もそうだと思うのはよくないな
314デフォルトの名無しさん
2020/09/08(火) 13:23:24.69ID:5CeoL0rA MSDN によれば、正しいのはプロセス毎。スレッド毎ではない。
*SetCurrentDirectory
The SetCurrentDirectory function changes the current directory for the current process.
BOOL SetCurrentDirectory(
LPCTSTR lpPathName // new directory name
);
*Remarks
Each process has a single current directory made up of two parts:
・・・
*SetCurrentDirectory
The SetCurrentDirectory function changes the current directory for the current process.
BOOL SetCurrentDirectory(
LPCTSTR lpPathName // new directory name
);
*Remarks
Each process has a single current directory made up of two parts:
・・・
315デフォルトの名無しさん
2020/09/08(火) 13:29:57.92ID:oUJlYCUI ということは、同一プロセス内の別スレッドでSetCurrentDirectoryが発行されると
自スレッドのカレントがいつの間にか変わっているということが起きるのか
自スレッドのカレントがいつの間にか変わっているということが起きるのか
316デフォルトの名無しさん
2020/09/08(火) 13:50:32.04ID:JNlu12o+ カレントディレクトリの取得なんて、グローバル変数から情報を取ってくるようなもんなので危険ってことだ
そんなもん使うな
そんなもん使うな
317デフォルトの名無しさん
2020/09/08(火) 14:09:32.72ID:5CeoL0rA >>315
もちろんそういうこと。
というより、カレントディレクトリも、広い意味で「UI」に関係したものと
考えられなくもないので、必ず Mainスレッドから取得するようにすれば、
安全と言える。絶対そうしなくてはならないわけではないが。
Window作製、グラフィック描画、マウス、キーボードからの入力なども、
Mainスレッドで行うのが原則。
これも絶対そうでなくてはならないというわけではないかも知れないが、
敢えて Subスレッドでやる意味も余り無い事が多く、Mainスレッドに限定
すれば、さまざまな危険回避のための余計なことを考えなくて済むメリットがある。
もちろんそういうこと。
というより、カレントディレクトリも、広い意味で「UI」に関係したものと
考えられなくもないので、必ず Mainスレッドから取得するようにすれば、
安全と言える。絶対そうしなくてはならないわけではないが。
Window作製、グラフィック描画、マウス、キーボードからの入力なども、
Mainスレッドで行うのが原則。
これも絶対そうでなくてはならないというわけではないかも知れないが、
敢えて Subスレッドでやる意味も余り無い事が多く、Mainスレッドに限定
すれば、さまざまな危険回避のための余計なことを考えなくて済むメリットがある。
318デフォルトの名無しさん
2020/09/08(火) 14:13:07.26ID:5CeoL0rA >>317
補足すれば、カレントディレクトリは、MS-DOS時代では、command.com
が管理していたもので、アプリごとに異なるわけではなかったはず。
というのは、カレントディレクトリを便利に変更できるツールを作りたい
場合などに、アプリローカルであれば、不便だったからだと思う。
その設計哲学や文化や習慣が、Windowsにも受け継がれる必要は有ったと思う。
Unixの環境変数なども、アプリローカルになっていたりするが、意外と不便な
事も多い。
補足すれば、カレントディレクトリは、MS-DOS時代では、command.com
が管理していたもので、アプリごとに異なるわけではなかったはず。
というのは、カレントディレクトリを便利に変更できるツールを作りたい
場合などに、アプリローカルであれば、不便だったからだと思う。
その設計哲学や文化や習慣が、Windowsにも受け継がれる必要は有ったと思う。
Unixの環境変数なども、アプリローカルになっていたりするが、意外と不便な
事も多い。
319デフォルトの名無しさん
2020/09/08(火) 14:55:05.93ID:2rsMzWV+ 何を根拠に長文をw
INT21 AH=3B の説明を読み直し要
INT21 AH=3B の説明を読み直し要
320デフォルトの名無しさん
2020/09/08(火) 18:38:57.08ID:HYNPtfS+ >>315
>自スレッドのカレントがいつの間にか変わっている
自分で管理できないスレッドなんてあるのか?
その別スレッドだって自分で作ったものだろ?
DLLとか自分で管理していないものもあるけどそれはスレッド関係ないわけだし
>自スレッドのカレントがいつの間にか変わっている
自分で管理できないスレッドなんてあるのか?
その別スレッドだって自分で作ったものだろ?
DLLとか自分で管理していないものもあるけどそれはスレッド関係ないわけだし
321デフォルトの名無しさん
2020/09/08(火) 18:48:41.38ID:FLHP/hAu DCE-RPCは電文受信すると勝手に
処理スレッドたててくれるよ
処理スレッドたててくれるよ
322デフォルトの名無しさん
2020/09/08(火) 19:34:11.85ID:oUJlYCUI >>320
別スレッドにするってことは自スレッドとの間にタイミングの束縛がない処理を任せるってことだよな
カレントディレクトリの変更がプロセス内の他のスレッドにも伝搬するということは
それはタイミングの束縛が生じうるってことだろ
つまり、それが困るなら別スレッドにしてはならない処理内容ってことで
そこの判断こそが「自分で管理」ということだ
別スレッドにするってことは自スレッドとの間にタイミングの束縛がない処理を任せるってことだよな
カレントディレクトリの変更がプロセス内の他のスレッドにも伝搬するということは
それはタイミングの束縛が生じうるってことだろ
つまり、それが困るなら別スレッドにしてはならない処理内容ってことで
そこの判断こそが「自分で管理」ということだ
323デフォルトの名無しさん
2020/09/08(火) 19:36:02.20ID:HYNPtfS+ ちょっと何言っているのかわからない
324デフォルトの名無しさん
2020/09/08(火) 19:41:07.94ID:oUJlYCUI そうかい、それは残念だね
325デフォルトの名無しさん
2020/09/08(火) 22:47:13.26ID:txiCBqFi スレッドがお互いを信用できないとか、そんな羅生門みたいなプログラムは嫌だなぁ。
326デフォルトの名無しさん
2020/09/08(火) 23:06:57.38ID:bOnMHAua マジで地獄の召還かもな
327デフォルトの名無しさん
2020/09/09(水) 00:11:58.92ID:VoppH/up 指定フォルダ以下のファイルをすべて処理するプログラムで
サブフォルダごとにスレッドを起動してみよう
サブフォルダごとにスレッドを起動してみよう
328デフォルトの名無しさん
2020/09/09(水) 09:51:28.66ID:9MEEjZyT フォルダ間移動ですね判ります
329デフォルトの名無しさん
2020/09/09(水) 11:03:42.50ID:w9YsWEn5 そんなバッチファイルみたいなアルゴリズムでカレントディレクトリ移動しながらマルチスレッドをやるとかがそもそも迂闊だよな。
330デフォルトの名無しさん
2020/09/10(木) 08:55:55.87ID:YCiClA3r331デフォルトの名無しさん
2020/09/10(木) 08:57:16.11ID:YCiClA3r タスクマネージャー開けばわかるけど、今時のWebブラウザ(具体的にはEdgeやFirefox等)はたくさんの子プロセスを動かしている。
332デフォルトの名無しさん
2020/09/10(木) 13:46:51.31ID:+JaTYUbA 話の流れを読めない奴は黙ってりゃいいのに…
333デフォルトの名無しさん
2020/09/20(日) 07:50:00.62ID:sAMwu2sI sse2までが必須になったのはいつだったか覚えませんか
win-7の途中くらい?
win-7の途中くらい?
334デフォルトの名無しさん
2020/09/20(日) 08:05:49.82ID:WRa/xy2u335デフォルトの名無しさん
2020/09/20(日) 08:21:02.12ID:sAMwu2sI >>334
ありがとうございます
ありがとうございます
336デフォルトの名無しさん
2020/09/22(火) 08:18:54.27ID:EoOf3jnh win32apiを使っている人は、普段の文字コードは
stringとwchar_tを使っているのでしょうか。
stringとwchar_tを使っているのでしょうか。
337デフォルトの名無しさん
2020/09/22(火) 08:26:19.44ID:bhDrmv5D LPWSTR
338デフォルトの名無しさん
2020/09/22(火) 12:46:05.64ID:EoOf3jnh ありがとうございます。
調べてみます。
stringを使いたいのに、win32apiは変換が必要?なので躊躇しています。
調べてみます。
stringを使いたいのに、win32apiは変換が必要?なので躊躇しています。
339デフォルトの名無しさん
2020/09/22(火) 13:48:40.94ID:YDb2rcNJ CreateProcessのユニコード版(W)の第2引数がリテラルだとうまくいかない件
これはハマったわ。
CreateProcess(TCHAR)でメモ帳起動させるサンプルで
_T("C:\\Windows\\notepad.exe")を直接与えてもCとしてコンパイルするとうまくいってて
c++にしたら起動しなくなったが、エラーが出ないから全然気づかなかったわ
ネットのCreateProcessのサンプルも普通に与えてるしなあ
考えてみれば実運用でこの部分は文字リテラル決め打ちにめったにならないから
知らずに回避してることも多いのかも
これはハマったわ。
CreateProcess(TCHAR)でメモ帳起動させるサンプルで
_T("C:\\Windows\\notepad.exe")を直接与えてもCとしてコンパイルするとうまくいってて
c++にしたら起動しなくなったが、エラーが出ないから全然気づかなかったわ
ネットのCreateProcessのサンプルも普通に与えてるしなあ
考えてみれば実運用でこの部分は文字リテラル決め打ちにめったにならないから
知らずに回避してることも多いのかも
341デフォルトの名無しさん
2020/09/22(火) 14:16:32.73ID:yrkD80aj そもそもMSDNに書いてるし
342デフォルトの名無しさん
2020/09/22(火) 14:16:37.87ID:5Q3AK6nV LPTSTR で受け取ってるから書き換え可能なメモリアドレスでないとあかんのじゃないのん?
リテラルは const で書き換え不可だし 一回変数経由しないと
リテラルは const で書き換え不可だし 一回変数経由しないと
343デフォルトの名無しさん
2020/09/22(火) 14:22:15.75ID:uF0JvJPV 自転車🚴のような絵文字をstd::stringで持つにはSJISではなくUTF-8として保持しておいて、
画面などの出力する直前にUTF-8からUTF-16に変換してUnicode版出力関数を呼び出す必要がある。
画面などの出力する直前にUTF-8からUTF-16に変換してUnicode版出力関数を呼び出す必要がある。
344デフォルトの名無しさん
2020/09/22(火) 15:28:51.96ID:J6Z/5nZW >>339
>lpCommandLine
>実行するコマンドライン。
>この文字列の最大長は、Unicodeで終了するnull文字を含めて32,767文字です。 lpApplicationNameがNULLの場合、lpCommandLineのモジュール名の部分はMAX_PATH文字に制限されます。
>この関数のUnicodeバージョンであるCreateProcessWは、この文字列の内容を変更できます。
>したがって、このパラメーターを読み取り専用メモリー(const変数やリテラル文字列など)へのポインターにすることはできません。
>このパラメーターが定数文字列の場合、関数はアクセス違反を引き起こす可能性があります。
>lpCommandLine
>実行するコマンドライン。
>この文字列の最大長は、Unicodeで終了するnull文字を含めて32,767文字です。 lpApplicationNameがNULLの場合、lpCommandLineのモジュール名の部分はMAX_PATH文字に制限されます。
>この関数のUnicodeバージョンであるCreateProcessWは、この文字列の内容を変更できます。
>したがって、このパラメーターを読み取り専用メモリー(const変数やリテラル文字列など)へのポインターにすることはできません。
>このパラメーターが定数文字列の場合、関数はアクセス違反を引き起こす可能性があります。
345デフォルトの名無しさん
2020/09/25(金) 09:12:14.46ID:3+LaQyVV >>339
argvに渡すから非constだぞって話か
argvに渡すから非constだぞって話か
346デフォルトの名無しさん
2020/09/25(金) 10:57:09.24ID:4ovx1Tzj 非 const の引数に const リテラル与えたら
コンパイルエラーにならないか?
コンパイルエラーにならないか?
347デフォルトの名無しさん
2020/09/25(金) 11:44:47.33ID:cdg8K9Zm それがエラーになるなら固定文字列を渡せなくなるやん
348デフォルトの名無しさん
2020/09/25(金) 12:18:15.76ID:3+LaQyVV >>346
C++11以後、そうなった筈だけどcl.exeはversion 19.27.29111でも通す(もち/W4で)
C++11以後、そうなった筈だけどcl.exeはversion 19.27.29111でも通す(もち/W4で)
349デフォルトの名無しさん
2020/09/25(金) 18:33:43.19ID:M9uVftQk Win32API全部作り直してほしい
くだらない部分で人間の時間を消費しすぎだろw
くだらない部分で人間の時間を消費しすぎだろw
350デフォルトの名無しさん
2020/09/25(金) 18:41:06.52ID:14hC/BSs351デフォルトの名無しさん
2020/09/25(金) 18:57:00.47ID:3+LaQyVV >>350
御意
御意
>>349
どんなところがダメなんでしょうか?
どんなところがダメなんでしょうか?
353デフォルトの名無しさん
2020/09/25(金) 21:58:40.78ID:62tG58VZ WINDK使ってサブシステム毎作り直せば良いのに
354蟻人間 ◆T6xkBnTXz7B0
2020/09/25(金) 22:05:15.01ID:ogXn8IQh コンパイルできるXPのソースが漏れてるらしい。
355デフォルトの名無しさん
2020/09/27(日) 00:13:50.58ID:Tq9/SM8I356デフォルトの名無しさん
2020/09/28(月) 13:45:59.88ID:A9tQ9Jdm 7もお漏らしして欲しいね
357デフォルトの名無しさん
2020/09/28(月) 13:53:48.40ID:n9LyrBhU 未だに使ってる奴が死ぬだけ
358デフォルトの名無しさん
2020/09/28(月) 14:33:51.78ID:PAQov7G9 海賊版天国の中国死ぬの?
359デフォルトの名無しさん
2020/09/28(月) 15:10:38.57ID:q9HWvXQA 穴がさらにいっぱい見つかって攻撃方法が増えるんだから自明だろ
誰が対応するんや
誰が対応するんや
360デフォルトの名無しさん
2020/09/28(月) 16:14:01.27ID:n0MW1Etw 久しぶりに Windows Update したら
Edge レイプされてポカーン
Edge レイプされてポカーン
361デフォルトの名無しさん
2020/09/28(月) 16:42:43.52ID:8K79+FWG スカ ポン タン
362デフォルトの名無しさん
2020/09/28(月) 16:51:28.28ID:QxfbhGyV > Edge レイプ
うまい!
うまい!
363デフォルトの名無しさん
2020/09/29(火) 21:54:15.29ID:6fvRDqpi _beginthreadexだけは許さんよ
もっとも醜悪な名前だわ
もっとも醜悪な名前だわ
364デフォルトの名無しさん
2020/09/29(火) 21:58:00.70ID:LdxVDSVq MJD?
365デフォルトの名無しさん
2020/10/01(木) 23:20:42.73ID:rwmZapHm >>363 すれち
366蟻人間 ◆T6xkBnTXz7B0
2020/10/18(日) 23:53:11.43ID:cRjbazHq http://eternalwindows.jp にはWin32の核心部分が載ってる。参考になる記事だ。
367デフォルトの名無しさん
2020/10/27(火) 20:43:03.29ID:rXCQsaV4 GetOpenFileName で初期ディレクトリとして OPENFILENAME の lpstrInitialDir に
任意のディレクトリを指定してファイルを開くダイアログを開いていて、おおよそ
意図した通りに動いているのですが、"C:\Users\Public\Documents"を指定したときだけ
初期ディレクトリが現在使用中ユーザーのドキュメントディレクトリになってしまいます
アクセス権のない他のユーザーのドキュメントディレクトリを指定したのなら
このような動作は理解できるのですが、パブリックディレクトリでこのように
なってしまうのは仕様でしょうか?
任意のディレクトリを指定してファイルを開くダイアログを開いていて、おおよそ
意図した通りに動いているのですが、"C:\Users\Public\Documents"を指定したときだけ
初期ディレクトリが現在使用中ユーザーのドキュメントディレクトリになってしまいます
アクセス権のない他のユーザーのドキュメントディレクトリを指定したのなら
このような動作は理解できるのですが、パブリックディレクトリでこのように
なってしまうのは仕様でしょうか?
368デフォルトの名無しさん
2020/10/28(水) 11:43:37.22ID:Mf8tEr2f SHGetSpecialFolderPath
369デフォルトの名無しさん
2020/10/28(水) 17:45:50.04ID:DoZwgPmf パブリックディレクトリの取得方法を聞いているわけではないのですが
"C:\Users\Public\Documents" は存在する有効なパスです
"C:\Users\Public\Documents" は存在する有効なパスです
370デフォルトの名無しさん
2020/10/28(水) 18:30:52.56ID:Mf8tEr2f 再現した
C:\Users\Public
ならちゃんと public が開くが
C:\Users\Public\Documents
にすると自分のアカウントに行ってしまう
C:\Users\Public
ならちゃんと public が開くが
C:\Users\Public\Documents
にすると自分のアカウントに行ってしまう
371デフォルトの名無しさん
2020/10/28(水) 18:36:57.63ID:Mf8tEr2f あと存在しないディレクトリを与えると
C:\Users\自分のアカウント\Documents
が開いた
C:\Users\自分のアカウント\Documents
が開いた
372デフォルトの名無しさん
2020/10/28(水) 18:41:30.63ID:Mf8tEr2f lpstrInitialDir
The initial directory. The algorithm for selecting the initial directory varies on different platforms.
Windows 7:
If lpstrInitialDir has the same value as was passed the first time the application used an Open or Save As dialog box, the path most recently selected by the user is used as the initial directory.
Otherwise, if lpstrFile contains a path, that path is the initial directory.
Otherwise, if lpstrInitialDir is not NULL, it specifies the initial directory.
If lpstrInitialDir is NULL and the current directory contains any files of the specified filter types, the initial directory is the current directory.
Otherwise, the initial directory is the personal files directory of the current user.
Otherwise, the initial directory is the Desktop folder.
Windows 2000/XP/Vista:
If lpstrFile contains a path, that path is the initial directory.
Otherwise, lpstrInitialDir specifies the initial directory.
Otherwise, if the application has used an Open or Save As dialog box in the past, the path most recently used is selected as the initial directory. However, if an application is not run for a long time, its saved selected path is discarded.
If lpstrInitialDir is NULL and the current directory contains any files of the specified filter types, the initial directory is the current directory.
Otherwise, the initial directory is the personal files directory of the current user.
Otherwise, the initial directory is the Desktop folder.
The initial directory. The algorithm for selecting the initial directory varies on different platforms.
Windows 7:
If lpstrInitialDir has the same value as was passed the first time the application used an Open or Save As dialog box, the path most recently selected by the user is used as the initial directory.
Otherwise, if lpstrFile contains a path, that path is the initial directory.
Otherwise, if lpstrInitialDir is not NULL, it specifies the initial directory.
If lpstrInitialDir is NULL and the current directory contains any files of the specified filter types, the initial directory is the current directory.
Otherwise, the initial directory is the personal files directory of the current user.
Otherwise, the initial directory is the Desktop folder.
Windows 2000/XP/Vista:
If lpstrFile contains a path, that path is the initial directory.
Otherwise, lpstrInitialDir specifies the initial directory.
Otherwise, if the application has used an Open or Save As dialog box in the past, the path most recently used is selected as the initial directory. However, if an application is not run for a long time, its saved selected path is discarded.
If lpstrInitialDir is NULL and the current directory contains any files of the specified filter types, the initial directory is the current directory.
Otherwise, the initial directory is the personal files directory of the current user.
Otherwise, the initial directory is the Desktop folder.
373デフォルトの名無しさん
2020/10/28(水) 19:43:23.12ID:RpzUgl/d comdlg32.dllのコモンダイアログ関係は >>367 のような想定外の動きをしたり
右クリックのコンテキストメニューで存在しない32bitフォルダを探しに行ったりと色々不具合を抱えてる
明らかにメンテされてない
ダイアログ内のListViewで開発者の想定外の事ができたりするから許されるなら使わない方が良い
右クリックのコンテキストメニューで存在しない32bitフォルダを探しに行ったりと色々不具合を抱えてる
明らかにメンテされてない
ダイアログ内のListViewで開発者の想定外の事ができたりするから許されるなら使わない方が良い
374デフォルトの名無しさん
2020/10/28(水) 20:10:50.98ID:xBovneds コモンコントロール使ってるアプリに使うなと言ってしまうと、開発プラットフォームから見直さないとダメ案件では
375デフォルトの名無しさん
2020/10/29(木) 10:55:01.44ID:XU4TLDfA376デフォルトの名無しさん
2020/10/29(木) 11:27:15.51ID:wwhOrfBp XP 以前と 7 で違うんだから
10 ならさらに変更されたとかありそう
10 ならさらに変更されたとかありそう
377デフォルトの名無しさん
2020/10/29(木) 11:29:27.07ID:wwhOrfBp >コモンコントロール部分だけ差し替えが可能なもの
秀丸ファイラーのdllって無かったかな
秀丸ファイラーのdllって無かったかな
378デフォルトの名無しさん
2020/10/29(木) 13:09:04.28ID:rgNs+gPO IFileDialog使えって話でもないのん?
379デフォルトの名無しさん
2020/11/12(木) 11:33:46.92ID:Twa29Hwt こんにちは、お世話になります。DLLファイルの削除について質問です。
プログラム終了時にロードしたDLLファイルを削除したいのですが、
場合により削除できたりできなかったりします。
実際にはもう少し複雑ですが、大まかな処理の手順を示します。
1: inst=LoadLibrary("tmp.dll")
2: hook=SetWindowsHookEx(...)
3: ...あれやこれやの処理...
4: ret1=UnhookWindowsHookEx(hook)
5: ret2=FreeLibrary(inst)
6: ret3=DeleteFile("tmp.dll")
処理部[3:]は、所望の通り動作していて、inst,hook共に正常値のよ
うです。アプリケーション終了時に[4:]以降の処理を行います。ret1,
ret2は成功値を返すのですが、ret3は失敗し、GetLastErrorの値は5で
ERROR_ACCESS_DENIED「アクセス拒否」を返してきます。アプリ
ケーション終了後はプロンプトからのDELコマンドに成功します。
処理部[3:]をスキップすると、ret3は成功値を返しファイルもただ
しく削除されています。
FreeLibraryだけでは、DLLを開放してくれないのかと思っていますが、
少し手つまりになっています。当方、日曜プログラマレベルの知識で
す。質問などに不備等ございましたらご指摘ください。
(環境)Win10-64bit,Vs2019Comm,VC++
プログラム終了時にロードしたDLLファイルを削除したいのですが、
場合により削除できたりできなかったりします。
実際にはもう少し複雑ですが、大まかな処理の手順を示します。
1: inst=LoadLibrary("tmp.dll")
2: hook=SetWindowsHookEx(...)
3: ...あれやこれやの処理...
4: ret1=UnhookWindowsHookEx(hook)
5: ret2=FreeLibrary(inst)
6: ret3=DeleteFile("tmp.dll")
処理部[3:]は、所望の通り動作していて、inst,hook共に正常値のよ
うです。アプリケーション終了時に[4:]以降の処理を行います。ret1,
ret2は成功値を返すのですが、ret3は失敗し、GetLastErrorの値は5で
ERROR_ACCESS_DENIED「アクセス拒否」を返してきます。アプリ
ケーション終了後はプロンプトからのDELコマンドに成功します。
処理部[3:]をスキップすると、ret3は成功値を返しファイルもただ
しく削除されています。
FreeLibraryだけでは、DLLを開放してくれないのかと思っていますが、
少し手つまりになっています。当方、日曜プログラマレベルの知識で
す。質問などに不備等ございましたらご指摘ください。
(環境)Win10-64bit,Vs2019Comm,VC++
380デフォルトの名無しさん
2020/11/12(木) 11:49:17.96ID:Twa29Hwt 追記
2: hook=SetWindowsHookEx(WH_KEYBOARD_LL,proc,inst,0)
フックにDLLインスタンスが絡みます。
2: hook=SetWindowsHookEx(WH_KEYBOARD_LL,proc,inst,0)
フックにDLLインスタンスが絡みます。
381デフォルトの名無しさん
2020/11/12(木) 11:54:18.15ID:fy6Pt/Zo 1〜2をやるボタンAと
4〜5をやるボタンBを配置して
ボタンBを押してから6やってみた?
4〜5をやるボタンBを配置して
ボタンBを押してから6やってみた?
382デフォルトの名無しさん
2020/11/12(木) 12:09:45.05ID:Twa29Hwt >>381 ありがと
いや、そういう処理の分解はやってないです。
ただ、[5:]と[6:]の間にSleep(10000)を挟んでみた。OSが手放してくれる時
間?が必要かと思って・・・でも、そういう事じゃないみたい。
ボタンの配置はすぐには難しいですが(汗)。でも、とりあえず、物は試しで
ユーザの入力待ちを挟んでみます。getch()あたりで・・・。
いや、そういう処理の分解はやってないです。
ただ、[5:]と[6:]の間にSleep(10000)を挟んでみた。OSが手放してくれる時
間?が必要かと思って・・・でも、そういう事じゃないみたい。
ボタンの配置はすぐには難しいですが(汗)。でも、とりあえず、物は試しで
ユーザの入力待ちを挟んでみます。getch()あたりで・・・。
383デフォルトの名無しさん
2020/11/12(木) 12:16:08.75ID:f5BAQJxF DLL_PROCESS_DETACH が正しく呼ばれてないか処理されてないんじゃね
https://stackoverflow.com/questions/19934000/how-to-correctly-dispose-of-injected-dll-thread
https://stackoverflow.com/questions/19934000/how-to-correctly-dispose-of-injected-dll-thread
384デフォルトの名無しさん
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 に示してあります。
フックの初回呼び出しにリファレンスが追加・・・かなぁ(妄想。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国側が首相答弁の撤回要求、日本側拒否 [夜のけいちゃん★]
- 債券・円・株「トリプル安」に…長期金利1.755%まで上昇、円は対ユーロで史上最安値 [蚤の市★]
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 ★5 [ぐれ★]
- 映画「鬼滅の刃」の興行収入急減、日本行き航空券大量キャンセル…中国メディア報道 [蚤の市★]
- 【音楽】Perfume・あ~ちゃんの結婚相手「一般男性」は吉田カバンの社長・吉田幸裕氏(41) 高身長で山本耕史似 [Ailuropoda melanoleuca★]
- 「タワマン天国」に飛びつく若者…SNSに転がる「成功体験」に続けるのか 湾岸エリアの業者が語った現実 [蚤の市★]
- ホテル業界、高市のせいで中国から大量キャンセル 「大変厳しい状態。一刻も早い収束を願います」 [271912485]
- 【正論】玉木雄一郎「高市さんの答弁は米軍が攻撃を受けた場合を前提としており、撤回するのは難しい」特定野党を完全論破 [519511584]
- ホリエモンが政治家達を呼んで台湾有事について議論する動画を公開したんだけどお前らはこれの内容についてどう思う [317527133]
- 麻生太郎氏、高市政権と距離を置きはじめる(´・ω・`) [399259198]
- んなり放題🍬のお🏡
- 自閉症が「んなっしょい」と連呼するお🏡
