Win32API質問箱 Build126

レス数が900を超えています。1000を超えると表示できなくなるよ。
1デフォルトの名無しさん
垢版 |
2020/05/01(金) 22:16:51.96ID:ZJ42fMZB
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/
2021/09/15(水) 12:49:21.43ID:iNVe1A73
>>827
スタックはスレッド単位あるね
2021/09/15(水) 12:51:46.74ID:LR7HEnPp
>>828
あぁプロセスを跨がないって言った方がよかったな
2021/09/15(水) 13:39:40.30ID:5Dhe4KoF
>>826
確かにデータへのポインタであれば長さも渡す必要があるはずですし型名からしても説明からしても明らかに仰る通りでした

>>827
GlobalAllocもあくまでプロセス単位であって、GlobalAllocに書き込んだデータをOSに教える → SetClipboardDataでOS管理化のバッファに渡される(CloseClipboardするまでフラッシュはされない?)
という原理であるはずなので、hMemはスタックやmallocでも良いのでは?と思った次第です
しかしながら単純なデータへのポイントではないという事で納得しました
2021/09/15(水) 14:21:18.54ID:SFBdYzCp
>>830
GlobalAllocと言っても引数に渡すオプションで変わるぞ
GMEM_FIXEDを渡せばプロセス単位でアクセス可能なメモリ(プロセスを超えてアクセスはできない)
GMEM_MOVEABLEを渡すとプロセスを超えて使用できるハンドルが返る
この時点でプロセスのメモリ領域はまだ確保されていない
その後GlobalLockによってプロセスのメモリ空間にマップされる

>SetClipboardDataでOS管理化のバッファに渡される
SetClipboardDataに渡すのはハンドルであってメモリじゃない
言い換えると、システム(クリップボード)は渡されたハンドルの複製を作ってそれを保持するだけ
ハンドルが示すリソースには参照カウンタがあって、すべてのハンドルが閉じて初めて解放される
つまりGlobalAlloc、GlobalFreeでプロセスがハンドルを閉じても、クリップボードに渡されたハンドルが生きているからデータを維持し続ける
新たにクリップボードにコピーや切り取りをするとそれまでの複製されたハンドルを閉じるので参照カウンタが0になり実際に開放されることになる

>(CloseClipboardするまでフラッシュはされない?)
GlobalUnockをした時点で書き込まれたデータはハンドルさえ知っていれば誰でもアクセスできる状況にある
言い換えると「フラッシュされるタイミング」はGlobalUnockしたときと言えるだろう
ただしCloseClipboardすることで「ハンドルの複製」が確実に行われるということではある
プロセスはCloseClipboardを呼び出す前に渡したハンドルの開放を行うべきではないと書かれている
(これはシステムがハンドルの複製する前にプロセスが元のハンドルを解放して参照カウンタが0になってしまいデータそのものが解放されるのを防ぐためだろう)
2021/09/15(水) 14:22:39.60ID:SFBdYzCp
訂正

× つまりGlobalAlloc、GlobalFreeでプロセスがハンドルを閉じても、
〇 つまりGlobalFreeでプロセスがハンドルを閉じても、
2021/09/15(水) 14:54:01.66ID:+suq2kti
クリップボードを使うときGlobalAllocで割り当てたメモリは解放しなくていいって聞くけど
クリップボードを経由せずにHGLOBAL値を他のプロセスに渡してもGlobalLockでアクセスできないよな
ということはクリップボードもメモリオブジェクトそのものをムーブしているのではなく実はコピーしてるだけ?
だったら貼り付けた側でもGlobalFreeすべきなのかな
2021/09/15(水) 14:55:37.48ID:SFBdYzCp
>>833
>クリップボードを経由せずにHGLOBAL値を他のプロセスに渡してもGlobalLockでアクセスできないよな
あれできなかったっけ?
2021/09/15(水) 15:21:21.14ID:+suq2kti
さっきやってみたらできなかった
実験のやり方がまずいのかな
2021/09/15(水) 15:22:27.17ID:+suq2kti
FileMappingより簡単な方法があるのかと期待したんだけど
2021/09/15(水) 15:32:27.38ID:iNVe1A73
win16apiと混ざってないか?
2021/09/15(水) 15:33:50.71ID:+suq2kti
32だとGlobalFreeすべきってなってる?
2021/09/15(水) 15:39:39.86ID:5Dhe4KoF
>>833
GlobalAllocしたプロセスを閉じた後もちゃんとクリップボード内のデータは残るのと
SetClipboardData → CloseClipboard → GlobalFreeという非公式な手順でFreeをした後もちゃんとクリップボード内のデータは残るため、あくまで実データはOS側へコピーされているという認識でした

