X



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/
2021/12/09(木) 21:37:16.98ID:sYLpmj89
■番外編
WindowsDDK各種についてのスレ
https://mevius.5ch.net/test/read.cgi/tech/1049116134/
D言語 Part35
https://mevius.5ch.net/test/read.cgi/tech/1571979866/
Cygwin + MinGW + GCC 相談室 Part 8
https://mevius.5ch.net/test/read.cgi/tech/1411399211/
2021/12/09(木) 21:37:38.93ID:sYLpmj89
■ネイティブなやつとか
【GUI】wxWidgets(旧wxWindows) その5【サイザー】
https://mevius.5ch.net/test/read.cgi/tech/1270793556/
【Win/Mac/Linux/Android/iOS】 Qt 総合スレ 19
https://mevius.5ch.net/test/read.cgi/tech/1571891527/
●●●●TCL/TKなら俺に聞け 4●●●●
https://mevius.5ch.net/test/read.cgi/tech/1375678740/
2021/12/09(木) 21:38:24.02ID:sYLpmj89
■需要あるかしらん
VRプログラム雑談【Unity/UnrealEngine】【HTC Vive/Oculus Rift/その他VR】
https://mevius.5ch.net/test/read.cgi/tech/1478142101/
OpenGL 2.0 専用スレ
https://mevius.5ch.net/test/read.cgi/tech/1126268759/
【boot】nasm【loader】
https://mevius.5ch.net/test/read.cgi/tech/1377053129/
nim
https://mevius.5ch.net/test/read.cgi/tech/1519896738/
Gtkプログラミング on Windows!!!
https://mevius.5ch.net/test/read.cgi/tech/1147024203/
Borland C++ Compiler オ ワ タ
https://mevius.5ch.net/test/read.cgi/tech/1206951221/
5デフォルトの名無しさん
垢版 |
2021/12/09(木) 21:41:40.87ID:sYLpmj89
>2以降の各リンクDAT落ちチェックしてたら、どのスレも停滞してて生きてた
化石過ぎるやろ
というかこいつら要らんやろ


Win32API 永遠なり
6デフォルトの名無しさん
垢版 |
2021/12/10(金) 00:50:20.82ID:eLt0CNh3
>>5
>Win32API 永遠なり

その通り
とどのつまりdllエクスポート関数の使い方が変わるだけ
2021/12/11(土) 00:02:17.29ID:+x6DQ55C
結局C#とか使っててもWindowsである限りP/Invokeで使わざるをえない
.NETで全然置き換えできねえ
2021/12/11(土) 13:17:54.11ID:3r8QLyb+
>>7
C++/CLIとかいやなの?
2021/12/11(土) 13:36:26.05ID:ciUW3N8E
C++/CLIでも同じでは?
2021/12/11(土) 13:45:53.81ID:E/VsNyVn
まあC++のライブラリ呼ぶならC++/CLIの方がいいだろうけどWin32 API呼ぶだけならP/Invokeでいいな。
2021/12/20(月) 17:11:58.59ID:HKU5LyBA
IsWindowVisibleは、上位のウィンドウのWS_VISIBLEも再帰的に調べてくれるのに対して、
IsWindowEnabledは、上位のウィンドウが無効でも自身が有効だとTRUEになってしまいます。
上位のウィンドウのどこかが無効なら自身も操作できないのだから、
一発で状態を返してくれる関数があってもよさそうなんですが、
自分で再帰的に調べないといけないものなんでしょうか。
2021/12/20(月) 18:47:23.36ID:U8G2rajF
そうでござる
2021/12/21(火) 15:12:53.73ID:K4RksYnA
親となるメインウィンドウからCreateWindowの8番目のパラメータで親(オーナー)ウィンドウハンドルを指定して作成した
別ウィンドウ(WS_CHILDWINDOWを付けず一般的なWS_OVERLAPED属性等を付けたもの)はGetParentで
親(オーナー)を取得できず、GetWindowでGW_OWNERを指定すればオーナーウィンドウが取得できます

このことから、これらのウィンドウは親子関係みたいですが親子とは言わないと思います
どう言えばいいのでしょう?

オーナーウィンドウと派生ウィンドウ?

