Win32API質問箱 Build127

■ このスレッドは過去ログ倉庫に格納されています
2021/12/09(木) 21:32:56.60ID:sYLpmj89
Win32APIについての質問はこちらへどうぞ。

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

■過去スレ
Win32API質問箱 Build126
https://mevius.5ch.net/test/read.cgi/tech/1588339011/
Win32API質問箱 Build125
https://mevius.5ch.net/test/read.cgi/tech/1551247748/
Win32API質問箱 Build124
https://mevius.5ch.net/test/read.cgi/tech/1510395780/

■関連スレ
Visual Studio 2020 Part1 https://mevius.5ch.net/test/read.cgi/tech/1634166667/
Visual Studio 2019 Part7 https://mevius.5ch.net/test/read.cgi/tech/1634178709/
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/
2023/09/27(水) 02:22:24.50ID:5xG4BOfj
>>740
そもそもTempは一時的なフォルダでしょ
本アプリは上書きで使っていくだけだから影響はないでしょ
キャッシュや恒久的に使用するデータをそこに保存している場合は不具合のもとだろうけど
データ検証しない場合はエラー吐いて落ちるだけじゃね?
2023/09/27(水) 08:45:50.87ID:KtsI0JaQ
Tempフォルダの中身は削除されても文句言えない物だから
なんなら同名あったら問答無用で削除して自分用作るすらあると思うわ
747デフォルトの名無しさん
垢版 |
2023/09/27(水) 11:42:51.73ID:OOPn+kCl
その通り
既存の同名があって作成者が自分じゃなければ消して新しく同名で造れば良い
2023/09/27(水) 11:55:22.18ID:rbbJx+dJ
>>740
勝手に数字をつけて存在しない名前を探してくれるAPIがあっただろ
数字は16ビットなので65536個全部あったらだめだが
2023/09/27(水) 12:24:30.48ID:JPmaWpsM
APIを呼び出した次の瞬間名前が衝突する可能性も考慮するんだぞ
750740
垢版 |
2023/09/27(水) 12:37:44.20ID:jK1ZOC3S
みなさんありがとうございます。

>>745-748
テンポラリファイルではなく、固定名のサブフォルダを作るアプリに対する疑問でした。
フォルダ上に同名のファイルがあったら、その名前のサブフォルダは作れないですし。

確かにそれを言い出したら、インストール時も、
Program Filesの中に同名のファイルがあったらどうするんだとか出てきますが。
2023/09/27(水) 14:26:16.30ID:5xG4BOfj
>>750
作る前に存在の有無ぐらい確認するでしょ
2023/09/27(水) 14:52:35.81ID:KtsI0JaQ
それはアプリ作成側がそこまで思いを致すかどうかなんだよ
2023/09/27(水) 15:25:13.52ID:CB93ywr3
>>750
テンポラリファイルではなく、固定名のサブフォルダを作る場合は
C:\Users\ユーザー名\AppData\Local\会社名
で作るのが一般的では?(暗黙のルール?)