メモリビューアで眺めた感じだと成功した後にGlobalFreeを行わなくても、
GlobalAlloc(GMEM_MOVEABLE, size)の戻り値->、GlobalLockの戻り値->共に該当アドレスへ別データ上書きは確認されたので、ちゃんと解放されているものと思われます
2021/09/15(水) 15:45:35.08ID:LR7HEnPp
https://docs.microsoft.com/ja-jp/windows/win32/api/winuser/nf-winuser-setclipboarddata
> The application may not write to or free the data once ownership has been transferred to the system
ないね
2021/09/15(水) 15:46:32.86ID:zA2ywaMe
SetClipboardData の第一引数は CF_PRIVATEFIRST + 定数 だったりするのかな
2021/09/15(水) 15:46:35.24ID:+suq2kti
なるほど
クリップボードがメモリオブジェクトをGlobalFreeしているので
アプリ側でGlobalFreeすると二重解放になるのは
ムーブかコピーかによらないってことか
2021/09/15(水) 15:56:39.26ID:iNVe1A73
「メモリ割り当て方法の比較」という
MicroSoftの資料を一読したら?

GlobalAlloc はHeapAllocのラッパ
2021/09/15(水) 16:10:58.96ID:MM/6t6np
ヒップホップ
2021/09/15(水) 23:17:32.21ID:qRxK7g6Y
Win16の頃のドキドキひやひや感が無くなったよな
2021/09/16(木) 02:35:41.36ID:fi5zSZqt
せやな
847833
垢版 |
2021/09/16(木) 07:33:53.55ID:T1nJe1PW
礼を言ってなかった
みんな、ありがとう
848デフォルトの名無しさん
垢版 |
2021/09/18(土) 08:35:19.11ID:bA/qQPAi
https://mevius.5ch.net/test/read.cgi/tech/1553075856/
>>743-744
最近は LLVM が API 出力してんのか
2021/09/18(土) 21:23:52.02ID:YYDlQyy6
?
2021/09/18(土) 21:25:09.62ID:7htd6rFv
??
2021/09/20(月) 12:21:13.96ID:rmuhdvcF
馬鹿はこっち来んな
2021/09/20(月) 16:25:14.73ID:8WyTbttR
?
2021/09/20(月) 17:27:32.75ID:Nby1mowW
??
2021/09/20(月) 20:57:23.65ID:niSQE6rP
???
2021/09/21(火) 06:12:03.22ID:rkkhSUpi
\\?\
856デフォルトの名無しさん
垢版 |
2021/09/21(火) 16:25:25.08ID:jHV9ARm/
“過剰なまでの虫嫌い”増加の理由は「感情の誤反応」…東大院が分析(女性自身)
https://news.yahoo.co.jp/articles/ef5d563d39c9b3f03ceb927fe74aeb140b8e7436
2021/10/01(金) 02:53:14.59ID:da71++8d
Windowsゲームプログラミング (Game developer) 単行本 – 2004/5/1
最新版 12歳からはじめる ゼロからのC言語ゲームプログラミング教室