今までは漠然と親子呼びしていたのですが、上記例ではGetParentで親ハンドルが取れないのに気付いたことと
EnumChildWindowでもWS_CHILDWINDOWが付いたものしか列挙されないことから疑問に思いました
CreateWindowの8番パラメータ説明でも parent window って書いてますし
2021/12/21(火) 21:14:02.07ID:MsBf3e8R
オーナーと親は別もの
2021/12/21(火) 22:10:59.06ID:+CwUc5NJ
SetParentで養子に
2021/12/22(水) 08:28:16.99ID:/vmqk8la
https://docs.microsoft.com/ja-jp/windows/win32/learnwin32/what-is-a-window-
2021/12/22(水) 14:04:12.64ID:YXB4LcTi
>>16
そこは見ていたのですが、「オーナー」と「所有」という直訳っぽいとうか特に「所有」
ウィンドウという言い方は聞かないので、そこは置いておいてみんなどう呼んでるのかと思った次第で

皆さん特に呼び分けてない感じなんですかね?
オーナーウィンドウはまだ呼ぶと思いますが
2021/12/23(木) 02:10:36.86ID:gHIFazbo
全く理解してないな
所有はそのままの意味。金魚のフンみたいなもの
親ってのはツリーデータ構造においての子に対しての親って意味だから全く別の概念
2021/12/23(木) 02:45:29.60ID:wk5RL8qz
みんなどう呼んでるのって話を理解してください
2021/12/23(木) 10:00:44.65ID:lsirm1I0
ふと疑問に思ったのですが、Win32GUIってWndProcを利用せずメッセージループ内で全て処理をするって可能なんでしょうか?
実験してみろって話かもしれませんが知ってる方いらしたら教えてください

そもそもなぜWndProcを一々呼び出す仕組みなんでしょう?
DispatchMessageとか呼ぶくらいならその場でメッセージSwitchしたり自前の関数呼ぶなりした方がよさそうなものですが
2021/12/23(木) 10:16:30.88ID:YP7dkfo9
全メッセージをループで処理する必要が出てくる
ウィンドウAもBもCもダイアログAもBも
それでもやる?
2021/12/23(木) 10:17:20.81ID:656VzGPj
複数のウインドウを開いていると
メッセージループに複数のHWNDが入ってくる
そうなるとHWNDで鬼のようにelse ifしまくって
さらにそれぞれメッセージIDでswitchだ
想像を絶する巨大WinMainになるぞ
2021/12/23(木) 10:37:37.73ID:zHsDBG/s
>>20
その場合、すべてのメッセージに対応する動作を自前で把握し処理しないといけない
しかもウインドウごとに微妙に違う部分もすべて適切に自前で処理する必要が出てくる
デフォルト動作でいい部分はデフォルト処理に任せる、それがWndProc
開発者は変更部分のみ追加するだけで済む
2021/12/23(木) 11:55:56.08ID:lsirm1I0
>>21-23
完全に納得しました、有難うございます
WinMainスタック上のオブジェクトをそのまま利用出来たら、思ってそう考えましたが明らかに割に合いませんね
素直にWndProcとDispatchMessageに任せる事にします
2021/12/23(木) 18:48:39.58ID:qq3JZERH
>>13
うーん「手前ウィンドウ」?
最初のウィンドウズではPOPUPウィンドウがないからはみ出さないウィンドウを子供と呼んでいたが
後からオーバーラップが自由にできるようになって用語がごちゃごちゃになってしまったんじゃないかな
知らんけど
2021/12/23(木) 19:54:16.02ID:Oty3ol47
>>25
公式が特に何かしらの呼称を設けてないみたいだし誰も分からん気はする
親子じゃねえよ分かってねえなあ〜って知識マウント?しか湧いてないのが証明してる
知らんけど
2021/12/23(木) 20:52:33.67ID:D0B/DSqq
Zオーダーにまつわる 親子関係と
キーボード入力やらの取り分の範囲にまるわるオーナー関係
2021/12/24(金) 01:38:56.57ID:Ht7d5qM4
>>17
>>16の英語原文で斜体になっている「parent」「child」「owner」「owned」の4つがマイクロソフトの公式用語

owner windowの日本語訳は普通に「オーナーウィンドウ」が定訳だと思うよ
一方、owned windowは定訳が存在しないね