個人で作ってるならアプリ名を元に他と被らないようにするとか
2023/09/27(水) 23:12:54.83ID:zQBl5fyt
その為のレジストリなんじゃないのか?
キーは基本的に会社名含めてるから被らないし、ファイルを作成して消耗するより楽だろ
755デフォルトの名無しさん
垢版 |
2023/09/28(木) 06:29:56.08ID:wsjwbbNA
テンポラリの作業用にレジストリ使うの?
ファイル造る方が楽
2023/09/28(木) 08:45:42.90ID:fRqICkyk
>>753とか>>754とか
世の中に同じ名前の会社が一切存在しないと思ってんだろうか
2023/09/28(木) 09:48:55.62ID:wMng62Lu
知らんわ
あとから出来たほうが対策しろよw
2023/09/28(木) 10:00:55.49ID:7+/lnWbq
ファイルやディレクトリ造るために社名変更するまである
2023/09/28(木) 10:03:24.72ID:/0J5x9qx
実際被ってたことってある?
俺はないけど
2023/09/28(木) 19:13:55.93ID:0dpaiugf
俺はいまでもかぶってる
2023/09/28(木) 23:36:06.79ID:HoOgKtnG
もげろ
2023/09/29(金) 08:59:20.90ID:Z2hlTA8C
病院行ってこい
2023/09/29(金) 09:07:48.85ID:05Kz/f5R
整形外科?泌尿器科?
2023/09/29(金) 11:10:40.92ID:F8aJXNq9
風呂入れよ
https://www.youtube.com/watch?v=DTDMHUuC3rI
2023/10/07(土) 15:05:12.07ID:9HknARLB
>>750
>確かにそれを言い出したら、インストール時も、
>Program Filesの中に同名のファイルがあったらどうするんだとか出てきますが。
Windows Installerは排他実行だった気がする。
2023/10/07(土) 15:05:22.61ID:9HknARLB
>>750
>確かにそれを言い出したら、インストール時も、
>Program Filesの中に同名のファイルがあったらどうするんだとか出てきますが。
Windows Installerは排他実行だった気がする。
2023/10/09(月) 03:22:17.67ID:vj98VpKw
>>764
グロ
768デフォルトの名無しさん
垢版 |
2023/10/09(月) 08:17:21.60ID:2tIVtmSa
リソースの作成は、片山さんのを使っているのですか?
2023/11/27(月) 15:12:37.06ID:hjluQqqG
はい
2023/12/05(火) 09:32:43.89ID:wrsiK2xx
MoveFileExにはMOVEFILE_WRITE_THROUGHというフラグがあって、
直後にディスクへフラッシュすることができるけど、
これと同じことをCopyFileで行うことはできますか?
2023/12/05(火) 12:40:51.43ID:3zuw4Zf7
>>770
単独では無理そうなので、CopyFile2 をつかうといい。
https://devblogs.microsoft.com/oldnewthing/20221007-00/?p=107261
2023/12/05(火) 13:17:40.41ID:wrsiK2xx
>>771
Microsoft公式で、こんな苦し紛れな方法が紹介されているんですね。
MoveFileExはNT3.1以降の関数なのに。
2023/12/05(火) 15:56:54.94ID:qi66pVAj
>>770,771
どっちもそれだけでは不意の電源断でロバストじゃないのが難しい。
2023/12/05(火) 21:13:57.13ID:rxI6O073
タイムスタンプが1970年だかのファイルを仮置きして別名でコピーしたら挿げ替え
電源断が怖いなら挿げ替え部分だけアトミックに作ればいい
2023/12/05(火) 22:40:24.43ID:82k65TSZ
>>774
>電源断が怖いなら挿げ替え部分だけアトミックに作ればいい

この部分は具体的にセオリー的なやり方があるのですか?
挿げ替えで思い当たるReplaceFileはアトミックか分かりませんでした。
2023/12/06(水) 11:02:51.03ID:swAla//2
CopyFileではいったんテンポラリファイルにコピーして、
それをMoveFileExで正しいファイル名に変更するとかやれば、
ちゃんと書き込まれる可能性は高くなるんですかね
2023/12/06(水) 13:32:02.74ID:MnzvwPfi
アトミックなファイル操作
https://heartbeats.jp/hbblog/2013/10/atomic01.html

(ちょっと古いけど)
2023/12/06(水) 18:36:06.88ID:NNCP5uXb
>>775
Rep略はアトミックだよ
MSのどっかに書いてあった
2023/12/06(水) 18:43:37.11ID:NNCP5uXb
https://learn.microsoft.com/ja-jp/windows/win32/fileio/deprecation-of-txf
2024/01/02(火) 18:23:35.28ID:fgzxSMPt
RtlReAllocateHeap(GetProcessHeap(), 0, lpMem, dwBytes)
これをそこそこの頻度でやってると特定回数目にクラッシュしてしまうんだけどどういうことなのだろうか
よくある戻り値null未チェックとかそういう事ではなく上記関数内で落ちるんだよね
lpMemも間違いなく生きてるメモリなのは確認済みでdwBytesも不自然な値ではない