ってWIN32API始めたての人でも読んでも難しくないでしょうか?
読んだことある方いらっしゃいましたら教えていただきたいです。
書籍スレで同じことを聞いたのですが内容に関して教えてもらえなかったのでこちらで…
2021/10/01(金) 03:08:14.03ID:aOhU7LIV
17年前の本ね…
2021/10/01(金) 03:32:01.27ID:7LdF/tqC
>>857
32BITで良いならありじゃね?
2021/10/01(金) 03:39:25.63ID:I1/iB9Go
>>857
あなたの頭の出来までは分からないから
難しいかどうかは分からんなあ
見たことないから知らんけど
2021/10/01(金) 04:12:41.60ID:YSb3+a7i
素人:本が判り易いかどうかを聴く
普通の人:その本で何が出来るかを聴く
出来る人:その本が役に立つかどうか自分で考える
2021/10/01(金) 05:30:04.22ID:V7ei2X1Y
>>860
CとC++の入門書2冊ずつやった程度です。
素人レベルなので0からでも分かるかどうか教えてほしいです。
863857
垢版 |
2021/10/01(金) 05:31:43.69ID:V7ei2X1Y
>>859
32Bitじゃなくて新しいWIN32APIの入門書もあるのでしょうか?
古い技術だからかAmazonで色々漁っても古い入門書しか見つからなかったです
2021/10/01(金) 05:50:55.06ID:HJPpsjNl
無い
2021/10/01(金) 05:53:09.89ID:alrYkh/f
古いと言われながらも使われ続ける運命
2021/10/01(金) 06:29:03.99ID:9qXprR6W
Windowsゲームプログラミング (Game developer) 単行本 – 2004/5/1
これは2版がでてるはずだが
ちなみにC言語がわかればド素人でも理解できるように書かれてる
2021/10/01(金) 06:57:10.12ID:PaEGpo5A
推薦本のスレにも書いたけど、
基本、年齢が入った本は、ジャケ買いする人に買わせる本。
タイトルによる釣り

慶応卒のRubyの女神・池澤あやかが言ってるけど、
大学生のほとんどが、Cの授業で挫折する

だから中学生で、Cを理解できる確率は、1億分の1ぐらい

単に、そのままコピペして動かすだけの本。
ポインターなどを理解させる事は、絶対に無理

それに、コピペ・日記本の類は、単に手順書で、少しでも古いと動かない。
こう書いたら、こう動くというだけの本

まあ、図書館で読んでみれば?

君らの事を、情報弱者(情弱)と言うけど、
本のタイトル以外に、情報を持っていないから、年齢に頼ってしまう

漏れらは、慶応ぐらいでも、ほとんどの大学生が、Cで挫折する事を知っているから、
最初から、中学生には無理なことが分かっているから、タイトルに引っ掛からない
2021/10/01(金) 07:20:49.63ID:2vsjQ56x
俺FランだけどフリーランスのCプログラマだよ
学校の偏差値とか全然関係ないから
2021/10/01(金) 08:15:58.61ID:0pcjGFTU
せやな
2021/10/01(金) 08:53:42.32ID:q4HIBiEp
おう
2021/10/01(金) 10:56:05.77ID:Edlq/SQG
今の慶大生は昔の地方私大生より馬鹿になってるのか
872867
垢版 |
2021/10/01(金) 10:59:39.19ID:PaEGpo5A
基本的に、パソコンゲームは数十年前の話。
今は、Windows用・Linux用のゲームはない

Android用ゲームだけ。
皆、Unity を使う

ブラウザゲームなら、Pixi.js ベースのPhaser とか

下のサイトのイタリア人は、昔は、cocos2d-js も載せていたけど、
今は、Phaser ばっかりになってしまった
https://www.emanueleferonato.com/

ゲームは、ゲーム製作板の方で聞いた方がよいけど、
基本、DirectX などのパソコンゲームは存在しない。
誰も作らない