マイクロソフトの日本語機械翻訳では
owner window = 所有者ウィンドウ/オーナーウィンドウ
owned window = 所有ウィンドウ
となってるけど、この後者はあまり良い訳ではないと思う
2021/12/24(金) 01:58:58.45ID:7KWgwZvx
>>20
なんかわかります
中で何やってるのか理解していないと気持ち悪い、みたいな
私は最初の頃、MFCとか触れなかったし(今も)、WinMain?mainじゃだめなの?とか
cランタイムのstrcpyがあるのに、Win32APIのlstrcpyがあったり、摩訶不思議でした
2021/12/24(金) 02:52:14.64ID:ogM6Neon
え?MFCのソース読んでないの?
2021/12/24(金) 08:46:41.12ID:30ABCQu6
昔のwin16はfar版とかnear版とかあってめんどくさいからlstrcpyを用意したんじゃなかった
2021/12/24(金) 16:58:46.51ID:rp3Y3leG
ニヤは無視すればいいだけじゃん?
どっちかというとlstrcpyW()の必要性からだと思う
2022/01/04(火) 08:56:43.21ID:58wYEt3v
タスクトレイのアイコンの上でマウスホイールを上下させて音量調整できるフリーソフト見つけたんだけど、
あれ、どうやっているんでしょうか?
タスクトレイの表示座標を取得して、フックすればいいんだけど、座標を取得する方法がわからない。
それともタスクトレイのアイコンでもホイールのイベント取得できる?
2022/01/04(火) 10:41:52.03ID:qiN456rw
Shell_NotifyIconだよね?
WM_MOUSEWHEELはこないね
35デフォルトの名無しさん
垢版 |
2022/01/04(火) 10:52:18.23ID:4cEZtgLZ
SetWindowsHookEx(WH_MOUSE_LL) じゃないかな
dumpbin.exeとか使ってそのソフトが呼び出してるAPIを調べてみるといい
2022/01/04(火) 17:36:23.31ID:mpSUdZEa
Shell_NotifyIconのuCallbackMessageにメッセージID登録するとでLPARAMからMOVEとかのマウスイベントがやってくる
マウスがアイコン上をホバー中かどうかはこれで判定する
タスクトレイの長方形はFindWindow("Shell_TrayWnd",NULL)で取得したHWNDからGetWindowRectで取れる
その中の自分のアイコン長方形の取得の方法は昔調べた限りでは見つからなかった
従って、上のイベントが初めて起きた時にGetCursorPosで座標を取得しておき、
タイマーでマウスがその座標周辺にいるかどうかを大雑把に監視しつつ、
フック側のホイールイベントでトリガするという処理になると思う
37デフォルトの名無しさん
垢版 |
2022/01/04(火) 18:17:52.10ID:a2P6Hn/H
富士通「年収3500万円」の衝撃 ソニー、NECも戦々恐々の「グローバル採用競争」

「富士通年収3500万!」日本のIT企業の年収も、高額化してきました

ゼロから起業するよりも事業承継(小さな会社の買収)が圧倒的に有利である3つの理由

「エース人材だって起業OK」、NECは挑戦者が集う場をつくる

NECなど「出向起業」 大企業人材、起業しやすく

パナソニックの社内ベンチャー「ゲームチェンジャー・カタパルト」で
事業化されるかもしれない注目の新規ビジネス

ゼネコン鹿島、DX化で狙う建設業界の地殻変動