呼び出し方が悪いのかと思ってmalloc、reallocに変えてみてもやはり同様の場所でクラッシュしてしまう
2024/01/02(火) 21:23:43.76ID:rZ40Y3/a
API変えても発生するならAPI関係ない場所のお前のバグじゃん
2024/01/02(火) 23:51:50.03ID:fgzxSMPt
>>781
WindowsのreallocはHeapReAllocのラッパーでHeapReAllocの実態はRtlReAllocateHeapへのリンクに過ぎない訳だが
2024/01/03(水) 00:50:32.19ID:+N5csyKn
mallocやreallocもまともに使えない子はこのスレに来るのはまだ早かったねー
784デフォルトの名無しさん
垢版 |
2024/01/03(水) 01:02:21.99ID:l1Q27XPY
正月ボケを晒すスレ
2024/01/03(水) 09:46:34.80ID:STDOZzf0
free 済のポインタに対して 再び free したんじゃないの?
2024/01/03(水) 09:47:05.92ID:STDOZzf0
realloc の頭で free するからね
2024/01/04(木) 19:03:00.23ID:IQKtoxOL
特定回数でクラッシュするなのがわかってるなら
アドレスがどう変化した時にクラッシュするとかわかりそうなもんだ
788デフォルトの名無しさん
垢版 |
2024/01/04(木) 22:30:57.77ID:ZPN5xQR2
mallocで大きなメモリを取得して、その領域から切り出すalloc関数などを作って差し替えてデバッグするとか?
組み込み系で良くやるけどね。
2024/01/04(木) 22:40:26.44ID:L+x9xVwI
ボソ HeapAlloc()
2024/01/04(木) 22:48:53.63ID:IQKtoxOL
>>786
それはおかしいだろ
(アドレスが変わる場合は)freeする前に新しいアドレスに内容コピーしないといかんから
2024/01/14(日) 00:10:31.18ID:+DXd3tPu
BoundsChecker か PURIFY ですぐ究明できそうな気がするけど
2024/01/16(火) 14:06:03.29ID:YFpb2YHn
メモリのフラグメンテーションで大きい領域がとれないんじゃない?
2024/01/23(火) 16:49:29.22ID:SUJHX/By
ファイルパスなんかはカーネルが結局UNICODE_STRINGとして扱うからwchar版の方がパフォーマンス良いけどadvapi32のレジストリ系関数はどうなんだろうか?
2024/01/26(金) 12:12:36.19ID:h4bsjzTE
WM_MOUSEFIRSTからWM_MOUSELASTのメッセージって、
これから追加されるメッセージもLPARAMはすべてマウス位置のクライアント座標が入る、という約束はありますか?
795デフォルトの名無しさん
垢版 |
2024/02/21(水) 15:57:22.07ID:jTOh+ue+
Spy++のメッセージウィンドウには、「S」や「P」の文字が表示されていて、
それがSendで送られたのかPostで送られたのかがわかるようになっていますが、
これと同じ区別を、自身のメッセージハンドラ上で行うことはできるのでしょうか

InSendMessageというAPIは見つけたのですが、
Spy++で「S」と表示されるものでも0が返ってきてしまいました
2024/02/22(木) 22:51:02.73ID:kQumE7Ak
分別してどうするのさ
2024/02/23(金) 16:31:44.91ID:JzCbi9fb
InSendMessageは別のスレッドからSendMessageされたかを判断する、と説明があるから、
単純にSendMessage呼び出しを判定するものではなさそう