作っても売れないから。
今、パソコンゲームを買う人は、いないでしょ
2021/10/01(金) 11:32:38.00ID:D04WTAVm
Ruby妖怪がSteam見たらひっくり返りそうやね
イヤ見なかったことにして脳停止できるから妖怪なのか
2021/10/01(金) 11:38:27.60ID:0pcjGFTU
>>863
64bitAPIアドレス周りが、ちっと違う
2021/10/01(金) 11:42:39.38ID:FMnIEPDs
SetWindowLong(), GetWindowLong() が変わる
引数のマクロ定数も変える必要が出てくるケースあり
2021/10/01(金) 11:57:04.75ID:alrYkh/f
C言語で32/64bit対応するのはわりと簡単。最新コンパイラのコンパイル時警告に沿ってソースを修正すればいいだけだから。
問題はWin32APIをDLL呼び出しするスクリプト言語での対応で誰も親切に警告してくれないし、アセンブラ並みに面倒。
2021/10/01(金) 13:07:55.34ID:FE3lUBFq
>>871
慶大生は頭良いと思った事がない
878デフォルトの名無しさん
垢版 |
2021/10/01(金) 16:05:45.50ID:xAAYN8E1
64bitで困るのはWin32APIの部分じゃなくて
SysWOW64の部分だったりする
2021/10/01(金) 16:15:23.19ID:alrYkh/f
アドレス空間が違っててハンドルをプロセス間で共有できなかったりするんだったか?
880デフォルトの名無しさん
垢版 |
2021/10/01(金) 16:17:52.22ID:xAAYN8E1
regedit も system32 の部分と syswow64 の部分の両方ケアしないといけないし面倒になったよね
2021/10/01(金) 16:28:33.91ID:FMnIEPDs
32bit アプリが 64bit 環境で動いていて そいつが参照するレジストリは
syswow64 側に居て そっちを書き換えないといけないとかあったな
2021/10/01(金) 21:26:29.96ID:znNTQ7WB
ODBC 登録リストも 32/64 で別々だった気が
883デフォルトの名無しさん
垢版 |
2021/10/02(土) 15:16:24.14ID:yFRwYWli
うちの Windows 10 のスタートメニューには
ODBC Data Sources (32-bit)
ODBC データ ソース (64 ビット)
があるが何この中途半端な日本語化ωωω
884デフォルトの名無しさん
垢版 |
2021/10/02(土) 15:18:03.33ID:yFRwYWli
>>879
COM(OLE/ActiveX)のクライアントがサーバーにDispatch出来なかったりするんだよな
2021/10/02(土) 21:29:50.89ID:0KUEFcg9
DirectX の Filter も 32/64 両方造ったし
GraphEdit も両バージョン立ち上げて確認してるんだが
2021/10/03(日) 07:24:20.35ID:BlQUkwCi
Unix由来の標準入出力とソケットが一番頼りになる皮肉
2021/10/03(日) 11:15:21.70ID:yqqjmy7E
その割に、AF_UNIXすら最近の実装だという
2021/10/06(水) 19:32:00.27ID:7g8s0ol2
むかしむかしX Window Systemの内部通信は……
2021/10/06(水) 19:37:08.67ID:LKY0pW6F
10以前は知らん
890デフォルトの名無しさん
垢版 |
2021/10/06(水) 19:54:49.19ID:vqgOkLJq
Windows 11 出たけど
Win32API 関連はなんか変わる?
注意点とか?
「アプリ」は使わんが
2021/10/12(火) 20:08:13.59ID:0O/vnGSn
loadImageFile関数について教えて下さい
以下の書き方でエラーが出るんですが何処が間違えてますか?
img.loadImageFromFile("C:\Program Files\Cheat Engine 7.3\autorun\test.jpg")