NTTドコモ、建設業向けDXの新会社 コマツ、野村総合研究所などと共同で
2022/01/04(火) 19:22:36.99ID:iCrtIo/s
>>33
> タスクトレイの表示座標を取得
面白そうなネタなんで探してみたら、こんなのあった。
ttps://www.petitmonte.com/bbs/answers?question_id=25298
3933
垢版 |
2022/01/04(火) 20:21:23.69ID:58wYEt3v
>>34,35,36,38
レス、ありがとうございます。
昔、自作の音量調整ソフトで実装断念した機能でした。
久しぶりにプログラミングやってみます。
40デフォルトの名無しさん
垢版 |
2022/01/05(水) 10:12:14.60ID:60pDLcUB
CHM(HTMLヘルプ)って今でも現役だよね?
2022/01/05(水) 13:52:02.98ID:ga42ykuy
10標準じゃもう使えないよ
分解するツールでばらした記憶がある
2022/01/06(木) 02:22:47.54ID:NntPX0Am
ヘルプファイルの仕様をコロコロ変えるの迷惑
HLPだって制限付きならともかく全面廃止は横暴すぎ
43デフォルトの名無しさん
垢版 |
2022/01/06(木) 02:35:26.27ID:4VMA3TxB
CHMの後継になるはずだった「Microsoft Help Viewer」だけど、Visual Studio 2015のヘルプファイルがリリースされてからまったく更新がない。
「Microsoft Help Viewer」はCHMよりも先にオワコン化しそうな気がするんだけど。
44デフォルトの名無しさん
垢版 |
2022/01/06(木) 02:39:48.25ID:4VMA3TxB
CHMはWindows用Python3.xのヘルプファイルに採用されているのでまだまだ現役だと思いたい
2022/01/06(木) 04:41:52.18ID:RZuWQS3v
今時ヘルプは全てWEBで見ろオフラインなんか知らんスタイル感
WEBに飛ぶと404でトップページにリダイレクト感
ユーザーはヘルプ読む労力が辛い感と開発もヘルプ更新するのに疲れ切ってる感
2022/01/06(木) 09:40:06.04ID:mqPTm+Ey
>>42
HLPは全面廃止と言うよりある意味制限付きでは?
うちはWindows10だけどHLP現役よ
47デフォルトの名無しさん
垢版 |
2022/01/06(木) 11:47:58.14ID:4VMA3TxB
hlp拡張子のファイルあるかなと思って探したら、以下のように最新のVisual Studio 2022にバンドルされてて
C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\Tools\errlook.hlp

hlpアイコンまでちゃんとあるから動くもんだと思ってダブルクリックしたら、Edgeブラウザで以下Webページが開く予定調和
https://support.microsoft.com/ja-jp/topic/windows-%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%A7%E3%83%98%E3%83%AB%E3%83%97%E3%82%92%E9%96%8B%E3%81%93%E3%81%86%E3%81%A8%E3%81%99%E3%82%8B%E3%81%A8-%E6%A9%9F%E8%83%BD%E3%81%AF%E5%90%AB%E3%81%BE%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%9B%E3%82%93-%E3%81%BE%E3%81%9F%E3%81%AF-%E3%83%98%E3%83%AB%E3%83%97%E3%81%AF%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%9B%E3%82%93-%E3%81%A8%E3%81%84%E3%81%86%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B-3c841463-d67c-6062-0ee7-1a149da3973b
48デフォルトの名無しさん
垢版 |
2022/01/06(木) 16:46:11.83ID:flMntYS9
*.hlpを分解できるツールとかないの?
hlpファイルの詳細な仕様書でもいいけど
2022/01/06(木) 19:46:36.73ID:MHUcKt/l
>>48
> hlpファイルの詳細な仕様書でもいいけど
https://www.oocities.org/mwinterhoff/helpfile.htm
2022/01/07(金) 14:07:50.44ID:vH8VeFTJ
ならおまいらで独自のもの作って広めれ
2022/01/07(金) 14:26:37.48ID:vg2SqbXr
HTMLヘルプは、アプリのヘルプとしては使わないというか使えない
要求仕様を満たすための形式的な役割で使うだけ
52デフォルトの名無しさん
垢版 |
2022/01/07(金) 14:31:02.53ID:TxBgGQ6X
>>51
「HTMLヘルプ」は何を指すの?
CHMではなく汎用的なHTML文書という意味で言ってると仮定させてもらうけど、
天下の「Git for Windows」のヘルプがhtmlファイルをWebブラウザを開く形式で提供されていることについてどう思うの?
2022/01/07(金) 15:49:05.96ID:vg2SqbXr
ヘルプとマニュアルの仕切りがどこにあるかわかりませんが
使用中にピンポイントにその使用方法を提示できるんであれば、それでいいんじゃね?
2022/01/07(金) 15:56:16.42ID:TxBgGQ6X
一例を挙げると、git log --help とコマンドプロンプト上で入力したらWebブラウザが起動して以下のHTMLページが表示される変態仕様、それがGit for Windows
file:///C:/Program%20Files/Git/mingw64/share/doc/git-doc/git-log.html
2022/01/07(金) 16:14:05.22ID:780pf0Q/
>>48
hh.exe -decompile folder chm

http://instany.seesaa.net/article/157173789.html
2022/01/07(金) 16:32:56.59ID:3+0nIzbY
>>50
素人受けするものがいいでしょうね