同一スレッドからのSendMessageの呼び出し判定は、ウィンドウプロシジャのコールスタック辿って
SendMessageのエントリポイントと比較するとか、何か追加で頑張る必要がありそう
2024/02/23(金) 17:02:46.18ID:GiKlOj9R
Snedはメッセージキューに来ないからあればPostなければSendやぞ
2024/02/24(土) 00:12:34.16ID:qqiEO45x
内部でIsPostMsgとかフラグ作ってDispatchMessage()を呼ぶ時に1にする終わったらゼロにする
2024/02/24(土) 09:12:26.23ID:niSNojaB
ウィンドウプロシジャが呼ばれる経路はそれだけ?
2024/02/24(土) 13:03:44.44ID:qqiEO45x
Postでキューに入ったのを取り出して呼ばれるのはそこだけでしょう
Sendでは直接呼ばれる
もしウィンドウプロシージャの中からSendしてたらこれは使えない
2024/02/24(土) 13:41:01.55ID:Uzz+lkGd
自アプリ側で予め
SendMessage PostMessage
をフックしとけば良いのでは?
2024/02/24(土) 14:33:49.19ID:5nanMrzK
http://bonurd.winofsql.jp/sb/log/eid175.html
SendMessage と PostMessage のフック
2024/02/25(日) 11:17:44.56ID:GDczOUha
>>796-803
ありがとうございます
Spy++はメッセージをフックしているから、SendとPostの区別もできるということなんですかね
805デフォルトの名無しさん
垢版 |
2024/04/29(月) 03:35:32.42ID:xgq67JZI
intから__int64へ
2024/05/08(水) 06:48:18.53ID:CU7bUsfh
てす
2024/05/08(水) 06:59:53.68ID:CU7bUsfh
自作アプリに対してSendMessageでWM_APP送ってるけど送れてない(受信できていない)ことがあったので
送信側でGetLastErrorしたら
> 0x05:アクセスが拒否されました。
が取れました。

ここによると
ttps://learn.microsoft.com/ja-jp/windows/win32/api/winuser/nf-winuser-sendmessage
> メッセージが UIPI によってブロックされると、 GetLastError で取得された最後のエラーは 5 (アクセス拒否) に設定されます。

これに該当してる?のか他の原因でアクセス拒否されているのか分からないけど、
受け側のアプリはずっと起動したままで直前までメッセージ受信できていたことと、
その後もアプリが死んでいるようには見えず操作できるし動作ログも残るため、
ただただWM_APPメッセージ受信のみ(?)できなくなっているような状況です。

ここで質問ですが、どういう時に急にメッセージ受信できなくなるのか、エスパーお願いします。

今後の対策としては受信側でChangeWindowMessageFilterを使ってWM_APPを許可すれば良さそうだと当たりは付けていますが・・
権限レベルを弄ったりということは一切していないので、問題の発動条件が知りたいです。
2024/05/08(水) 21:35:37.84ID:5PSVmBb2
まず再現性あるのか確認してね
2024/05/08(水) 21:47:14.20ID:5PSVmBb2
んで、この手のシステムからの意図しない介入問題が起きた場合は、
原則プロセスの再作成で解決するしかない
2024/05/08(水) 21:51:37.73ID:5PSVmBb2
これはLow Level Hookが外れた時の対処と同じ
恐らくSendMessageの処理が規定時間以内に終わらなかったとかで適当に介入してるんだろう
知らんけど
2024/05/09(木) 08:54:43.22ID:cRZqeFYn
知らんけどで逃げるなw
2024/05/09(木) 11:45:17.50ID:LBnBOAOP
>>808
再現性ないと言っていいのか、手元では再現できず
エラーが出た環境でも普段は問題出てなくて、たまたま問題が出たのに気付いてログを漁ってエラーコードが分かり、
過去ログも遡ると半月前にも一度エラーが出ていたのは分かりました

この問題が出た環境は24時間PC&アプリ起動しっぱなしということらしく、その時点で
何となくお察し感がなくもないですが原因ははっきりさせたいなと

>>809-810
受信側は一切メッセージの受信を感知していない(ログに全く残らない)ようなので
規定時間以内に終わっていないというようなことではないとは思いますが、
何かしらの原因で適当に介入されている感はすごくあります