エラー内容 invalid escape sequence test '" C:\P"
2021/10/12(火) 20:24:33.75ID:al5DqswH
エスケープシーケンスがなんだか調べたらどう?
こんなの基礎知識
2021/10/12(火) 22:26:33.36ID:fXvNOJZ2
漏れは、Ruby で、/ をパス区切りに使っているけど。
Dir.glob( 'C:/Users/Owner/Documents/**/*.txt' )

特殊文字をエスケープするなら、\ は、\\ になるのかな?
2021/10/13(水) 08:21:26.87ID:w2mbz/VV
>>891
× C:P
○ C:P
2021/10/13(水) 08:24:07.68ID:w2mbz/VV
>>891
"C:\Program Files

"C:\\Program Files
2021/10/13(水) 08:26:59.76ID:w2mbz/VV
C++ならR"(ここはエスケープ不要)"なんてのが使える
2021/10/13(水) 17:35:32.72ID:IvTU141J
C++ならって言うけど、それができるのはC++11対応以降だぞ
2021/10/13(水) 19:48:37.43ID:w2mbz/VV
化石乙
2021/10/13(水) 22:50:31.67ID:gIAgExkG
とりあえず物理ローカルドライブのパーティション1は開けるかね?
2021/10/13(水) 22:53:18.71ID:1nyshFrF
古いシステムに触ってるかどうかがよく分かる
2021/10/16(土) 07:53:34.96ID:CDLajE+o
>>891
エラー文をちゃんと読むようにしたほうがいいよ。
902デフォルトの名無しさん
垢版 |
2021/10/22(金) 10:33:00.16ID:/1A4Gt1O
コンボボックスのリストアイテムのフォント色を変えようと思ったんだけど、リストコントロールの親ウィンドウが他プロセスcsrss.exeなのでWM_NOTIFYを受信できない
どうすればコンボボックスのリストアイテムのフォント色を変えられるだろうか?
903デフォルトの名無しさん
垢版 |
2021/10/22(金) 16:47:21.55ID:DsjZYzXm
ownerdraw
904デフォルトの名無しさん
垢版 |
2021/10/22(金) 20:06:47.33ID:/1A4Gt1O
>>903
回答ありがとう
だがしかし、ownerdrawはWM_DRAWITEMが親ウィンドウに送られてくるので、コンボボックスのリストコントロールの親ウィンドウが別プロセスという問題点は同じ
2021/10/22(金) 20:09:04.86ID:9A3QnFKk
customdraw
906デフォルトの名無しさん
垢版 |
2021/10/22(金) 20:24:55.00ID:/1A4Gt1O
>>905
回答ありがとう
だがしかし、customdrawはWM_NOTIFYが親ウィンドウに送られてくるので、コンボボックスのリストコントロールの親ウィンドウが別プロセスという問題点は同じ

ちなみにコンボボックスのリストボックスは、SendMessage(CB_GETCOMBOBOXINFO)で戻されるCOMBOBOXINFO構造体のhwndListからウィンドウハンドルを得ている
コンボボックスのリストボックスは最初から親ウィンドウがデスクトッププロセスcsrss.exeが所有しているウィンドウクラス名「#32769」となっている
2021/10/22(金) 20:27:15.71ID:/1A4Gt1O
>>906を訂正
リストボックスではなくリストコントロール
2021/10/22(金) 20:30:33.06ID:9A3QnFKk
WM_CTLCOLORLISTBOX
2021/10/22(金) 20:31:42.61ID:9A3QnFKk
LVM _ SETTEXTCOLOR
910デフォルトの名無しさん
垢版 |
2021/10/22(金) 20:41:26.23ID:/1A4Gt1O
>>908
回答ありがとう
だがしかし、WM_CTLCOLORLISTBOXは親ウィンドウに送られてくるので、コンボボックスのリストコントロールの親ウィンドウが別プロセスという問題点は同じ