┌────────┐
│何を調べますか?│
│| ̄ ̄ ̄ ̄ ̄ ̄ ̄|│
│|お前を消す方法|│
│|_______|│
│[オプション][ 検索 ]│
└─────v──┘

   __/|_
 _/    \
〈―― ●   \
  ̄\___   ヽ
   />―|ヽ―-、|
      \| ̄\|_
        (人_)
2022/01/07(金) 16:41:31.88ID:vg2SqbXr
>>54
それをGUI操作の提示方法としてどう実装するかですね
操作仕様を考える時点で考慮してたかどうかでだいぶ変わる
2022/01/07(金) 18:07:52.60ID:33WVySKZ
chmは表示にIEのコンポーネント使ってると思うんだけどサポート期間終了したらどうなるんだろう
あとUnicode対応じゃないんだよね
本文UTF8で書くと検索できないしインデックスもUnicode系統は使えない
2022/01/07(金) 18:11:08.09ID:toxoOshM
コマンドプロンプトで、start a.html
とすれば、ブラウザが開く

相対パスで、start ./x/y.htm
とか
2022/01/07(金) 20:50:54.17ID:YhEtWwe9
CHMって検索が不便だった気がする
分解してHTMLをGREP掛けた方がいいとかそんな感じ
2022/01/08(土) 16:59:43.13ID:IoztRjy4
検索用インデックスが手入力だったかと
62デフォルトの名無しさん
垢版 |
2022/01/09(日) 08:21:52.72ID:FkRbo6qA
WM_NOTIFYメッセージで以下のように lParam を LPNMHDR と LPNMTBCUSTOMDRAW の2つにキャスト可能です。継承などもしていないのになぜキャストできるのか理解できません。どいう仕組みでキャストできているのでしょうか?