まあ適当に〜されたとしても、はっきりしたいところです
2024/05/09(木) 15:19:14.25ID:HEWeaKRP
断片化回避のためにSetFilePointer -> SetEndOfFile -> SetFilePointerサンドイッチってもう古いやり方?
.NETのFileIO実装がSetFileInformationByHandle(FILE_ALLOCATION_INFO)でやってるんだが
2024/05/09(木) 19:16:20.44ID:2Qg6aldP
SSDは?
2024/05/09(木) 21:40:33.69ID:UHyVEDy6
>>811
ちょっと調べてはみたけどstackoverflowでも迷宮入りしててだめだったんよね
SYSTEMプロセスから送れば拒否られないとは思うが
確実にプロセス間通信をしたかったらメッセージよりは名前付きパイプが無難だろうな
2024/05/10(金) 23:35:02.72ID:r04xuHSU
>>815
迷宮入りまで調べてくれてたんですね

確かにパイプが無難です
今さらコイツを修正するには作り直しレベルなのでもう無理ですがw

とりあえずしばらく放置して色々な環境でログ収集して情報整理します
ありがとうございました
2024/05/10(金) 23:49:50.70ID:irdjP1bw
>>807
再現性はともかくとして、SendMessageが途中から拒否られる事象がOSのどのバージョンで発生したか書いといてくれると嬉しい
2024/05/11(土) 03:02:04.26ID:7XNHipLd
>>817
どうもすみません
Windows11 home 23H2です

ちょうど今おかしな環境のPCがまたおかしくなっているようなので調べていましたが、
受信側プロセスが管理者特権に変更されているようで、これが原因ですね

送信側は管理者特権は付与されていませんが、送信側プロセスから受信側プロセスを
起動していますから、最初は特権が付与されていないはず・・・

ということでどちらのプロセスも再起動させたところ、どちらも標準ユーザーになっていました
explorerからexeプロパティを見ても管理者権限はチェックされていないようです

意図せず途中で管理者特権が付与される可能性はあるのでしょうか?
(プログラム的にはそんなことしているつもりはもちろん無いですが)
2024/05/11(土) 12:31:06.19ID:PynvVCIt
無意識にそんな特権付与されたら怖すぎるがなw
システムが一時的に特殊な状態にしてるんじゃないの
2024/05/13(月) 00:51:53.26ID:UH9hVJYb
APIの先で起動されるスレッド(OSが起動する)が管理者特権付きで
それがアクティブな瞬間はプロセスが管理者特権付きに見えて、
そんなタイミングのプロセスに一般ユーザがメッセージ送ると、
管理者様に対して頭が高いぞってアクセスデナイド。
とか想像してみた。
2024/05/13(月) 02:44:07.73ID:eZXBgDRS
818です

ログを見ると、一度メッセージ受信できなくなるとずっと受信できていないようです
管理者特権が付いているのを確認したのはタスクマネージャでの目視ですが、
見たところずっと特権がついているのでタイミングの問題ではなく、何かしらの拍子で特権がついたまま
という感じですね

今のところ、24時間起動したまま使い続けていますがあれから特権はついていません

特権を必要とするようなコードを書いたことない(つもり)なので、原因にたどり着くのは中々難しい状況です
例えば、どんなことをすると特権が付与される(UIもなく勝手に?)のでしょう?
2024/05/16(木) 19:26:12.96ID:s6fDlAb8
心当たりが無いなら今月のCVE-2024-30051だとか特権の昇格の脆弱性のどれかに引っかかってる可能性あり
2024/05/18(土) 14:21:00.21ID:u20XKbPO
>>813
自己レスだけどSetFileInformationByHandle(hFile, FileAllocationInfo...)でやるとサイズが小さい場合にMFT内にデータ埋め込んで完結する場合でも1セクタ確保されてしまうようなので旧来の方法でやる方が無難だった
2024/05/21(火) 10:59:49.66ID:CZsnB0Ll
>>813
埋め込みサイズ上限を上回る新規ファイルを作る場合ならハンドル作成時にアロケーションサイズも同時指定する方が良さそう
2024/05/25(土) 11:34:53.77ID:IsAA9ZVh
>>807,821
疑ってすまないけど、本当に隅から隅まで自分で書いたプログラムなのか?
OSSをちょっと弄った程度で自作アプリと言っているだけなんじゃないか?
2024/05/29(水) 17:30:16.76ID:5SDO0AId
リストビューで範囲選択したときの青い枠の色や内部の半透明な色の値は、APIで取得できるのでしょうか
2024/05/29(水) 18:37:40.98ID:tN3gYMey
出来るよ
2024/05/29(水) 18:43:52.23ID:tN3gYMey
GetSysColor
2024/05/29(水) 18:52:44.95ID:uKjwQH9U
この辺りlinuxやMacのWMとかと違って有る程度の値の取得変更できるのはWindowsの強みだったよな
2024/05/29(水) 19:04:09.64ID:5SDO0AId
>>828
GetSysColorはRGBの値で、透明度の値まで持ったものを返すようには見えなかったのですが、
具体的にどのパラメータを指定するのでしょうか?
2024/05/29(水) 19:05:11.69ID:1pytebYy
他スレでスクリーンショットのマルチポストがあるけど、加えてコントロールの色を取得か