>>909
回答ありがとう
だがしかし、LVM_SETTEXTCOLORはリストコントロール全体の文字色が変わってしまうので避けたい所存
2021/10/22(金) 20:47:54.77ID:9A3QnFKk
メッセージフック
2021/10/22(金) 20:51:54.90ID:/1A4Gt1O
コンボボックスのリストコントロールは常にクラス名が「ComboLBox」で、親ウィンドウは必ずプロセスcsrss.exeが所有するウィンドウクラス名「#32769」のデスクトップウィンドウになる
2021/10/22(金) 20:59:49.61ID:9A3QnFKk
拡張コンボボックス
914デフォルトの名無しさん
垢版 |
2021/10/22(金) 21:03:09.16ID:/1A4Gt1O
>>911
回答ありがとう
メッセージフックはまだ試していないけど、WM_NOTIFYやWM_CTLCOLORLISTBOXはプロセス間やスレッド間で送受信できないとのことなので、一旦あきらめることにします
915デフォルトの名無しさん
垢版 |
2021/10/22(金) 21:05:45.02ID:/1A4Gt1O
>>913
回答ありがとう
あとで試してみます
2021/10/22(金) 21:09:42.92ID:9A3QnFKk
なんか思い込みが激しいようだ。
2021/10/22(金) 21:18:20.88ID:WEjOh4+D
フックじゃなくてサブクラス化でおk
918デフォルトの名無しさん
垢版 |
2021/10/22(金) 21:25:12.01ID:/1A4Gt1O
>>917
回答ありがとう
だがしかし、サブクラス化してもコンボボックスのリストコントロールの親ウィンドウが別プロセスという問題点は同じ

拡張コンボボックスつまり >>913で教授いただいたCComboBoxExを試すのに時間がかかりそうなので質問は終わります
2021/10/22(金) 23:26:18.33ID:WEjOh4+D
サブクラス化して WM_DRAWITEM と WM_PAINT を処理するだけでカラーリスト作ったことあるけど俺環だからだな
2021/10/23(土) 02:17:46.83ID:ChfdQawL
ハンドルは取れるんだから(Read|Write)ProcessMemoryやら使えば何でもできるよ
2021/10/23(土) 02:58:58.97ID:YCKOUJsa
▼押してポップアップするリスト側の表示をどうこうしたいっぽい
(自前で実装してもそれまでのような気もするな)
2021/10/23(土) 03:53:02.21ID:in+6fSXT
だから919でそれやってるんだけどね
親が別プロセスになったらこのメッセージが飛んでこなくなると言うなら知らん
923デフォルトの名無しさん
垢版 |
2021/10/23(土) 04:06:57.27ID:HI7jjoTQ
そもそもリストコントロールの親ウィンドウにWM_DRAWITEMが投げ込まれる仕様なので >>919,922 は何かの記憶違いじゃないかな
2021/10/23(土) 15:23:54.34ID:in+6fSXT
手元のソースを見ながらレスしたんだけど、
親ウィンドウ(プロセス)から作った子ウィンドウ(COMBOBOX, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED コントロール)
のサブクラス化だけでそっちにメッセージはちゃんと来ててリストの色分けとかできてる

親プロセスが別という話ならテストしてないから知らんし、手元のソースも WM_DRAWITEM を処理してるところが他にないので
これ以上調べる気は無い
925デフォルトの名無しさん
垢版 |
2021/10/23(土) 20:52:58.29ID:HI7jjoTQ
>>924
詳しい説明ありがとう

普通のコンボボックスを(CBS_DROPDOWN | CBS_OWNERDRAWFIXED)で作成後、そのコンボボックスをサブクラス化することで
コンボボックスでWM_DRAWITEMを拾えるようになりました

CBS_OWNERDRAWFIXEDをセットし忘れていたことができない原因でした
大ポカです
2021/10/23(土) 21:42:37.22ID:FyIAzbsP
ズコー
2021/10/23(土) 23:24:34.81ID:PMgILJYV
蟻人間が悪い
レス数が900を超えています。1000を超えると表示できなくなるよ。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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