LPNMHDR pnmh = (LPNMHDR)lParam;
switch (pnmh->code) {
case NM_CUSTOMDRAW:
{
LPNMTBCUSTOMDRAW lpNMCustomDraw = (LPNMTBCUSTOMDRAW)lParam;
2022/01/09(日) 08:30:42.36ID:VQrKDYa7
そもそもC言語のポインターキャスト自体は通常どんな構造体や型でもエラーなしでできる
ただし正しく動く保証はない(プログラマの責任)
でその2つの構造体は包括関係になっててNMHDRのメンバーの部分が共通ってこと
NMHDRの後ろにNMTBCUSTOMDRAW固有のメンバーが並んでる構造のはず
64デフォルトの名無しさん
垢版 |
2022/01/09(日) 08:35:06.13ID:FkRbo6qA
>>63
ありがとうございます。理解できました。
2022/01/12(水) 16:25:03.32ID:+efdTYZ0
ShellExecuteを使うと、拡張子に関連付けられたアプリで開けるけど、
「このファイルを開く方法を選んでください」の画面を出す方法はありますか?

メールアプリなどは、添付ファイルを右クリックすると、
「開く」の他に「アプリケーションから開く」のようなメニューもあって、
それを選ぶと上記の画面が出てくるので、なにか方法はあると思うのですが
2022/01/12(水) 16:32:06.52ID:F2PdGvXs
一時的に関連付け削除してるのでは?
知らんけど
2022/01/12(水) 18:23:17.98ID:JKAG73tm
>>65
動詞"openas"かな?
試したことないけど
2022/01/13(木) 13:39:03.68ID:MYQMTdwJ
>>67
ShellExecuteの第2引数に_T("openas")を入れてみましたが、
戻り値が0x0000001F(SE_ERR_NOASSOC)になってしまいました
2022/01/13(木) 20:02:30.01ID:gOiUT2XU
>>65
コマンドプロンプトからこれで表示は確認できた
%SystemRoot%\system32\rundll32.exe %SystemRoot%\system32\shell32.dll,OpenAs_RunDLL ファイルのフルパス名
これをプログラムから実行するのは適当な方法でいけると思う
2022/01/13(木) 20:43:33.40ID:kn1ls6LS
コマンド呼び出し文字列を変更する手段を用意しとかないと、使えなくなった時に積むでしょ
2022/01/13(木) 20:56:49.79ID:gOiUT2XU
>>70
俺に言ってるのかな?
何言ってんのか判らんけどpowershell上からpinvoke経由でも普通に呼べるけど
2022/01/13(木) 21:06:10.72ID:kn1ls6LS
他人に提供する場合は気にしたほうがいいってだけ
2022/01/13(木) 21:15:59.19ID:zlr4Kbw5
>>69
このヒントを元に探してみたところ、WinMergeのソースが見つかりました。
GetSystemDirectoryやShellExecuteを使って、全く同じことをやっていました。
ありがとうございます。
2022/01/13(木) 21:16:09.21ID:gOiUT2XU
どうも話が通じない人みたいだから俺は去るね
>>65に伝わればそれでいいので
2022/01/13(木) 21:18:23.56ID:H+18Uz0q
懐かしのWinMerge
2022/01/13(木) 21:22:03.15ID:kn1ls6LS
>>74
Win32APIスレなのにUndocumentedな話してるからだが
2022/01/13(木) 21:27:35.21ID:b+qvLzV0
原理的にこれ相当でできるって話だからスレチではない
意味が伝わってないどころか会話も通じていないコイツのスレチを超える常軌を逸した脳味噌に驚愕する
2022/01/13(木) 21:36:13.59ID:kn1ls6LS
公式な仕様として公開されてない機能を使う時は要注意だし、
サポート打ち切りを想定してコマンド呼び出し文字列を変更する手段を用意しておくのは当然だろ。
2022/01/14(金) 13:34:07.42ID:yD3j1Fg+
公式サイトに乗ってないからここで質問してるんでしょうが
多少のリスクは自己責任だ
80デフォルトの名無しさん
垢版 |
2022/01/14(金) 13:45:56.78ID:/3p7Tbub
行きはよいよい 帰りはこわい
こわいながらも
通りゃんせ 通りゃんせ

関東で生まれた童謡ってのが意外だよな
2022/01/14(金) 13:56:06.62ID:A/cS6S7f
サポート打ち切りや仕様変更によって開発したソフトやユーザーがどのような影響受けようが、
このスレ的には大きなお世話としか言いようがない
エラー処理は自己責任でやるだけだ
問題の糾弾は元凶であるMSに言え
2022/01/14(金) 14:03:27.75ID:/3p7Tbub
Win32API質問箱 Build127
2022/01/14(金) 14:16:06.92ID:o4SvXBFp
>>ID:/3p7Tbub

スレチ
2022/01/14(金) 21:54:45.73ID:J37qhhdP
代替案を示すでもなく大昔から変わってない方法にケチつける時点でノイズ
2022/01/20(木) 13:52:02.54ID:5C47L32n
_beginthreadで作成したスレッドが、後で親プロセスから見て生きているかどうかを調べる方法はありますか?
基本的にずっとループして生きていることを期待しているスレッドですが、何らかの不具合でスレッドが異常終了した
ことを親プロセスで検知したいのです

スレッド側でシグナルオンオフしたりグローバル変数で動作してることを常に書き込むなどの工夫は思い付きましたが、
そもそもスレッドハンドルを使って有効か無効かを知る方法があれば簡単なのですが、そのような方法はありますか?
2022/01/20(木) 14:31:29.07ID:UFDwubQ6
GetExitCodeThreadかのう
2022/01/20(木) 14:37:16.67ID:xRXRc1mt
>>85
_beginthread でなく CreateThread でスレッド作成し、スレッドハンドルを受け取る
スレッドハンドルはスレッド停止でシグナル状態になる
スレッドハンドルの状態を WaitForSingleObject で監視する
2022/01/20(木) 15:27:31.83ID:5C47L32n
>>86-87
頂いた情報を元に色々テストしてみます
どうもありがとうございました
2022/01/20(木) 17:07:19.13ID:mJD5+zFk
_beginthreadexで作成して
GetExitCodeThreadは?
2022/01/20(木) 18:12:57.50ID:5C47L32n
_beginthreadはCランタイムを使うために必要なメモリ処理を追加したCreateThreadのラッパーらしいのと、
WaitForSingleObjectでの監視はこれまでも問題なく動作していたので、_beginthreadのままタイマー監視で
WaitForSingleObjectのテストしてみました

スレッドの異常終了に対応できるのかはテストできません(異常終了の再現はどうすれば?)のでスレッド途中で
特定条件で_endthreadを実行しただけですが、これは当然でしょうが問題なくWAIT_TIMEOUTの判定でスレッド状態を検知できました

同じく、WaitForSingleObjectの代わりにGetExitCodeThreadに置き換えた場合、スレッド動作中は
STILL_ACTIVEの判定、スレッド停止中はGetExitCodeThread自体がエラーで返ってくることでスレッド状態の検知ができました
(スレッドは永久ループで戻り値を返しませんから、threadex系を使っていません)

_endthreadを使ってのスレッド途中終了ではなく、異常終了時も同じように動作するのかが不安材料ですが、
とりあえずこれでOKということにしておきます(スレッドが動いていないんだったら各APIも同じ動作では?という判断)

どうもありがとうございました
2022/01/20(木) 20:46:12.90ID:Ibae9TV2
_beginthreadexはCreateThreadと同じハンドル返すやつやぞ
スレッド内でCランタイム使う場合こっち呼ばないとダメとか教わったりしてないのか
技術の断絶が起きてるのか
2022/01/20(木) 20:54:27.58ID:PY3Mro/S
誰に言ってるんだ
2022/01/20(木) 20:58:50.89ID:kUGZMDvk
>>90
スレッドの生死判定にGetExitCodeThreadを使うのは万が一スレッドが終了コードとしてSTILL_ACTIVEを返すと誤判定するからWaitForSingleObject使えって書いてあるよ
https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-getexitcodethread
2022/01/21(金) 02:20:25.63ID:Fsu/5xwq
>親プロセスから見て

子プロセスのスレッドのハンドルって親プロセスから見えるの?
2022/01/21(金) 02:37:12.98ID:rP34XQ0N
文脈的にスレッドから見て起動元を親プロセスと呼んでるだけかと
2022/01/26(水) 11:00:15.39ID:vhiSf69I
1秒おきのタイマーでtmDraw()を呼んで右に伸びる四角を描くプログラムです。VSCでMFC未使用。
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_PAINT:
OnPaint(hWnd);
break;
case WM_CREATE:
SetTimer(hWnd,1,1000,(TIMERPROC)NULL); //タイマー定義
break;
case WM_TIMER: //タイマー
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
tmDraw(hdc); //これを呼んで描画
EndPaint(hWnd, &ps);
}
break;
return 0;
}
static VOID tmDraw(HDC hDC)
{
SetDCPenColor(hDC, RGB(0x99, 0x66, 0x00)); //ここが呼ばれてるのは確認
SetDCBrushColor(hDC, RGB(0xFF, 0xCC, 0x00));
Rectangle(hDC, SIZE16(0, 0, cx++, 6)); //伸びる描画
}
最初の1回の描画はされます。タイマーでtmDraw()が呼ばれてるのは確認しています。
呼ばれて描画されてるはずなのですが、実際の画面は更新されず四角は伸びません。
windowサイズを手動で変えていくと四角は右に伸びていき更新されます。
タイマーでtmDraw()が呼ばれた時に描画だけでなく画面の更新もされるようにするにはどうすればよいですか?
2022/01/26(水) 11:09:13.12ID:TX0OTodc
WM_TIMERでメモリDCに対してtmDrawの内容で描画、更新が必要な長方形に対してInvalidateRectを呼ぶ
WM_PAINTでBeginPaintの処理するが、ここではBitBltで更新が必要な長方形に対しメモリDCから画像転送だけするのがセオリー
WM_PAINTで直接描画してもよいが、WM_PAINTはイベント発生タイミングがOS依存のためタイマー以外でも必要時毎回tmDrawが呼び出されることになり時間が掛かる描画をここでやってると糞アプリ認定が俺からされる
2022/01/26(水) 11:17:10.02ID:TX0OTodc
それと下みたいな描画処理内に状態を更新する処理を入れるのはタブー俺からど突かれる
>Rectangle(hDC, SIZE16(0, 0, cx++, 6)); //伸びる描画
tmDraw(); // 描画
tmUpdate(); // 状態の更新
に分けて、tmUpdate()内でcx++;を記述するべき
2022/01/26(水) 11:20:11.61ID:vhiSf69I
WM_TIMER:でInvalidateRect(hWnd, NULL, NULL);で更新されるようになりました
ありがとうございます
2022/01/30(日) 15:28:34.78ID:CkvbqakA
>>65
SHOpenWithDialog
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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