AIに食わせるUI Automation学習データを整備してるのかな
2024/05/30(木) 16:56:56.15ID:32XGh5Dj
半透明じゃなくて字と地の色を反転させてるだけだろ
2024/05/30(木) 21:32:57.61ID:As0oayev
>>832
XPの頃からある範囲選択時の半透明の青なのですが
2024/05/30(木) 21:38:53.94ID:ScAYlfUJ
>>833
プログラム組んでるのなら自分で逆算しろ
2024/05/30(木) 21:44:25.79ID:As0oayev
>>834
どのWindowsでも画面設定とか関係なくこの青なら直値で計算してもいいけど、
なにかのAPIで取得できるなら合わせておきたいです
2024/05/31(金) 08:56:42.01ID:UXfkVjV8
稀によく自分で手を動かすのと人に訊く比率がバグってる奴がいるよな
本人は自覚があるから分散してるつもりだろうけど一回そう思われたら終わりなんだよ
職場で塩対応されてるんだろうな
2024/05/31(金) 13:33:58.54ID:bH8oOxQj
>>835
GetThemeColor じゃだめ?
2024/05/31(金) 15:08:47.69ID:b6j7bQai
COLOR_HIGHLIGHTとCOLOR_HIGHLIGHTTEXTじゃないの?
2024/06/27(木) 10:21:37.70ID:mIdqOGxG
Chromeや秀丸系製品で、タブをウィンドウ外にドラッグすると、別ウィンドウに分割できるのは、
頑張ればプロセス起動で実装できるような気もしますが、
さらに別のウィンドウの中のタブ群に移動できるのは、魔法な気がしますよね。
別プロセスの中にタブをごっそり移動するというのは、難しい気が。
どうも、画面の各タブごとに最初からプロセス起動しているようですが。
Wzエディタとか、複数立ち上げても異なるプロセス間のタブ移動はできないようですが、
これは、ウィンドウ=プロセスだからですよね。

こういうのはWPFでは作れないと思うので、今となってはこのあたりがWin32APIの将来性?
2024/06/27(木) 11:12:44.44ID:dd5BD0xO
SetParent
841デフォルトの名無しさん
垢版 |
2024/06/27(木) 11:13:43.84ID:n/nJ5fKa
>>839
ドロップされたらドロップ元が自分のアプリと確認できればタブ生成して、データを引き取って終わりで駄目?
2024/06/27(木) 11:15:48.39ID:h+EH+DLv
Win32APIでゴリゴリ作ることもできるけど
既存の仕組みを使うならOLEを検討すべきかも
843デフォルトの名無しさん
垢版 |
2024/06/27(木) 11:21:59.93ID:OTNDZ+yC
>>839
将来性も何も30年以上前から変わらない枯れた話だよ
2024/06/27(木) 13:20:20.40ID:mIdqOGxG
異なるウィンドウへタブをドラッグされたときに、ファイルを開きなおすというのは考えたんですけれど、
アンドゥとか、そもそも保存してないデータとかもあるから、案外、難しいんじゃないかと……
秀丸はファイルを開くとプロセス増えてるし。
Wzエディタはファイルを開くたびに増えないけれど、タブの結合に制約が発生するのかと。
Chromeもタブを開くたびにプロセス増えるけれど、これはサンドボックス関係の何かかもしれないですね……
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況