Win32API質問箱 Build126

レス数が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/
2デフォルトの名無しさん
垢版 |
2020/05/01(金) 22:19:24.75ID:ZJ42fMZB
■番外編
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/
3デフォルトの名無しさん
垢版 |
2020/05/01(金) 22:21:36.71ID:ZJ42fMZB
■ネイティブなやつとか
【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/
4デフォルトの名無しさん
垢版 |
2020/05/01(金) 22:26:39.20ID:ZJ42fMZB
■需要あるかしらん
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デフォルトの名無しさん
垢版 |
2020/05/02(土) 14:36:08.36ID:83EB0DAt
MemoryMappedFile で造ったファイルのパスとかファイル名を取得する方法はありますか?
6デフォルトの名無しさん
垢版 |
2020/05/03(日) 07:50:20.86ID:7L9G3PXc
991 蟻人間 ◆T6xkBnTXz7B0 sage ▼ 2020/04/07(火) 19:03:16.48 ID:qBIbpTMr [1回目]
https://archive.org/details/NTDocumentation/mode/2up


992 デフォルトの名無しさん ▼ 2020/04/07(火) 19:09:20.97 ID:G5F9VLMp [1回目]
>>991
下部の他のリンクが色々あるね
7デフォルトの名無しさん
垢版 |
2020/05/03(日) 09:53:31.92ID:zajIy9nA
GJ(袖の下)
8デフォルトの名無しさん
垢版 |
2020/05/03(日) 17:24:33.80ID:K2d7aMWU
>>5
https://github.com/katahiromz/Handles
2020/05/04(月) 03:41:12.64ID:yjWu452E
MoveFileって同一ドライブであればディレクトリも移動できたんだな
エクスプローラーだと一瞬だし何かおかしいと思ってたが
今まで再帰で糞真面目に移動してた

>Windows NT/2000:この関数の ANSI 版では、名前は最大 MAX_PATH 文字に制限されている。
>この制限をほぼ 32,000 ワイド文字へ拡張するには、この関数の Unicode 版を呼び出し、パスの前に "\\?\" という接頭辞を追加する。
これも知らなかった
ファイラーとか作ってる人ってこの辺ちゃんと処理してる?
2020/05/04(月) 03:41:23.17ID:yjWu452E
MoveFileって同一ドライブであればディレクトリも移動できたんだな
エクスプローラーだと一瞬だし何かおかしいと思ってたが
今まで再帰で糞真面目に移動してた

>Windows NT/2000:この関数の ANSI 版では、名前は最大 MAX_PATH 文字に制限されている。
>この制限をほぼ 32,000 ワイド文字へ拡張するには、この関数の Unicode 版を呼び出し、パスの前に "\\?\" という接頭辞を追加する。
これも知らなかった
ファイラーとか作ってる人ってこの辺ちゃんと処理してる?
2020/05/04(月) 03:42:02.69ID:yjWu452E
2重に書き込んじゃった
なんかごめん
2020/05/04(月) 04:51:07.67ID:CZxUdBo2
はい
ttps://m.facebook.com/dnobori/posts/2142836202459674
2020/05/04(月) 09:21:39.93ID:7QD1dgDV
>>9
私も最近知ったので、xcopy を書き直して日々の作業につかっています
https://mevius.5ch.net/test/read.cgi/tech/1434079972/53
2020/05/06(水) 16:46:07.85ID:WRi3OS9Z
GetQueueStatus() API って Windows10(もしかすると 8)以降
動作が遅くなってない?
(未だに VB6 で作成したソフトをメンテナンスしている関係で調べてたら、
DoEvents より遅くなっていることに気が付きました)
2020/05/06(水) 16:50:51.19ID:WRi3OS9Z
>>14
それとも、64bit OS だからでしょうか?
(Windows10 の方は 64bit です)
2020/05/06(水) 17:20:26.54ID:WRi3OS9Z
連投すみません。
64bit OS だから遅くなるということはないですよね・・・
g++ で簡単な速度計測用のプログラムを使って確認してみました所、
Windows7 と Windows10 では、約 6 倍くらい速度差がありました。
(まさか、Windows10 で遅いのは、Windows Defender が原因だったりして・・・)
17デフォルトの名無しさん
垢版 |
2020/05/07(木) 10:15:27.49ID:iKRewGMt
まさかWindows10のデフォルトの電源モードが省電力になってるのを知らないとか
18デフォルトの名無しさん
垢版 |
2020/05/07(木) 11:13:42.62ID:biI6CgIS
基本的なことかもしれませんが、教えてもらいたいことがあります。
Win32APIで作成中のゲームで、ウィンドウを最小化してみてタスクバー格納してみたら、
画像の背景部分の画像が消えて、背景が真っ白になってしまいました。

もとのプログラムでは、背景画像の描画時に
InvalidateRect(hWnd, NULL, FALSE);
と第3引数FALSEで背景画像を残しているつもりなのですが、
どうやら再描画の際に、TRUEで再描画してしまっているので白い背景に置き換わるのかと(予想ですので、正しい保証はありません)。

最小化しても、画像を保存する方法を教えてください。

タスクバーに格納中の状態にマウスを合わせて内部表示させてみたところ、
格納中のときは背景を表示できてるようです。
タスクバーから出した時に、背景が消えてしまいます。

なお、画面のチラツキを防ぐために背景描画時にオフスクリーン(裏画面)をしています。
19デフォルトの名無しさん
垢版 |
2020/05/07(木) 11:31:50.93ID:iKRewGMt
心当たりがあるならやってみろよω
2020/05/07(木) 11:43:40.94ID:+2p6WTPq
自分のプログラムじゃなくてOSからの再描画要求でWM_ERASEBKGNDも走って
ウィンドウクラスのブラシでクリア(既定の動作)されてるパターンじゃねえのん
21デフォルトの名無しさん
垢版 |
2020/05/07(木) 13:19:26.03ID:biI6CgIS
>>20
とりあえず
case WM_ERASEBKGND:
return 1;

case WM_PAINT:
(以下略)
ってコード追加して試してみたけど、改善しなかったです。

ウィンドウクラスをどう変更すればいいか、ワカラナイです。
2020/05/07(木) 13:30:27.13ID:CdF0lcAG
InvalidateRectに関係なく、描画が必要な際にWM_PAINTが送られてくる。
BeginPaintで描画が必要な領域を調べてその後自分で描画する必要がある。

InvalidateRectは再描画したい部分を指定するために存在し、第3パラは
単純にその際に消去するかどうかを指すのみ。

今回のはタスクバーから出したときにOSが再描画しろと仰ってWM_PAINTを発行してるから従いなさい。
2020/05/07(木) 13:57:37.73ID:+2p6WTPq
ここ数年触ってなかったけどなーんかWM_ERASEBKGNDの挙動が変わってるような気がするなあ
こんな役に立たなかったっけ・・・?

>>18
とりあえずWNDCLASSのhbrBackgroundを0にすればOSによる背景消去は無視されると思うけどどうよ?
2020/05/07(木) 14:27:53.31ID:0pZrsm5h
>>18
それは最小化したときのWin32の昔からの挙動。
InvalidateRect() の bErase や WM_ERASEBKGND は、今残っている画像を
消すか消さないかを制御することはできるが、
ただそれだけのことで、消す以前に現実に画像が画面上に残っていない場合は、
消えたままとなる。

Windowsは、Aeroなどより前の時代、各Windowは原則的に仮想VRAMを持たずに
自分で実VRAMに描画する方針だったので、最小化して戻したときは、
自分で再描画しない限りは、デスクトップの画像か、背景色で真っ白に消された
状態で復帰するだけだった。

Aero以後は、仮想VRAMを持つモードがあるとされる。
25デフォルトの名無しさん
垢版 |
2020/05/07(木) 14:28:13.03ID:biI6CgIS
NGワードのテスト
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
26デフォルトの名無しさん
垢版 |
2020/05/07(木) 14:30:50.43ID:biI6CgIS
NGワードで、結果が書き込めない。
投稿文の何がマズイかワカラン。
27デフォルトの名無しさん
垢版 |
2020/05/07(木) 14:35:05.81ID:biI6CgIS
とりあえず、
wcex.hbrBackground = 0;// (HBRUSH)(COLOR_WINDOW + 1);
と変えてみました。

ですが結果はタスク バーから出した際に再描画されてしまいます。

ですが、背景の色が黒に変わりました。(以前は背景が白で再描画でした。)

たまたま自作ゲームでは背景色が黒でしたので、これはこれで好都合かもです。
28デフォルトの名無しさん
垢版 |
2020/05/07(木) 14:35:46.38ID:biI6CgIS
>>25のコードがあったので、>>27のコードに変えてみた。
結果はダメだったです。
2020/05/07(木) 14:46:04.24ID:3Zb9YKCz
NG ワードは、MANGO 板のスレで、絞り込みができる

cmd@.exe
ls の特定のオプションとか

はてなブログのURL で、吸い込まれるような動きをしたら、絶対に続けて書き込んではいけない。
3日ぐらいアクセス禁止にされる

twitter の長いURL も、吸い込まれるものがあるとか
30デフォルトの名無しさん
垢版 |
2020/05/07(木) 15:30:22.36ID:biI6CgIS
>>22
>今回のはタスクバーから出したときにOSが再描画しろと仰ってWM_PAINTを発行してるから従いなさい。

ご指示の通りにして、とりあえず解決しました。

Windowsの場合、OSが割り込んで、むりやり画面クリアして再描画してしまう場合があることも意識して、
画像の描画プログラムを組み立てる必要もあるのですね。

処理を軽くしようとして、背景は1度書いたら背景フラグをオンにして再描画しないようにしてたのですが、
OS割り込みによる再描画を考慮してなかったので、
裏目に出てしまったようです。
2020/05/07(木) 15:47:08.20ID:b7ooihQ1
吸い込まれるってなんのことや
2020/05/07(木) 16:15:55.38ID:0pZrsm5h
>>30
OS割り込みというか、WM_SIZE メッセージが来たら、背景も何もかも
全部再描画するようにすれば良いだけ。
2020/05/07(木) 16:18:19.91ID:0pZrsm5h
>>32
なお、WM_SIZE が来ても、その場で本当に再描画するという意味ではない。
WM_PAINT つまり、MFC でいうなら、OnDraw() 関数の中で背景も何もかも
再描画されるように工夫する。
そのためには、何らかのフラグを用意して、普段は0にしておき、WM_SIZE
メッセージハンドラであるOnSize()の中で 1 にする。
OnDraw()関数の最後で0にする。
34デフォルトの名無しさん
垢版 |
2020/05/07(木) 16:56:41.22ID:8jv+kISL
>>31
描き込んでもレスに反映されないことがある
可笑しいと思ってもう一度そのまま同じ内容を描き込むと
そのままアク禁
2020/05/07(木) 17:08:25.79ID:khGNNtcv
大きさ固定で BMP に描画
WM_PAINT は BMP を BitBlt するだけ

大きさが変わったとき 自分の意思で表示内容を更新する時は BMP をゼロから描画しなおす

WM_SIZINGで大きさが変わったを知って
見合ったサイズのBMPに作り直し→表示内容を更新
2020/05/07(木) 17:33:56.09ID:IeUYmiVS
VBAでAPI使ってるレベルの者だが、メモリDCからBitbltするだけじゃね?
2020/05/07(木) 17:42:01.72ID:0pZrsm5h
とにかく、最小化状態から通常状態に戻したときは、何もかもそれまでの描画が
失われるのは昔からのWindowsの仕様。
普段は高速化のため部分描画をしたい場合は、そうしておいて、WM_SIZEが
来た直後にだけは、なんとか色々な方法で工夫して全体描画すればよい。
38デフォルトの名無しさん
垢版 |
2020/05/08(金) 00:39:11.34ID:taENaF02
CreateWindow関数って存在しないの知ってる?これ豆な
2020/05/08(金) 01:17:12.85ID:0sjMHJ2y
>>38
マクロでは存在している。
実際のDLL内での関数名は、Unicode版と非Unicode版でそれぞれ語尾にWとAが付くが。
2020/05/08(金) 01:23:45.95ID:dYQlSH+b
>>39
CreateWindow
って、ファイルシステムとは関係ないのに、どうして A と W を実装しているのでしょうか?
2020/05/08(金) 01:51:09.10ID:0sjMHJ2y
>>40
結論的には、クラス名、Window名が CHARかWCHARかの違い。
今見てみたら、
1. CreateWindowA、CreateWindowWも、それぞれ、
  CreateWindowExA、CreateWindowExW に置き変わるマクロである。

2. CreateWindowは、UNICODE マクロが定義されていれば、
  CreateWindowW を通じて、CreateWindowExW に置き換わる。
  定義されていなければ、
  CreateWindowA を通じて、CreateWindowExA に置き換わる。

3. A 系は、クラス名、Window名が、CHARへのポインタであるのに対し、
  W 系は、クラス名、Window名が、WHARへのポインタである。

4. CreateWindow() や、CreateWindowEx() は、クラス名、Window名が、
  どちらも、TCHARへのポインタであるので、UNICODEマクロが定義されている
  かどうかで、それらの文字列がCHARかWCHARに自動的に切り替わる。 
2020/05/08(金) 05:42:10.41ID:FYQVpLgs
〜Exって関数名、拡張は1回きりって浅はかな付け方を
よくここまで堂々とやるなって感心しちまう
2020/05/08(金) 07:16:28.52ID:x33oSwnd
バージョン増えると後ろに2とか番号付くぐらい適当だよ
2020/05/08(金) 08:24:01.23ID:UfrpmU+3
なんなら***ExExもアリだからな
Exが一度だけという浅はかな固定観念に縛られていてはMSには成れないのさ
2020/05/08(金) 08:34:41.07ID:s7XsZ3eu
GetTextExtentPoint32にもっとEx付けたい
2020/05/08(金) 08:35:06.55ID:+jRc4+db
じゃあ逆にどうしろと?
eclipse のソースコードなんかでも、インターフェースはバージョン番号増やしてく感じだよ

IDocumentExtension
IDocumentExtension2
IDocumentExtension3
IDocumentExtension4
47デフォルトの名無しさん
垢版 |
2020/05/08(金) 10:55:14.01ID:oIDbptWL
IDocumentExtension98
IDocumentExtension98SE
IDocumentExtensionMe
IDocumentExtension2000
IDocumentExtensionXP
2020/05/08(金) 12:40:05.23ID:SGzHt0H0
IDocumentExtension7
IDocumentExtension8.1
IDocumentExtension10
IDocumentExtension2000
あれ?2000が一番新しいんかな?
2020/05/08(金) 13:00:29.63ID:FYQVpLgs
IDocumentExtension8.1って、ここだけメンバーなの?
2020/05/08(金) 14:42:14.34ID:DxagrNge
CreateWindowは元々これが実体
win98辺りでunicode対応となってから内部でAとWに分けられてって流れじゃなかったっけ

歴史長いんだからよっぽどの先見の明がないと名前の整合性なんて無理でしょ
内部の関数ならまだしも外部公開のAPIなんてね
名前や仕様がころころ変わって阿鼻叫喚になるよりマシ
2020/05/08(金) 14:59:13.46ID:FYQVpLgs
あったねー MFC42.DLLだっけ?
2020/05/08(金) 16:27:41.55ID:+jRc4+db
Aって ASCII の A ?
W は、 Wide の W ?
でいいんけ?
53デフォルトの名無しさん
垢版 |
2020/05/08(金) 17:08:17.38ID:iOEjZYuS
ANSI かな
54デフォルトの名無しさん
垢版 |
2020/05/08(金) 19:58:44.84ID:XNwDJZFz
>>50
win16(win3.1)では実態
win32(NT,95)でAとWに分割。マクロで互換性をキープ
ただし9xは殆どのW系を実装しておらず失敗する
win32cとか呼ばれてた
2020/05/08(金) 20:55:35.84ID:+jRc4+db
文字コードの ANSI って、なんなんだろ

ASCII とか Shift-JIS とかだと分かるけど、
ANSI って言われると、…ん? ANSI …?ってなる

メモ帳の ANSI って、Shift-JIS のことなんだっけ?
なんで Shift-JIS をこんなわけわからん名前にしてるんだろ
2020/05/08(金) 21:14:31.19ID:g8DwAXAR
ウィンドウズのマルチバイト文字列変換は、コードページ切り替えで実現している。
既定のコードページANSI (CP_ACP)は、日本語ウィンドウズでは932(Shift_JIS)に転送される。英語圏のウィンドウズでは1252などになる。具体的な値はGetACP関数で取得できる。

シフトJIS変換では、WideCharToMultiByteとMultiByteToWideCharの第一引数にCP_ACPではなく、明示的に932を指定した方がいい。
2020/05/08(金) 21:16:27.83ID:XNwDJZFz
ANSI・・・ JISと敵対する組織であり世界に暗躍するISO一味の筆頭
Shift-JIS・・・ 悪の秘密結社MSにより改造されたJIS
2020/05/08(金) 21:18:08.68ID:DxagrNge
>>54
CreateWindowは2000からAとWだね
95〜98系はほぼUNICODE対応されておらず、リソースや文字列を扱うごく一部のしかない

>>55
ANSIがASCIIを制定
これをベースに各種ローカル文字コードが乱立
そしてUNICODEへ
2020/05/08(金) 21:49:33.14ID:NOJZfKLR
いい加減Aはサポートを打ち切っちゃえと思う
TCHARの為に無駄な手間が増える
60デフォルトの名無しさん
垢版 |
2020/05/08(金) 22:31:37.13ID:/+tKw0XQ
無理にTCHAR使わなくて良いんだよ
_Tも_Lも面倒なだけ
2020/05/08(金) 22:37:21.10ID:4UXJHFlD
自分でA環境切ってれば面倒は無いと思うが
AのAPI残してるからこそ生き延びてるレガシーアプリはまだ無視できねんじゃないかなあ
未だに日本語パスとかでコケるアプリがあるのはそのせいでもあるんだろうけど
2020/05/08(金) 22:49:11.78ID:NOJZfKLR
>>60
無理ではないけど...
Aを切ってくれないと思い切りが

そういえば
Wしか使えないWindowsが昔あったな
63デフォルトの名無しさん
垢版 |
2020/05/08(金) 22:50:57.33ID:/+tKw0XQ
CEとかだっけ
2020/05/08(金) 22:52:30.48ID:NOJZfKLR
おっ
よくご存じで
2020/05/08(金) 23:52:07.44ID:DxagrNge
レガシーな制御機器を扱うソフトからすると、OSでUNICODEに一本化されると困るというか面倒極まりない
2020/05/09(土) 06:57:55.10ID:IGvav/BT
APIのA系がいらんというだけで
制御系は好きな文字コードでやれば良いんだよ

ファイルのアクセスや各種プロトコルでは
いろんな文字コードを使うはずで
全ての文字コード用に各種APIが対応してる
なんて必要は全く無い
変換APIだけ用意してくれれば良い
2020/05/09(土) 11:08:41.27ID:NXe586WT
>>66
言われてみればその通りやな
2020/05/09(土) 11:14:28.38ID:QCHAZIsg
OS側で文字を入力・加工したものを制御系に流す、又はその逆のことを全く考慮しないならそうだね
2020/05/09(土) 11:39:49.17ID:OifcNah8
でもUTF8って、マルチバイト文字じゃないの?
W系の関数ってUTF16だよね?
70デフォルトの名無しさん
垢版 |
2020/05/09(土) 11:56:33.06ID:3rxWY8lS
UTF8とUTF16は表現が違うだけで空間は一緒やろ
(厳密には一対一ではない)

Shift_JIS と UTF16 とかで変換しようとすると化けたり欠けたりする
WideCharToMultiByte と MultiByteToWideChar の引数は UTF8 だけにするべき
2020/05/09(土) 12:26:48.39ID:CUL9xwyE
要求されているコード次第だろ。
SJISが必要な場面で変換できない文字が含まれていたならエラーにするだけ。
2020/05/09(土) 12:29:46.42ID:/Z4Vk9Yy
Go は、ワイド・UTF-8。
Windows は、ANSI・CP932

だから、Windows のみ、変換が必要!

WSL なら、Linux/Windows間の変換を、Windowsが自動変換するだろ
2020/05/09(土) 13:44:45.28ID:OifcNah8
ちょっと前にWindows10がUTF8を使用する機能が追加されたと聞いたけど、あれはどういう仕組みなの?
開発するときはWCHARやW系の関数を使っててもいいの?
2020/05/09(土) 13:53:34.15ID:y1dzFt5u
>>73
>Windows10がUTF8を使用する機能が追加された
設定で A 系がデフォで UTF-8 になると聞いています
2020/05/09(土) 13:59:36.27ID:OifcNah8
>>74
ということは、A系はなくすどころか、これから主流に戻っていくということ?
2020/05/09(土) 17:38:12.35ID:IGvav/BT
内部はUTF16
2020/05/09(土) 18:36:20.72ID:MO8a3o69
設定で変えないとな今だとちゃんとシステムがUTF8かどうか確認しないとバグるだろうなぁ。。。
2020/05/09(土) 18:41:38.14ID:MSg9l4oI
A系やWideCharToMultiByteを使ってかつsjisだと決め打ちしてるとバグるね
2020/05/09(土) 20:45:09.00ID:bNQ8i22s
聞いてるだけでよくわからなくなってくる
マルチバイト星人はこの先もしばらくは無駄な苦労をしていくことになりそう
80デフォルトの名無しさん
垢版 |
2020/05/09(土) 23:03:31.09ID:VZmAPRaM
TCHAR はもういらない子
2020/05/09(土) 23:48:55.23ID:VnJD5UE+
>>80
mingw で提供されている <windows.h> は TCHAR を使っているから、おさらばするわけにはいかないでしょうね…
https://mevius.5ch.net/test/read.cgi/tech/1434079972/53
2020/05/10(日) 00:10:35.50ID:lS9VwhWL
マイクロソフトが提供為てるわけじゃないんだし知ったことかよ
2020/05/10(日) 00:59:54.73ID:sYQDYC6t
創造主は世界を A と W に分けた。


後の A&W である。
2020/05/10(日) 07:07:50.16ID:TKKqj4ZC
>>70
> (厳密には一対一ではない)
UTF8 と UTF16 って符号化文字集合は同じだから全符号化表現が一対一対応するんだと思ってたわ
例えば何が一対一にならないん?
2020/05/10(日) 09:57:36.15ID:FEs4SWZl
同じ文字に複数の表現方法があるとか
86デフォルトの名無しさん
垢版 |
2020/05/10(日) 10:02:11.48ID:Fp1kS4OT
WinSockの話はこのスレであってる?
ブラウザを作りたいんだけど、書店で本を探しても無くってさ
2020/05/10(日) 10:16:37.79ID:iOuxRny5
プロトコルはRFCをあたる
受け取ったデータの可視化やうそんこの文字指定から文字化け回避とか、そっちのほうは知らない
88デフォルトの名無しさん
垢版 |
2020/05/10(日) 10:18:22.51ID:Fp1kS4OT
>>86
自作ゲームに、将来的に通信対戦の機能とかをつけたいから。
89デフォルトの名無しさん
垢版 |
2020/05/10(日) 10:22:11.17ID:Fp1kS4OT
>>87
わかった。RFCを調べてみる。

あと、2ちゃんの別スレも見つかったから、それも調べてみる。
『ネットワークプログラミング相談室 Port30 [転載禁止]©2ch.net 』
https://mevius.5ch.net/test/read.cgi/tech/1414709836/
2020/05/10(日) 11:03:37.16ID:sYQDYC6t
フライドチキンはKFCでお願いします。
2020/05/10(日) 21:18:11.74ID:MdXjYqca
筋トレやダイエットにはPFCバランスが大事らしい
2020/05/11(月) 00:39:02.31ID:37dgyJTT
DFC
貧乳にアクセスするためのプロトコル
93デフォルトの名無しさん
垢版 |
2020/05/14(木) 17:10:26.05ID:xR/PZA9p
32bit アプリサポート終了のお知らせ
2020/05/14(木) 17:21:03.49ID:eHRrlmRs
32bitOSが終わるだけでWOW64は無くならんと思うが
2020/05/14(木) 18:11:15.76ID:wD9bKf3u
それも時間の問題かも
2020/05/14(木) 18:26:01.94ID:uakMKPpl
過去資産切り捨てるだけでメリット皆無
ってこの話題何回目だ
2020/05/14(木) 18:27:58.15ID:wD9bKf3u
コスト削減
2020/05/14(木) 18:35:32.89ID:8JWtj6XY
>>94
ということは16bitアプリ終了のお知らせってことか
2020/05/14(木) 19:16:57.69ID:wD9bKf3u
だね
2020/05/14(木) 19:18:28.93ID:eHRrlmRs
>>97
コスト削減どころかWindowsシェア削減になるね
2020/05/14(木) 19:38:59.13ID:wD9bKf3u
「どころか」
全然つながってない

32bitのシェアが減ればコストに見合わなくなるので
開発を打ち切るのは当然

それによってアプリ開発者も負担が減る

OSの64bit化で16bitを切ったのもそういう理由
2020/05/14(木) 20:23:50.17ID:DKKTi7r6
素人たちはこれだから困る
32ビット対応を継続することで、比較対象ができることでバグが少なくなるのだ
両方で動くコードは安定しているし、今後128ビット対応にも生きてくる
2020/05/14(木) 20:25:45.84ID:wD9bKf3u
同じコストを書ければ
片方だけの開発、評価の方がバグが少ない
当然だ
2020/05/14(木) 20:26:28.62ID:wD9bKf3u
128bit?
そんな時代は少なくとも数十年は来ない
105デフォルトの名無しさん
垢版 |
2020/05/14(木) 20:32:36.16ID:xR/PZA9p
IPv6ですねわかります
106デフォルトの名無しさん
垢版 |
2020/05/14(木) 20:39:37.00ID:swrzxMJK
で、オマエラは32bitアプリはもう作らないの?
107デフォルトの名無しさん
垢版 |
2020/05/14(木) 20:40:13.60ID:QxbT6fEj
ロクヨンロクヨンいちにっぱ、1988年。
108デフォルトの名無しさん
垢版 |
2020/05/14(木) 20:42:32.92ID:xR/PZA9p
sizeof int == sizeof long
よりも
sizeof int < sizeof long
の方がなじみがある
2020/05/14(木) 20:48:00.53ID:wD9bKf3u
int : 16bit / long : 32bit
int : 32bit / long : 32bit
int : 32bit / long : 64bit
どれも良く使う

Windowsに限定すれば今は32bit/32bitだけだが
2020/05/14(木) 20:49:50.08ID:wD9bKf3u
趣味のプログラムだと32bitアプリはもう作らない
仕事だとまだ必要
2020/05/14(木) 21:16:04.45ID:uakMKPpl
まーた自分の希望的観測を大局的指針だと強弁しちゃう勘違い君が来ちゃったか
前と全く同じ事言っちゃってて進歩してないな
2020/05/14(木) 21:25:47.85ID:wD9bKf3u
16bitは切った
これが事実
2020/05/14(木) 21:39:36.59ID:wbq2quQU
なんのこっちゃと思ったらOEM向けの32bit版OSを提供しなくなるってだけの話か
Windowsに関しちゃMSはゆーっくり削ってくねえ
2020/05/14(木) 22:18:38.95ID:ssqTGeCM
APIHOOKどうする ?
115デフォルトの名無しさん
垢版 |
2020/05/14(木) 23:55:54.26ID:7qxmxCRs
真っ赤な奴が一人で喋ってるというだけで信頼度0
2020/05/15(金) 01:57:25.78ID:T5z4Mqc/
この人前も同じ様なガバガバ理論を連レスしてたな

> 16bitは切った
> これが事実

これをドヤ顔で推すのなら、同じ理論で128bitOSが出るまでは32bitアプリは生きることになるぞ
117デフォルトの名無しさん
垢版 |
2020/05/15(金) 02:07:48.44ID:PClFYiSI
>>116
96bitで切ります
2020/05/15(金) 04:23:46.36ID:sHW7IJmG
>>116
なんで?
AMD64は16bit切ったけど、128の時32bit切るってどうして言い切れるの?
2020/05/15(金) 07:03:42.39ID:kJI5kK91
128bitなんか出ないよ
2020/05/15(金) 07:09:21.09ID:kJI5kK91
16bitは切った
32bitもいずれ切る
128bit CPUは出ない
2020/05/15(金) 07:25:33.82ID:Pb1EIu78
32bitのCPUが4つだから128bitだ、と嘘をつくゲーム機メーカーがあったな
2020/05/15(金) 08:01:44.45ID:GEHeiiL6
プレステ3だっけ
123デフォルトの名無しさん
垢版 |
2020/05/15(金) 09:25:45.18ID:v3x5k1hP
インテルのロードマップによると次に出るのは80ビットプロセッサ。
2020/05/15(金) 10:32:06.39ID:Sz6wqqvQ
レジスタに名前つけてほしいんだ
r10とか無機質な使い捨て兵士みたいな奴よりraxやrbpのほうがかわいげがあるだろ
2020/05/15(金) 11:21:50.10ID:QE59VEMD
>>122
Cellに関してそんなデマ流れてたっけ?
2020/05/15(金) 12:48:58.84ID:oHmbvZOo
>>122
ドリームキャストでは
2020/05/15(金) 18:13:09.35ID:sHW7IJmG
>>124
鉄オタを見てみなよ
103とか485とか、謎の数字で大喜びしてるよ?
2020/05/15(金) 18:18:02.87ID:QE59VEMD
昔、昔、あるところでの対話
友人: おまえPC何使ってんの?
俺:   486/33
友人: ????????
2020/05/15(金) 18:45:16.23ID:sHW7IJmG
PCを問われてるのにCPUを答えたらそうなるだろ
車何のってんの?って聞かれてHR15DEとか言ったら
オタクを蔑む目で見られるだけだろ
2020/05/15(金) 19:22:59.50ID:PWQ6blWE
>>124
なんだ…トムとかマイケルとかじゃないのか…
2020/05/15(金) 20:11:01.88ID:sHW7IJmG
>>130
MichaelはMikeでもMikeyでもMickyでもMickでもいいとかになるのかな
2020/05/15(金) 21:26:50.30ID:s5k+QbAR
>>125
CELLのSPEは128bitレジスタを128基備えた本物で、32x4のSIMD演算ができた。
2020/05/16(土) 12:07:58.46ID:duYaQXmV
今のPC用CPUは256bitレジスタがあって
64bit x 4 のSIMD演算が出来るから
256bit CPUか
2020/05/16(土) 12:17:02.93ID:IjBZ7sB3
昔のベクトルコンピューターは
65536bit CPUとか?
135デフォルトの名無しさん
垢版 |
2020/05/16(土) 12:36:13.35ID:is04b0b3
SSDとかすごそうだな
2020/05/16(土) 12:38:50.78ID:IjBZ7sB3
なにが?
2020/05/16(土) 12:48:31.52ID:Os/XxFcn
>>133
8bitCPUと言われる奴にだって16bitレジスタはあったよ?
でもそれを16bitCPUとかいったら馬鹿にされるよ?
2020/05/16(土) 15:19:59.15ID:nRzs8qav
〇〇bit CPUネタはいつも定義がグダグダで荒れる元
2020/05/16(土) 15:33:48.76ID:4LNE0T1O
Z80は4bit CPUだとかw
140デフォルトの名無しさん
垢版 |
2020/05/17(日) 13:33:26.86ID:qdHuVgcd
>>127
アオいいよね
2020/05/24(日) 10:26:06.68ID:aVoyeE00
>>138
昔から定義があいまいだしな

30年以上前はデータバス長で決めるのが主流だったと思う
なので68000は16ビットCPUと言われることが多かった
でも、68000は内部が32ビットだからと32ビットCPU扱いしてる本もあった

子供ながらに早く定義を確定させろよと思ってたな
2020/05/24(日) 10:38:26.14ID:y84CPFUU
何ビットかで性能を判断しようってのが間違い
2020/05/24(日) 11:08:07.08ID:9LKtIHkT
MC68008なんかどうなるんだよw
144デフォルトの名無しさん
垢版 |
2020/05/24(日) 16:10:49.32ID:x8aMDsmm
8088だか8085だかもう忘れたが
2020/05/24(日) 17:15:35.64ID:Y2PNnK8W
>>144
8085 は Z80 に似た位置付け
8088 は 8086 の 8 bit 版
2020/05/24(日) 18:23:26.62ID:WIKh9/kk
8080 は周辺回路用に、8251 (USART)、8253 (CTC / PIT)、8255(PPI)
というファミリがあったんだ。
「CHIPSET」というものの走りか。
147デフォルトの名無しさん
垢版 |
2020/05/25(月) 11:49:32.24ID:xHeORMOB
64180やろ常考
2020/05/26(火) 10:31:04.56ID:DUXfe990
ALUで一度に計算できるレジスタ長でいいんじゃないかね
2020/05/26(火) 11:34:31.94ID:kYnyuVta
ALU幅=レジスタ幅とは限らないのだが
2020/05/26(火) 11:48:43.44ID:lk6wFY6w
100メガビットまだー?
2020/05/26(火) 18:46:58.11ID:Be8LwKLh
Project REUNION

このスレもまだまだ終わらんね
2020/05/26(火) 19:24:46.61ID:kaVJ2d4/
アドレス空間の広さという定義もあった
さらに仮想アドレスや実アドレスに物理的サイズ(アドレス線の数)とか
2020/05/26(火) 20:41:32.11ID:tlZqmZqw
Win32でなんでこの話かとは思うが、基本的に
どれでも頭打ってる最小のビットがNならNビットCPUだろ
アドレスバスが32ビットでも命令長が16ビットのしかできなければそれは16ビットCPUだ
2020/05/27(水) 05:52:37.50ID:UfAFwj6f
>>153
その定義だと64bit CPUがほとんど無くなるけど
良いのかな?
2020/05/27(水) 06:45:53.85ID:l+od2Oe5
IA64「にやり」
2020/05/27(水) 22:55:18.61ID:RaY0EJLW
>>154
32ビット命令「しか」できないCPUそこらにないだろ
AMD64も「全部」64ビットだ
2020/05/28(木) 05:57:08.15ID:CImYg+b8
Win32的にはexeヘッダのmagic#が10Bか20Bかだろ
2020/05/30(土) 22:58:02.59ID:TVZRBSHA
>>151
我々の勝利と理解していいでしょうか?
2020/05/30(土) 23:12:23.25ID:nvVsoyu6
Win32のカオスもたいがいだが、それを置き換えきれないドットネットもダメすぎる
2020/05/31(日) 05:29:27.69ID:AV9N3TDc
何かしら新しいものを担ぎ上げたと思ったら梯外しを続けて屍累々だしね
泥林檎全盛時代モバイルWin大敗北という状況なのに、それでもUWPでバリバリ開発するぞってプログラマーなんて増えないだろ?と思ってたけど、この有様よ

>>158
我々の勝利でしょう
2020/05/31(日) 10:02:47.12ID:O94AXa21
EnumWindowsのコールバックの中でHWNDからEXEを割だそうとしてるんだけど
GWLP_HINSTANCEで取得したハンドルをGetModuleFileNameに渡してもうまくいかん
どうやんのコレ?
2020/05/31(日) 10:08:17.82ID:w6MuXuh+
>>161
他のプロセスだと駄目だから、GetModuleFileNameEx使っちゃって。

https://github.com/katahiromz/WinHier/blob/master/WinHier/WinHier.cpp#L53
GetWindowThreadProcessId
2020/05/31(日) 10:12:13.98ID:2cTTa+6C
全然関係ないけど、この略であってる?
なんか Win32API って、略しまくってて一見さんお断りって感じ

GWLP
Get Window Long Pointer
HINSTANCE
Handle to the Instance
2020/05/31(日) 10:23:14.96ID:xFqcIaF1
この略で書かれたオプションを使ってる関数名の略語なんだから別にこれは合理的だろ
GetWindowLongPtrAのオプションなのにEDH64_とかで始まってたら頭おかしいが
165デフォルトの名無しさん
垢版 |
2020/05/31(日) 15:49:36.34ID:T8jWCE6M
HINSTANCE はハンガリアン記法じゃね
2020/05/31(日) 15:52:03.55ID:hHIdU/aR
HRESULT って何の略だ?
2020/05/31(日) 18:01:29.96ID:Q6VzjxFK
妊娠判定?
2020/05/31(日) 18:08:14.04ID:G1/nv9Cn
>>156
命令長の意味
2020/05/31(日) 19:56:38.10ID:wHFXVFT0
>>166
昔はエラー情報へのハンドル値だったとどこかで読んだ気が
170デフォルトの名無しさん
垢版 |
2020/05/31(日) 20:45:34.27ID:ttbYfwVJ
エラー情報ハンドルからエラー情報を取得するには関数を使います
2020/06/01(月) 02:49:57.62ID:0GfvhwSl
>>169 >>170
なるほどね。
海外のサイトで、「Hex Result」説を書いていた人がいたが、どっちが正しいの?
2020/06/01(月) 03:35:25.53ID:cNH06St3
HEXもDECもなくてみんなBINだろ?
2020/06/01(月) 07:10:51.50ID:1xzv2R8/
>>171
https://devblogs.microsoft.com/oldnewthing/20180117-00/?p=97815
2020/06/01(月) 07:46:34.47ID:7+WAnHBR
>>173
it really was a handle to an object that contained rich error information.

これが答えってことかい?
2020/06/01(月) 10:19:00.27ID:GLKffah/
HFONT,HBRUSH,HDC,HPEN,etc
何でもかんでもハンドルとして扱ってるのに、HRESULTだけHEXかもなんて思うの?
2020/06/01(月) 10:51:47.09ID:INZFVYtf
>>175
HEXと思うのはどうかと思うけど
> HFONT,HBRUSH,HDC,HPEN,etc
こいつらはハンドルだけどHRESULTの型はlongだし値もどう見てもハンドルじゃないからあーだこーだ言ってるんだろ
2020/06/01(月) 11:03:16.80ID:17VfLqvo
通常voidだがエラーの場合は符号付きのlongにしてるだけ
実質型を隠蔽してハンドルとして扱うのは慣例みたいなもんだし、気にする必要は無い
2020/06/01(月) 11:09:40.98ID:53c0ZhQ4
>>174
要は昔の仕組みが型名として残ってるだけだと
2020/06/01(月) 11:51:23.63ID:OFgL6Ul1
>>174
それは昔の話、今は
The COM team decided that the cost/benefit simply wasn’t worth it, so the HRESULT turned into a simple number.
But the name stuck.
ってことだろ
2020/06/01(月) 11:52:59.14ID:GfnKilSu
>>177
お前は何を言ってるんだよw
HRESULT型のハンドル返すAPIなんてないぞ
2020/06/01(月) 11:56:51.06ID:Lo4SeZQj
>>173
だから意味不明な "interface not supported" とか返ってくるのか
Cだとエラー情報の領域管理が面倒なのはわかるけど固定で5個ぐらい持つとかやりようはあったと思うんだけどね
2020/06/01(月) 12:06:26.41ID:U4oPUiQG
>>181
5個どこにもつわけ?
183デフォルトの名無しさん
垢版 |
2020/06/01(月) 17:38:12.77ID:JphI8rwQ
>>176
bool なのに 0 と 1 と -1 とか帰ってくる API に何求めてんだ
2020/06/01(月) 21:11:55.51ID:M7ivFsPk
>>183
boolとBOOLをいっしょにすんなよ
2020/06/05(金) 13:41:09.29ID:D0XPmYCp
https://ideone.com/iTPLPg
これなんで動かないんですか?
フォーマットノットサポートって出るんだけど、意味が解らないです。
2020/06/05(金) 13:45:20.81ID:D0XPmYCp
メイン関数です。

#include <iostream>

#include "WaveDeviceII.h"


int main() {
WaveDeviceII WD;

WD.Initialize(WAVE_MAPPER, NULL, CALLBACK_NULL , 8, 2, 8000);
}
2020/06/05(金) 13:49:29.22ID:D0XPmYCp
The specified format is not supported or cannot be translated. Use the Capabilities function to determine the supported formats.
エラーです。
188デフォルトの名無しさん
垢版 |
2020/06/05(金) 14:23:44.24ID:WSRdRexs
失格
やり直し
2020/06/05(金) 17:48:01.41ID:9H09ckgd
>>187
日本語でおk
2020/06/05(金) 18:41:24.19ID:+T3Zxd1w
ここ Win32 API の質問箱なんですが、
WaveDeviceII とやらがなんなのかをノーヒントで推測する能力が求められてます…?

…そもそもリンク先見てないけど
2020/06/05(金) 18:51:59.15ID:vzFsYnai
再生・録音デバイスの設定がおかしいか、ドライバの問題ではないかな
2020/06/05(金) 19:58:06.58ID:D0XPmYCp
WaveOutDeviceIIに名前変えなきゃ。。。

>>191
うーん。他のアプリで音が鳴らないわけじゃないのだけど。うーん。
2020/06/05(金) 20:09:06.67ID:kzWGRm1w
>>187
具体的にエラーを出したAPIを特定して、その仕様をググって調べてこい。
あとその英語のメッセージに具体的に何をしろと欠いてあるからそれも調べて試してこい。
2020/06/06(土) 19:05:08.37ID:XjfTk0ib
接続されているUSBメモリの名前ってどうすれば取得できますか?
ドライブレターではない名前で、メーカー名とかが含まれるやつです。
例:SONY、Transcend
2020/06/06(土) 19:16:37.09ID:+UPi9lXq
APIではないです
2020/06/06(土) 20:36:45.83ID:gPrzX488
SetupDiEnumDeviceInfo でデバイス列挙してゴニョゴニョすればいいんでない?
2020/06/06(土) 21:33:32.55ID:w46hHvus
これかhttps://www.usefullcode.net/2006/12/post_19.html
198194
垢版 |
2020/06/06(土) 22:20:22.51ID:XjfTk0ib
>>196-197
おおお!!ありがとうございましたぁ!!
199194
垢版 |
2020/06/08(月) 14:05:55.87ID:yBr+unsS
>>197のサイトで他にも色々な方法が載っていました。

USBデバイスやUSBハブの詳細情報を取得する
https://www.usefullcode.net/2007/02/usbusb.html

ドライブ名からデバイス情報を取得する
https://www.usefullcode.net/2007/02/post_48.html

ドライブ名からデバイス情報を取得する(DEVINST系
https://www.usefullcode.net/2007/02/devinst.html

ドライブのモデル名や接続I/F情報などを取得する
https://www.usefullcode.net/2007/02/if.html

自分は最後の方法でうまくいきました!
200デフォルトの名無しさん
垢版 |
2020/06/08(月) 15:41:01.12ID:blut5LG8
>>197
>>199
https://ideone.com/Yn8u0I
2020/06/15(月) 19:04:01.61ID:tqTNgz/u
GDI+のスレッドがないのでここで質問させていただきます。。
SetStretchBltMode(COLORONCOLOR)の描画をGDI+のDrawImage()でやろうと思ったら、
どのような指定をすればよいのでしょうか。
なにも指定しないままだと補間がかかってしまうのですが。
202デフォルトの名無しさん
垢版 |
2020/06/16(火) 10:12:05.07ID:Ho5qWxry
http://eternalwindows.jp/graphics/bitmap/bitmap04.html
203デフォルトの名無しさん
垢版 |
2020/06/16(火) 10:17:29.91ID:Ho5qWxry
http://www13.plala.or.jp/kymats/study/MULTIMEDIA/StretchBltMode.html
2020/06/16(火) 17:03:02.58ID:i4a8GiUa
答えになってないように見えるけど
メモリコンテクスト相手にGDIで SetStretchBlt かけて出来上がったものを
GDI+ のDrawImage()に渡せということかしら
205161
垢版 |
2020/06/19(金) 12:23:58.37ID:UjmatHu8
>>162
できた dx

QueryFullProcessImageNameっての見つけて使った
2020/06/21(日) 18:02:55.24ID:kUjMwJEz
USBカメラから静止画データ(ビットマップorPNG形式)を取得したいのですが、
やり方が分かる人がいたら教えて頂けないでしょうか。
言語はC/C++です。
DirectShowかMedia Foundationを使えば良いという所まで分かったのですが、
それから先に進めない状態です。
207デフォルトの名無しさん
垢版 |
2020/06/21(日) 18:10:03.50ID:rRP2z2l8
APIでなきゃダメか?
OpenCV楽で良いぞ
2020/06/21(日) 18:11:37.00ID:wd9zfOZU
https://github.com/katahiromz/YappyCam
参考までに。
209206
垢版 |
2020/06/21(日) 18:52:33.53ID:kUjMwJEz
ご返信ありがとうございます。

>>207
OvenCVは商用で使いずらそうなので、APIを使いたいと思っています。

>>208
ざっとしか見てないのですが、
OpenCVを使ってキャプチャしてるので合ってますでしょうか。
OpenCVでは無くwindows APIを使ったサンプルがあったら助かります。
2020/06/21(日) 19:02:48.04ID:ZU8lvQ5O
OpenCVはBSDライセンスだから商用でも使いやすい部類
2020/06/21(日) 19:08:23.08ID:ZU8lvQ5O
ソースコードのライセンスとは別に特許が絡むのね
>>210は無視して
2020/06/21(日) 19:14:20.70ID:wd9zfOZU
Video for Windows
2020/06/21(日) 19:25:35.38ID:A5CNMF8H
Media Foundation でキャプチャするならまずMSDNのドキュメントを読む
https://docs.microsoft.com/ja-jp/windows/win32/medfound/audio-video-capture
個人のブログなど
http://codeit.blog.fc2.com/blog-entry-5.html

OpenCVのカメラ入力はお手軽だけどあくまでもOpenCVのおまけだしな。
フォーマットが選べなかったり複数カメラのどれが何番かわからなかったり。

VfWなんていまさら論外。
214206
垢版 |
2020/06/21(日) 19:29:16.51ID:kUjMwJEz
>>212
Video for Windowsも検討したのですが、
かなり古いAPIみたいでいつまでサポートされるか不安だったので
DirectShowかMedia Foundationでいこうと考えていました。
2020/06/21(日) 20:18:43.84ID:kUjMwJEz
>>213
ありがとうございます。
調べてみます。
216デフォルトの名無しさん
垢版 |
2020/06/22(月) 16:35:28.76ID:JXDt+qCb
敢えて OpenCV 使わず Win32API VFW
http://k3tec.net/neko_wiki/index.php?%A3%D7%A3%E9%A3%EE%A3%B3%A3%B2%A3%C1%A3%D0%A3%C9%B9%D6%BA%C210%B2%F3
2020/06/22(月) 17:43:47.11ID:5/AaGMJP
まぁ、やり方は色々あるよね
私だったらキャプチャするDirectShowのフィルターだけ作って
モニタ表示はフィルター構築できるプレーヤーに任せるかな
218デフォルトの名無しさん
垢版 |
2020/06/22(月) 18:52:56.68ID:JXDt+qCb
拾い物
https://ideone.com/D015A7
2020/06/22(月) 21:07:12.23ID:IQVBm2zv
>>213
http://codeit.blog.fc2.com/blog-entry-5.html
のサンプルを実行してみたのですが、
フォーマットがVFT_YUY2と表示されました。
ビットマップ、PNG、JPEGなど、画像ファイル形式に出力フォーマットを変更したいのですが分かる方はいないでしょうか。

MSDNを見ているのですが、動画キャプチャのサンプルはあるけど静止画が見つかりません。

(visual studio2010ラインタイムを消さないとSDKがインストール出来なくて苦戦した。)
2020/06/22(月) 21:34:56.69ID:NxxL+RwQ
そりゃカメラの出力フォーマットだな。ものによってはmpegやmjpegで出力できるカメラもあったりするが。
画像ファイルフォーマットの出力はWICとかを使うことになるだろうけど、そこへの並び替えはたぶん
自分でやるしかない。
221デフォルトの名無しさん
垢版 |
2020/06/23(火) 09:37:14.54ID:4kHZmTBE
>>219
OpenCV 使え
2020/06/23(火) 10:30:46.72ID:nxWi983E
directshowとsamplegrabberでいいんじゃないの
qedit.h書き換え必要だった気もするけど
223206
垢版 |
2020/06/24(水) 00:00:36.72ID:yIpXk3ZI
https://docs.microsoft.com/ja-jp/windows/win32/medfound/mfcaptured3d-sample
このサンプルをよく見たら、動画を吸い出しているのではなくて、
静止画を1フレームずつ、RGB32フォーマットに変換して画面に表示しているだけみたいでした。
RGB32フォーマットならとりあえず、保存・表示が出来そうなので、
このサンプルを使って静止画をキャプチャする方針で進めようと思います。

回答してくれた方々、ありがとうございました。
2020/06/24(水) 15:24:54.65ID:+Hp95Var
CreateWindowにてトップウィンドウ生成時、WitdhとHeightを指定し更に子コントロールもメインフォームと同じWidthを指定して作成したらトップウィンドウ側の方が横幅が小さくなってしまいます
少し小さいとかではなく10、20は小さく作成されてしまいますが何かオプションが必要なのでしょうか?
2020/06/24(水) 15:57:41.27ID:SnGEO7rh
>>224
トップウィンドウのスタイルと子コントロールのスタイルは何?

トップウィンドウのCreateWindowで指定するサイズはピクセル単位で外枠を含めたサイズ。
子コントロールの位置は、トップウィンドウの中のクライアント座標系で指定し、子コントロールのサイズはピクセル単位で子コントロールの外枠を含めたサイズ。
トップウィンドウでクライアント領域のサイズを指定したい場合はAdjustWindowRectEx関数を使用する。
2020/06/24(水) 16:03:25.28ID:SnGEO7rh
スクリーン座標とクライアント座標を相互に変換したい場合はMapWindowPointsかMapWindowRectを使用する。
227デフォルトの名無しさん
垢版 |
2020/06/24(水) 16:33:49.92ID:6+kkBVmV
AdjustWindowRectEx
https://www.nicovideo.jp/watch/sm8517855
https://xtech.nikkei.com/it/article/Interview/20091104/340019/
2020/06/24(水) 16:55:15.52ID:+Hp95Var
>>225
トップウィンドウはWS_OVERLAPPEDWINDOWで
子コントロールはコンボボックスでWS_CHILD | WS_VISIBLE | CBS_SORT | CBS_DROPDOWNLISTにしてあります
両者ともにWidthは200としていますが、明らかにトップウィンドウの方は200未満でおおよそ190あるかないかです
ちょっと調べてみたところWindows10だと左右7づつ縮むみたいな説もあるようですがそのせいなんでしょうか
2020/06/24(水) 18:08:11.67ID:irp07WaX
>>228
Widthなどは、同じ値じゃ駄目。
TopWindowの左右のBorderのドット数を引き算した値を、子ウィンドウの
Widthに指定する必要がある。
どのくらい引けばよいかは、>>225-227 で求める。
2020/06/24(水) 18:11:54.40ID:irp07WaX
>>228
TopWindowのWidthは、枠を除いた部分のドット数ではなく、
枠まで含めたドット数。
だから、ChildWindowのWidthと同じに設定してしまったら、
必ずChildWindowが収まりきれなくて枠にクリッピングされてしまう。
2020/06/24(水) 18:46:35.78ID:+Hp95Var
>>225>>230
rect.right = 200; rect.bottom = 200;でAdjustWindowRectEx(&rect, WS_OVERLAPPEDWINDOW, true, 0);
としたらWidthは216に変わり、その通りにWidth引数を216にしてみたら丁度良くなりました。
どうもありがとうございました。
2020/06/25(木) 17:32:44.39ID:lHQabM2A
ツールバーについてです
x86 コンパイルで意図通り動作するのですが、
同じソースを x64 コンパイルだと変になっちゃいます。

ツールバー作成時にTBSTYLE_TOOLTIPSを指定
TB_ADDBUTTONS メッセージでボタンを追加
その際の TBBUTTON の iString に文字列 char* を入れる
その後に TB_GETBUTTONTEXT でそのボタンの文字列を取得するのが
x86 → 正常に追加した文字列が取得できる。ツールバーにツールチップが表示される。(特に問題無)
x64 → 追加した文字列は取得できず、空文字列になる。ツールバーにツールチップが表示されない。

TB_ADDSTRING メッセージで事前に文字列を追加して
ボタン追加時の TBBUTTON の iString にインデックスを入れる形だと
x86 → 上記と同じ問題無く動作する。
x64 → 追加した文字列が取得できる。しかし、ツールバーにツールチップが表示されない。

という状況です。何かこちらの不備等があったりするのでしょうか?
それとも Windows のバグか何か?回避策等はあるのでしょうか?
WM_NOTIFY の TBN_GETINFOTIP を処理すればツールチップ表示は可能なのですが、
それ以外に方法は無いのかなと。
2020/06/25(木) 17:48:21.56ID:CRgrEcBh
>>232
iStringへのキャストで変なことしてない?
x64ではポインタ型と32ビット整数には互換性ないよ。
2020/06/25(木) 17:58:29.57ID:JNgE9Uo5
普通はTTN_GETDISPINFOかTTN_NEEDTEXTを処理するんじゃないの?
知らんけど
235232
垢版 |
2020/06/25(木) 18:12:29.19ID:lHQabM2A
>>233
iString は INT_PTR なので x64 だと64ビット長で互換はあるかと思います。
キャストは reinterpret_cast<INT_PTR>を使ってます。

>>234
ネットにあるいくつかの解説だとその通りなのですが
x86だと TBSTYLE_TOOLTIPS を指定したらそれだけで上手く行ったので
それでやってました
236232
垢版 |
2020/06/25(木) 19:13:37.19ID:lHQabM2A
>>232 の件もう少ししらべてみたら間違いがあって
TB_ADDSTRING メッセージで事前に文字列を追加で
iString にインデックスを指定するやり方でも x64での
TB_GETBUTTONTEXT で文字列は取得できませんでした。
要するに、x64だとツールバーのボタンに文字列を結びつけるのが上手くいかない感じっぽいです
2020/06/25(木) 19:16:36.51ID:CRgrEcBh
>>236
ソースさらせなほい
2020/06/25(木) 20:32:52.64ID:N8mY4JDD
アプリハンガリアンまで有害に見えてくる
システムハンガリアンの害毒は計り知れない
239232
垢版 |
2020/06/25(木) 21:53:36.69ID:FUxf81lS
現象を引き起こすコードを書いたファイルをアップしてみました。
x86のコンパイラとx64のコンパイラだと
メッセージボックスに出てくる文字列が異なるのと
ツールバーにマウスポインタを置いた時のツールチップの出る出ないの違いがあるかと思います。
https://dotup.org/uploda/dotup.org2184156.cpp.html
2020/06/25(木) 22:45:30.56ID:zEm5yq4t
>>239
SendMessage( hwndToolbar, TB_BUTTONSTRUCTSIZE, 20, 0 );
マジックナンバー使うなよ。間違いのもとだよ。
2020/06/25(木) 22:50:46.91ID:CRgrEcBh
この場合はsizeof(TBBUTTON)を渡すことになる。
2020/06/26(金) 09:28:06.84ID:jxJIoxQ+
> メッセージボックスに出てくる文字列が異なるのと

x86がANSIでx64がUnicodeビルドになってたりしないか?
243デフォルトの名無しさん
垢版 |
2020/06/26(金) 14:02:58.76ID:PjbtVFt+
>>242
+1
2020/07/10(金) 22:47:33.40ID:c4ANmjzx
たとえば、編集不要なアセンブルリストを表示して、デバッガでステップ実行するようにボタンをクリックして現在行を反転させながら表示したいとしたら、もちろんループやジャンプもあるのですが、どのコントロールを使用しますか?
行数は10,000位にはなります
自分でクライアント領域に書きますか?
2020/07/10(金) 23:01:52.84ID:JuXuxxAz
Listviewやな
2020/07/11(土) 00:34:30.72ID:lUabZX1b
自力
2020/07/11(土) 22:57:09.12ID:wT5X8b6q
>>245
ありがとうございます
ListView について調べてみます
248デフォルトの名無しさん
垢版 |
2020/07/25(土) 14:18:05.35ID:JLD5gc9b
ドライブ文字を変更したら、PdhAddCounterでLogicalDisikの
パフォーマンスオブジェクトを追加できなくなりました。エラーが返ってくる。
再起動してドライブ文字元に戻しましたがやはりダメです。
typeperf -qを実行してオブジェクトの一覧見てもLogicalDiskの項目がないです。
また取得できるようにするにはどうしたらいいでしょうか?
249248
垢版 |
2020/07/25(土) 14:48:11.84ID:JLD5gc9b
自己解決しました〜!
コマンドプロンプトからlodctr /rを実行すると
パフォーマンスオブジェクトを再構築出来てそれで大丈夫でした!
お騒がせしました。
250デフォルトの名無しさん
垢版 |
2020/07/25(土) 15:57:59.66ID:rATOgXd/
学術の巨大掲示板群 - アルファ・ラボ ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など

simulationライブラリで純粋な関数式プログラミングをする
UIライブラリ (C#, 2D) を作ったよ
連続と離散を統一した!
4Dエンジン
matrixのライブラリ
ある強力なFor関数
SQLライブラリ

☆ VMを書いた(C# + DirectX) * x86ではない!
ttp://up.x0000.net/files/TSimulang.zip
☆ malloc / free を実装してみた (C#)
ttp://up.x0000.net/files/TMallocTest.zip
2020/08/02(日) 15:26:17.74ID:qndZYaFt
winrt api は win32 api の上位互換という認識は間違いでさか?
2020/08/02(日) 16:28:19.35ID:hIQzyyzC
多言語からの呼び出しに対応するためにメタデータに拡張の入ったCOMとでも思っておけばいいよ
APIによってはデスクトップから呼べなかったりするのもあるけど
Win32APIかどうかを議論する意味はない
2020/08/03(月) 13:09:24.86ID:WkT+/Qz/
おまいらGetLastErrorの戻りやHRESULTからstd::system_errorを投げるのに何使ってる?
254デフォルトの名無しさん
垢版 |
2020/08/03(月) 13:41:03.78ID:3aFKjSal
関数を使います
255デフォルトの名無しさん
垢版 |
2020/08/03(月) 22:17:32.43ID:uGqrBkR1
糞翻訳はポイーで
2020/08/17(月) 20:20:13.97ID:lNHX7Tck
https://docs.microsoft.com/ja-jp/windows/win32/medfound/mfcaptured3d-sample
ここのサンプルを使ってwebカメラのキャプチャをしているのですが、
サンプルを実行すると勝手にオートフォーカスになります。
Media foundationを使ってマニュアルフォーカスにしたいのですが、
やり方が分かる方はいらっしゃいますでしょうか。
257デフォルトの名無しさん
垢版 |
2020/08/20(木) 16:41:05.34ID:TZFigD9E
IMEで確定前の入力をキャンセルされるにはどうすればよいでしょうか?
2020/08/20(木) 16:59:37.88ID:Pc2bs548
ESCキーを押します
259257
垢版 |
2020/08/20(木) 17:04:27.56ID:TZFigD9E
>>257
自己解決しました

>>258
'ESCキーを押します' 関数は無かったですね。
2020/08/20(木) 18:48:58.39ID:fEN4Cxbc
キーを押す関数はあるぞ
2020/08/20(木) 19:12:03.14ID:guZMM3wq
keybd_event
SendInput
2020/08/21(金) 01:55:16.52ID:SPVvFNrm
画面右下に IMEのON/OFF状態が表示されていますが、これをプログラムで
取得する方法はありますでしょうか?
2020/08/21(金) 01:58:58.71ID:SPVvFNrm
>>262
大事な点として、自分のアプリでの状態ではなく、システム全体での状態が取得
したいということがあります。
2020/08/21(金) 10:04:56.98ID:XusJMwC4
>>263
メモ帳開く(A)
→半角状態にする
→もう一つメモ帳を開く(B)
→全角状態にする

Aがアクティブになると半角に
Bがアクティブになると全角に
後はわかるな?
2020/08/21(金) 10:10:54.09ID:SPVvFNrm
>>264
それは、現在アクティブな(フォーカスを持っている)アプリに依存すると言うことですが、
タスクバーの右下には、ON/OFFが出ているので、システムは現在、どちらの状態
かを分かっているわけです。
その状態を知る方法が知りたいです。
2020/08/21(金) 10:27:29.32ID:XusJMwC4
自分のアプリがアクティブじゃない時でも状態をリアルタイムで知りたいって事?
もしそうならフック
267デフォルトの名無しさん
垢版 |
2020/08/21(金) 11:14:24.59ID:6zccVHNz
そもそもIMEの設定でアプリ毎に切り替えるかシステム全体で切り替えるかを選ぶから
そっちも観ておかないと判断出来ない
268デフォルトの名無しさん
垢版 |
2020/08/21(金) 14:02:23.66ID:oq5BC8ZW
いや、キーボードはひとつなんだから難しく考えるなよ
2020/08/21(金) 16:28:33.73ID:hY6Ml5La
>>268
IMEをON/OFFするキーバインドは、複数種あることと、カスタマイズすれば、
変更することも出来るので、単に全角/半角キーが押された回数をトラッキング
していけば済むわけではないと思います。
ALT+全角キーだけで反応する流儀と、ALTを押さずに、全角キーだけ押して
反応する流儀もありますし。
270デフォルトの名無しさん
垢版 |
2020/08/21(金) 16:36:18.53ID:2LaXNW9i
https://qiita.com/kob58im/items/a1644b36366f4d094a2c
https://teratail.com/questions/137570
http://www7a.biglobe.ne.jp/~tsuneoka/win32tech/7.html
2020/08/21(金) 17:34:52.11ID:Ci3Fu54P
ImmGetOpenStatus

まあ>267の言うとおりの問題はあるので、Windows全般でどうなっているのかという
判断が必要ならば仕様の見直しが必要
2020/08/21(金) 22:17:44.89ID:0m1+vyON
IMM32を実装できる方はReactOSを助けて下さい。
2020/08/22(土) 12:46:26.84ID:oUSNiZjo
>>266
やはり、フックですか。
実は、この件でのフックでの実験は既にやってみて、成功したことがあります。
ただし、フックは、32BITと64BITで DLL を分ける必要があるため、
実験したのは、32BITのみでした。
64BITにも対応しなくてはならないので、手間がかかるので中断してます。
2020/08/22(土) 15:55:52.64ID:hVxrtALE
>>262
GetDC(null)で画面全体のdevice contextを取得
bitblt()で画面イメージをメモリーDCに取得
>画面右下に IMEのON/OFF状態が表示
の部分を画像比較でON/OFF状態を判定
2020/08/22(土) 16:16:49.59ID:uVP5D41B
それはwindows2000までじゃね?
2020/08/23(日) 11:19:55.27ID:a/7Z84eB
>>273
キーボードフックならdll作らんでもいいぞ
2020/08/23(日) 12:54:28.26ID:SVuEjc7r
>>276
そうでしたか?
フックを始めるための API 関数名やフラグ定数名やモードなどを教えていただければ幸いです。
2020/08/23(日) 13:49:04.77ID:t0NmBsz5
そんなものはない
279デフォルトの名無しさん
垢版 |
2020/08/23(日) 14:07:51.37ID:Exm+Pt+Z
32bit用に描いたフックを64bit用に描き治すのってそんなに大変?
2020/08/23(日) 14:24:31.89ID:SVuEjc7r
>>279
普段使っている処理系が古くて、64BITに対応の処理系は、今まで使っていませんでしたので。
2020/08/23(日) 15:50:19.81ID:a/7Z84eB
普通にsetwindowshookexでできるぞ

wmwareアクティブだとマウスとキーボードフック全部効かなくなるけどなんとかならないのかな
2020/08/23(日) 15:53:59.01ID:a/7Z84eB
キーボードとマウスのフックでモジュールのハンドルとスレッドid0だとdllいらない
ほかは駄目なのあるけど
あと64bitで作っておけば32bitのフックもわざわざしなくていい
2020/08/23(日) 16:00:25.99ID:SVuEjc7r
>>282
>あと64bitで作っておけば32bitのフックもわざわざしなくていい
これはもしかすると、32BITアプリの場合、64BITのDLLのフック関数を OS
が呼び出してくれると言うことでしょうか?
2020/08/23(日) 18:50:47.56ID:t0NmBsz5
32bitで実験やったんなら移植もすぐだからやってみればいい
dll使わずにする場合も専用APIとか無いし
2020/08/24(月) 10:55:52.42ID:IztyfRL4
>>272
成功して欲しいOSだけど、日本語入力で行き詰まってるんなら先は長そうだね

>>274
表示位置で取得ってタスクバーの位置が変動するから無理があるのでは
デザインが少し変わっただけでも死ぬ

>>277
IMEのON/OFFのキーバインドなんて環境で様々なんだからキーボードフックなんかじゃ実現無理なの分かれよ
アプリ側でもプログラム的にON/OFFするのに
そもそもアプリ問わずIMEの状態を取得する意味あるのか?何したいんだよ
2020/08/30(日) 07:55:13.94ID:yNtthsj4
意味があるかどうかは外野がとやかく言うことではない
2020/08/30(日) 10:06:50.95ID:/cTt0XEP
意味の有無を聞いてるとしか読み取れないのはどうかと思う
2020/08/30(日) 14:59:21.03ID:XN33z1n0
素直に質問に答えりゃ良いんだよ
質問自体を疑問に思う必要などない
289デフォルトの名無しさん
垢版 |
2020/08/30(日) 15:09:45.20ID:GgAZZaQa
質問が間違ってるから答える気にもならないことはある
2020/08/30(日) 16:53:37.52ID:ClA8nGT1
どうせ32bitでなら実験したってのが嘘で試しようがないんでしょ
2020/08/30(日) 17:33:56.68ID:BjChy3oe
その実験は、凄く上手く行きました、と言っておきます。
2020/08/30(日) 17:36:51.12ID:IbTRMPI+
IMEのON/OFFはマウスやアプリでも出来るからな
そっちの対応はどうするんだろ
2020/08/30(日) 19:00:20.18ID:ClA8nGT1
皆キーボードフックしか言ってないけど
IMN_SETCONVERSIONMODE捕まえればいいやん
それもやったってんなら64bit対応するだけやん
2020/08/31(月) 20:27:32.61ID:YgYq5nQZ
ONはともかくIME入力中だとOFFしても入力中のIMEのうにょうにょが消えないのだが
2020/08/31(月) 21:02:36.79ID:fGHCeYBV
ONだと普通の数字は全角なのに
テンキーだと半角
ちゃんと分岐してるならテンキーのうにょうにょも無しにしたらいいのに
2020/09/07(月) 07:46:03.38ID:h3kjQIhT
おまいらGetCommandLineが返した文字列からコマンド名だけ除いた部分て、どうやって得てる?
2020/09/07(月) 08:31:55.79ID:Ml9CONKv
CommandLineToArgv
2020/09/07(月) 08:32:44.96ID:Y2TEo/a2
CommandLineToArgvW
2020/09/07(月) 08:39:11.94ID:h3kjQIhT
やっぱり自前でコマンド名だけ取り除くしかないのかな
空白や引用符に特別な意味を持たせたくないんだけど
2020/09/07(月) 09:33:01.54ID:DSNLMJBI
before afterはどんなの?
301デフォルトの名無しさん
垢版 |
2020/09/07(月) 10:21:46.55ID:Egt+Qwmp
結果にコミットする気が無い回答者たち
2020/09/07(月) 10:56:37.10ID:9HEBPbyG
おセックスしたいです
2020/09/07(月) 13:52:28.70ID:X4wk0IcB
MFCならCCommandLineInfoなんだがな。
304デフォルトの名無しさん
垢版 |
2020/09/07(月) 14:10:25.67ID:MtDNWdkb
CreateProcess見るといろいろな指定の仕方ができそうで不安になるよね
2020/09/07(月) 14:32:13.03ID:ibXVM4v9
>>296
そんなの使わずにWinMainの3rdパラメータ使う
2020/09/07(月) 15:26:51.28ID:DSNLMJBI
/a //b /c:"text"
この場合b無視すんの?
2020/09/07(月) 18:53:34.42ID:XlcRu9mb
>>303
CWinApp::ParseCommandLine()は__argcと__argvを見ているだけだけどな
308デフォルトの名無しさん
垢版 |
2020/09/08(火) 01:38:27.47ID:BXhGoa38
質問なんですがWindowsのカレントディレクトリって
アプリ毎に持ってるものなんでしょうか?
それとも全アプリ共通なのでしょうか?
2020/09/08(火) 01:41:38.73ID:NIyJzstU
>>308
スレッドごとに違うよ。
2020/09/08(火) 01:54:21.79ID:BXhGoa38
>>309
スレッド毎に違うんですね!ありがとうございました。安心しました。
311デフォルトの名無しさん
垢版 |
2020/09/08(火) 11:55:58.97ID:POT3YWIT
プロセスごとだろ
嘘つくなよ
2020/09/08(火) 12:00:43.95ID:VotMLAWA
この板には嘘つき朝鮮人しかいない
2020/09/08(火) 13:00:32.46ID:HYZN+BkE
>>312
自分がそうだからといって他人もそうだと思うのはよくないな
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:

・・・
2020/09/08(火) 13:29:57.92ID:oUJlYCUI
ということは、同一プロセス内の別スレッドでSetCurrentDirectoryが発行されると
自スレッドのカレントがいつの間にか変わっているということが起きるのか
2020/09/08(火) 13:50:32.04ID:JNlu12o+
カレントディレクトリの取得なんて、グローバル変数から情報を取ってくるようなもんなので危険ってことだ
そんなもん使うな
2020/09/08(火) 14:09:32.72ID:5CeoL0rA
>>315
もちろんそういうこと。
というより、カレントディレクトリも、広い意味で「UI」に関係したものと
考えられなくもないので、必ず Mainスレッドから取得するようにすれば、
安全と言える。絶対そうしなくてはならないわけではないが。
Window作製、グラフィック描画、マウス、キーボードからの入力なども、
Mainスレッドで行うのが原則。
これも絶対そうでなくてはならないというわけではないかも知れないが、
敢えて Subスレッドでやる意味も余り無い事が多く、Mainスレッドに限定
すれば、さまざまな危険回避のための余計なことを考えなくて済むメリットがある。
2020/09/08(火) 14:13:07.26ID:5CeoL0rA
>>317
補足すれば、カレントディレクトリは、MS-DOS時代では、command.com
が管理していたもので、アプリごとに異なるわけではなかったはず。
というのは、カレントディレクトリを便利に変更できるツールを作りたい
場合などに、アプリローカルであれば、不便だったからだと思う。
その設計哲学や文化や習慣が、Windowsにも受け継がれる必要は有ったと思う。
Unixの環境変数なども、アプリローカルになっていたりするが、意外と不便な
事も多い。
2020/09/08(火) 14:55:05.93ID:2rsMzWV+
何を根拠に長文をw
INT21 AH=3B の説明を読み直し要
2020/09/08(火) 18:38:57.08ID:HYNPtfS+
>>315
>自スレッドのカレントがいつの間にか変わっている
自分で管理できないスレッドなんてあるのか?
その別スレッドだって自分で作ったものだろ?
DLLとか自分で管理していないものもあるけどそれはスレッド関係ないわけだし
2020/09/08(火) 18:48:41.38ID:FLHP/hAu
DCE-RPCは電文受信すると勝手に
処理スレッドたててくれるよ
2020/09/08(火) 19:34:11.85ID:oUJlYCUI
>>320
別スレッドにするってことは自スレッドとの間にタイミングの束縛がない処理を任せるってことだよな
カレントディレクトリの変更がプロセス内の他のスレッドにも伝搬するということは
それはタイミングの束縛が生じうるってことだろ
つまり、それが困るなら別スレッドにしてはならない処理内容ってことで
そこの判断こそが「自分で管理」ということだ
2020/09/08(火) 19:36:02.20ID:HYNPtfS+
ちょっと何言っているのかわからない
2020/09/08(火) 19:41:07.94ID:oUJlYCUI
そうかい、それは残念だね
2020/09/08(火) 22:47:13.26ID:txiCBqFi
スレッドがお互いを信用できないとか、そんな羅生門みたいなプログラムは嫌だなぁ。
2020/09/08(火) 23:06:57.38ID:bOnMHAua
マジで地獄の召還かもな
2020/09/09(水) 00:11:58.92ID:VoppH/up
指定フォルダ以下のファイルをすべて処理するプログラムで
サブフォルダごとにスレッドを起動してみよう
328デフォルトの名無しさん
垢版 |
2020/09/09(水) 09:51:28.66ID:9MEEjZyT
フォルダ間移動ですね判ります
2020/09/09(水) 11:03:42.50ID:w9YsWEn5
そんなバッチファイルみたいなアルゴリズムでカレントディレクトリ移動しながらマルチスレッドをやるとかがそもそも迂闊だよな。
2020/09/10(木) 08:55:55.87ID:YCiClA3r
>>329
マルチスレッドじゃなくてマルチプロセスなら作業ディレクトリは完全に分離できる。
せっかくマルチタスクOSを使っているのだから、別プロセスに丸投げするのが最適だよ。
2020/09/10(木) 08:57:16.11ID:YCiClA3r
タスクマネージャー開けばわかるけど、今時のWebブラウザ(具体的にはEdgeやFirefox等)はたくさんの子プロセスを動かしている。
2020/09/10(木) 13:46:51.31ID:+JaTYUbA
話の流れを読めない奴は黙ってりゃいいのに…
2020/09/20(日) 07:50:00.62ID:sAMwu2sI
sse2までが必須になったのはいつだったか覚えませんか
win-7の途中くらい?
2020/09/20(日) 08:05:49.82ID:WRa/xy2u
>>333
Windows sse でググれ
https://www.atmarkit.co.jp/ait/spv/1807/02/news014.html
2020/09/20(日) 08:21:02.12ID:sAMwu2sI
>>334
ありがとうございます
336デフォルトの名無しさん
垢版 |
2020/09/22(火) 08:18:54.27ID:EoOf3jnh
win32apiを使っている人は、普段の文字コードは
stringとwchar_tを使っているのでしょうか。
2020/09/22(火) 08:26:19.44ID:bhDrmv5D
LPWSTR
338デフォルトの名無しさん
垢版 |
2020/09/22(火) 12:46:05.64ID:EoOf3jnh
ありがとうございます。
調べてみます。

stringを使いたいのに、win32apiは変換が必要?なので躊躇しています。
2020/09/22(火) 13:48:40.94ID:YDb2rcNJ
CreateProcessのユニコード版(W)の第2引数がリテラルだとうまくいかない件
これはハマったわ。

CreateProcess(TCHAR)でメモ帳起動させるサンプルで
_T("C:\\Windows\\notepad.exe")を直接与えてもCとしてコンパイルするとうまくいってて
c++にしたら起動しなくなったが、エラーが出ないから全然気づかなかったわ
ネットのCreateProcessのサンプルも普通に与えてるしなあ

考えてみれば実運用でこの部分は文字リテラル決め打ちにめったにならないから
知らずに回避してることも多いのかも
340デフォルトの名無しさん
垢版 |
2020/09/22(火) 14:14:47.55ID:iCejn/78
>>336
>>338
wstring
2020/09/22(火) 14:16:32.73ID:yrkD80aj
そもそもMSDNに書いてるし
2020/09/22(火) 14:16:37.87ID:5Q3AK6nV
LPTSTR で受け取ってるから書き換え可能なメモリアドレスでないとあかんのじゃないのん?
リテラルは const で書き換え不可だし 一回変数経由しないと
2020/09/22(火) 14:22:15.75ID:uF0JvJPV
自転車🚴のような絵文字をstd::stringで持つにはSJISではなくUTF-8として保持しておいて、
画面などの出力する直前にUTF-8からUTF-16に変換してUnicode版出力関数を呼び出す必要がある。
2020/09/22(火) 15:28:51.96ID:J6Z/5nZW
>>339
>lpCommandLine
>実行するコマンドライン。
>この文字列の最大長は、Unicodeで終了するnull文字を含めて32,767文字です。 lpApplicationNameがNULLの場合、lpCommandLineのモジュール名の部分はMAX_PATH文字に制限されます。
>この関数のUnicodeバージョンであるCreateProcessWは、この文字列の内容を変更できます。
>したがって、このパラメーターを読み取り専用メモリー(const変数やリテラル文字列など)へのポインターにすることはできません。
>このパラメーターが定数文字列の場合、関数はアクセス違反を引き起こす可能性があります。
2020/09/25(金) 09:12:14.46ID:3+LaQyVV
>>339
argvに渡すから非constだぞって話か
346デフォルトの名無しさん
垢版 |
2020/09/25(金) 10:57:09.24ID:4ovx1Tzj
非 const の引数に const リテラル与えたら
コンパイルエラーにならないか?
2020/09/25(金) 11:44:47.33ID:cdg8K9Zm
それがエラーになるなら固定文字列を渡せなくなるやん
2020/09/25(金) 12:18:15.76ID:3+LaQyVV
>>346
C++11以後、そうなった筈だけどcl.exeはversion 19.27.29111でも通す(もち/W4で)
349デフォルトの名無しさん
垢版 |
2020/09/25(金) 18:33:43.19ID:M9uVftQk
Win32API全部作り直してほしい
くだらない部分で人間の時間を消費しすぎだろw
2020/09/25(金) 18:41:06.52ID:14hC/BSs
>>349
自分でラッパーでも作ればいいんじゃね?
作れない低能なら諦めるしかないだろうけど
2020/09/25(金) 18:57:00.47ID:3+LaQyVV
>>350
御意
2020/09/25(金) 21:02:31.80ID:DCkHs+Bt
>>349
どんなところがダメなんでしょうか?
2020/09/25(金) 21:58:40.78ID:62tG58VZ
WINDK使ってサブシステム毎作り直せば良いのに
2020/09/25(金) 22:05:15.01ID:ogXn8IQh
コンパイルできるXPのソースが漏れてるらしい。
2020/09/27(日) 00:13:50.58ID:Tq9/SM8I
>>354
まじで?
XPはじまったな
2020/09/28(月) 13:45:59.88ID:A9tQ9Jdm
7もお漏らしして欲しいね
2020/09/28(月) 13:53:48.40ID:n9LyrBhU
未だに使ってる奴が死ぬだけ
2020/09/28(月) 14:33:51.78ID:PAQov7G9
海賊版天国の中国死ぬの?
2020/09/28(月) 15:10:38.57ID:q9HWvXQA
穴がさらにいっぱい見つかって攻撃方法が増えるんだから自明だろ
誰が対応するんや
360デフォルトの名無しさん
垢版 |
2020/09/28(月) 16:14:01.27ID:n0MW1Etw
久しぶりに Windows Update したら
Edge レイプされてポカーン
2020/09/28(月) 16:42:43.52ID:8K79+FWG
スカ ポン タン
2020/09/28(月) 16:51:28.28ID:QxfbhGyV
> Edge レイプ

うまい!
2020/09/29(火) 21:54:15.29ID:6fvRDqpi
_beginthreadexだけは許さんよ
もっとも醜悪な名前だわ
2020/09/29(火) 21:58:00.70ID:LdxVDSVq
MJD?
2020/10/01(木) 23:20:42.73ID:rwmZapHm
>>363 すれち
2020/10/18(日) 23:53:11.43ID:cRjbazHq
http://eternalwindows.jp にはWin32の核心部分が載ってる。参考になる記事だ。
2020/10/27(火) 20:43:03.29ID:rXCQsaV4
GetOpenFileName で初期ディレクトリとして OPENFILENAME の lpstrInitialDir に
任意のディレクトリを指定してファイルを開くダイアログを開いていて、おおよそ
意図した通りに動いているのですが、"C:\Users\Public\Documents"を指定したときだけ
初期ディレクトリが現在使用中ユーザーのドキュメントディレクトリになってしまいます

アクセス権のない他のユーザーのドキュメントディレクトリを指定したのなら
このような動作は理解できるのですが、パブリックディレクトリでこのように
なってしまうのは仕様でしょうか?
368デフォルトの名無しさん
垢版 |
2020/10/28(水) 11:43:37.22ID:Mf8tEr2f
SHGetSpecialFolderPath
2020/10/28(水) 17:45:50.04ID:DoZwgPmf
パブリックディレクトリの取得方法を聞いているわけではないのですが
"C:\Users\Public\Documents" は存在する有効なパスです
370デフォルトの名無しさん
垢版 |
2020/10/28(水) 18:30:52.56ID:Mf8tEr2f
再現した
C:\Users\Public
ならちゃんと public が開くが
C:\Users\Public\Documents
にすると自分のアカウントに行ってしまう
371デフォルトの名無しさん
垢版 |
2020/10/28(水) 18:36:57.63ID:Mf8tEr2f
あと存在しないディレクトリを与えると
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.
2020/10/28(水) 19:43:23.12ID:RpzUgl/d
comdlg32.dllのコモンダイアログ関係は >>367 のような想定外の動きをしたり
右クリックのコンテキストメニューで存在しない32bitフォルダを探しに行ったりと色々不具合を抱えてる
明らかにメンテされてない
ダイアログ内のListViewで開発者の想定外の事ができたりするから許されるなら使わない方が良い
2020/10/28(水) 20:10:50.98ID:xBovneds
コモンコントロール使ってるアプリに使うなと言ってしまうと、開発プラットフォームから見直さないとダメ案件では
2020/10/29(木) 10:55:01.44ID:XU4TLDfA
>>372
> Otherwise, the initial directory is the personal files directory of the current user.

この分岐に填まってるようですが、lpstrInitialDir が NULL でない以上おかしいですよね
とりあえず仕様ということで対応します
ありがとうございました

>>373-374
確かに他にも怪しい挙動があるので差し替えたい所ですが、そんな単純にコモンコントロール部分だけ
差し替えが可能なものがあればいいのですが・・
376デフォルトの名無しさん
垢版 |
2020/10/29(木) 11:27:15.51ID:wwhOrfBp
XP 以前と 7 で違うんだから
10 ならさらに変更されたとかありそう
377デフォルトの名無しさん
垢版 |
2020/10/29(木) 11:29:27.07ID:wwhOrfBp
>コモンコントロール部分だけ差し替えが可能なもの

秀丸ファイラーのdllって無かったかな
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++
380デフォルトの名無しさん
垢版 |
2020/11/12(木) 11:49:17.96ID:Twa29Hwt
追記
2: hook=SetWindowsHookEx(WH_KEYBOARD_LL,proc,inst,0)
フックにDLLインスタンスが絡みます。
2020/11/12(木) 11:54:18.15ID:fy6Pt/Zo
1〜2をやるボタンAと
4〜5をやるボタンBを配置して
ボタンBを押してから6やってみた?
382デフォルトの名無しさん
垢版 |
2020/11/12(木) 12:09:45.05ID:Twa29Hwt
>>381 ありがと
いや、そういう処理の分解はやってないです。

ただ、[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
384デフォルトの名無しさん
垢版 |
2020/11/12(木) 12:17:21.07ID:f5BAQJxF
あと 6 だけ実行する別のアプリを造っておいて
アプリ終了後にそれを呼ぶとか
2020/11/12(木) 12:23:11.40ID:Twa29Hwt
>>383
モニタしてみる。
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
2020/11/12(木) 17:06:23.69ID:n8RQesMu
呼び出しプロセスが終了するまではDLLの解放はされなかった気がする
つまり>>384が正解なのではないかと
2020/11/12(木) 20:28:25.76ID:g7bSPYZf
32bitアプリからShellExecuteでバッチファイルを呼ぶと当然ながら32bit環境で実行されるんだけど
これを64bitに強制できないかな
2020/11/12(木) 20:47:44.37ID:vr1SOjIj
>>389
Wow64DisableWow64FsRedirectionを使う痛い方法があるけど、推奨できない。64bit processを経由した方が痛みは少ない。
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);
これでいいのかな?
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前提の処理
2020/11/12(木) 20:54:02.43ID:vr1SOjIj
リダイレクトを無効化して、system32のcmdを指定すればいけるやろ。
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回目が発生
しないのかは、追い切れていません(汗。エラー検出で正常・・・的な行儀のよい
コードとは思えませんが、とりあえず、要モニタリングで先に進みたいとおもいま
す。

このあたり、お詳しい方がおられましたらご指導いただけると助かります。今のと
ころ困ってはいませんので、お暇なときにでも^^。ありがとうございました。
396デフォルトの名無しさん
垢版 |
2020/11/15(日) 15:57:26.98ID:1cE4y5+G
>FreeLibrary()がゼロを返すまで複数回繰り返す

なるほど
自分以外が使ってないことが確実に言えるならこれで良いんじゃないかな
2020/11/15(日) 16:00:32.57ID:U+/Dwi3J
実は自分で 2回 LoadLibrary してましたというオチですね判ります
2020/11/15(日) 16:26:04.91ID:e/1XaXi9
ズコー

LoadLibraryをAPIHookしちゃおうぜ
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。
2020/11/15(日) 18:03:54.84ID:pziaxEZW
>>395
FreeLibrary()は何回呼び出して何回目でゼロが返ってきてるの?
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 に示してあります。
フックの初回呼び出しにリファレンスが追加・・・かなぁ(妄想。
2020/11/15(日) 19:40:59.29ID:pziaxEZW
>>401
4でretなのに5でresなのは誤字かな?
2020/11/15(日) 19:54:35.90ID:pziaxEZW
というか>>379でいうと
> 3:  ...あれやこれやの処理...
ここに原因があるってことでしょ
そこ次第じゃないの?
2020/11/15(日) 20:18:38.41ID:qoaGDZ/5
まず>>379の1の直前・直後での山椒カウンターから調べてみるとか
2020/11/15(日) 20:46:59.18ID:ALi3WLRE
LoadLibraryの参照カウンタって簡単に取れたっけ?
昔DDKのヘッダ持ってきてゴニョゴニョやった気がする。
しかもwin7と8以降で構造体定義が違ったり。
2020/11/15(日) 20:52:47.67ID:gutimSe2
成功するまで n回 FreeLibraryを試みて LoadLibrary しなおす?
ATTACH と DETACH が副作用おこすかもだけど
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
するループ内で参照カウンタが変化かもとかゾッとします。

というわけで、今のところ警告を出して他の現象も集めてみたいと思っています。
が、人に使ってもらうレベルでは、参照カウンタの振る舞いは押さえておかないと
いけないという認識です。
2020/11/15(日) 21:38:16.46ID:18uzJ+HT
追記:
LoadLibraryが2度呼ばれてましたとかいうオチの時は、正直に詫びを入れることを
お約束いたします。いやマジで、ユーザーコード全部で記述は1ヶ所だけし、2回通っ
てないし(大汗。
2020/11/15(日) 21:50:53.68ID:Ixphny8D
LoadLibraryしたライブラリの名前は何ですか?
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
すいませんが、今日はもうレスできません。作業は停滞から抜け出れてますので、
どうかヒマつぶし程度の軽い気持ちで受け答えください(大汗。
2020/11/15(日) 23:47:17.82ID:+e2tZbOG
参照カウントは、読み込んだ・実行した回数と関係ないだろ。
複数のプロセスから、参照されていれば、2 以上になるだけだろ

自分が参照すれば1で、
OS も参照すれば、2じゃないの?

自分で参照回数を、0にすべきじゃない。
OSが使っているかも知れないし

OSが何をやっているのか、勉強していない香具師は、妙な事を考えない方がよい。
OSの勉強だけで、何十年も掛かるから
2020/11/16(月) 00:11:34.75ID:o4udgoJm
ウイルス対策ソフトによる介入まで考えたらさらに増える。
2020/11/16(月) 00:34:28.20ID:QRq3yxwv
>>411
ここで言ってるのはプロセス内の話だぞ?
LoadLibraryを2回やったらFreeLibraryも2回呼ばなきゃならんという話。

>OSが何をやっているのか、勉強していない香具師は、妙な事を考えない方がよい。
414411
垢版 |
2020/11/16(月) 01:24:18.28ID:9JpVGitI
DLL を2回も呼ぶのか?

一々、DLLをロードしてから、フリーするとか、
そんなに厳密に、メモリを気にしなくても良いのでは?

初心者は、そんな些末な事に、時間を掛けるべきじゃないと思う。
どうせ、1MB とか、ほぼ64 bit では無意味な節約だろ

そういうのを気にしていたら、Ruby などでプログラミングできない。
皆、富豪プログラミングなのにw
2020/11/16(月) 01:34:45.83ID:X7NjX7T3
411は何も解ってない
2020/11/16(月) 03:56:24.82ID:+pimEm7D
LoadLibraryの参照カウンタはプロセス単位
質問者はDLL_PROCESS_ATTACHが複数回呼ばれると思ってるようだが複数回LoadLibraryしても呼ばれるのは最初の1回だけ
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は勝手に参照カウンタ増やすよ?なんてアドバイ
スがあると、よかったのですが。

長文でくどくなって、イラついている人がいそうですね。この辺で、一度この話
題から私は離れたいと思います。アドバイスくださった方がた、どうもありがと
うございました。
2020/11/16(月) 08:26:01.14ID:bJvdDL6U
自発的なdllの削除ってなると >>412 の件は厄介かもな
419411
垢版 |
2020/11/16(月) 09:50:44.37ID:9JpVGitI
Windows は、クローズドOS だから、何をやってるか分からない

ファイルをロックするためにとか、メモリから追い出されないために、
参照回数を増加させるかも知れない

だから、自分が1回しか呼んでいなのなら、参照回数を2回減らしてはいけない。
2回減らしても、無視されるだけかも知れないけど

自分が増やした分だけを、減らすべき!
2020/11/16(月) 12:14:15.53ID:Hr3Y8q39
なんか参照カウントと単なるカウンタが入り乱れてそうな流れ
421デフォルトの名無しさん
垢版 |
2020/11/16(月) 12:21:40.31ID:sF1WJXNT
全部読まずにresするが
元々自分のexeの依存dllにそのdllを入れちゃってるのに
さらにLoadLibraryしてるとかかな
2020/11/16(月) 20:18:45.97ID:kmoq+Q7j
DLLのコードもあるなら別にDLLで無くてもいいのではと思ってしまうw
423デフォルトの名無しさん
垢版 |
2020/11/24(火) 20:44:41.98ID:/h51r/r1
>>421
俺もそう思う
静的リンクと動的リンク合わせて2回呼ばれていると思う
424デフォルトの名無しさん
垢版 |
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
2020/11/26(木) 19:21:32.18ID:+pStE+xj
普通そういう時はメッセージの方見るよね
2020/11/26(木) 19:21:58.33ID:AZoEWn7U
言語的お作法
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使ってコード書こうかと思ったがガックリだわ
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.
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

質問者からのお礼コメント
小学生でもわかるような回答ではなく、なぜそうなのかも回答できないと社会人として微妙ですよ。
わかる箇所だけ答えるのはニワカです。
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ではない別の方法があるのでしょうか?
2020/12/13(日) 17:32:24.33ID:cAYsSKhI
読み込んだ文字列をsscanf
2020/12/13(日) 17:35:08.88ID:/mwshU+q
CONIN$を開いたハンドルをCloseHandleで閉じたりFlushFileBuffersしたりは試しました。
2020/12/13(日) 17:37:07.75ID:/mwshU+q
>>434
ありがとうございます
sscanfはもちろんするのですが、その前段階、文字列を読み込む部分が上手くいっていないのです。
2020/12/13(日) 17:40:51.11ID:cAYsSKhI
setvbuf
2020/12/13(日) 17:48:17.56ID:zFOj0dh9
https://stackoverflow.com/questions/9020790/using-stdin-with-an-allocconsole
2020/12/13(日) 18:26:49.33ID:/mwshU+q
setvbufやfreopenはcランタイムの関数で、バッファもOVERLAPPEDのバッファとは違う気がします
freopenしたstdinからのscanfがブロックされてしまうというのが443の話なので
そこからノンブロッキングのAPIを使う必要があるのでは、ということになったわけです
2020/12/13(日) 19:01:38.77ID:/mwshU+q
ReadConsoleってAPIもブロッキングなので使えないわけですが、低レベルなReadConsoleInputというのもあるらしく
OverlappedでのReadFileよりこっちの方が正攻法なようです。
ともかくやってみます。
ありがとうございました。
2020/12/13(日) 20:23:25.03ID:casXcC2M
>>433
プログラム側で「この時点以降の入力を有効とする」タイミングは管理してないの?
その時点でバッファされてる物を一旦読み捨てれば良いだけでは?
2020/12/13(日) 21:23:50.52ID:w0iK+TRN
生のコンソールは制約が多いから
コンソールアプリの入出力を奪って適当なコンソールもどき作った方が早そうだけど
2020/12/14(月) 00:15:39.66ID:pdqk93XN
スレッド作ってブロックさせておけば良いと思うんだけど
正直な話>>442
バージョンによって微妙に動きが異なるし
2020/12/14(月) 11:31:29.18ID:AspHUlaN
>>443
ありがとうございました
ブロックしないじゃなくてブロックしても大丈夫にして上手くいきました

バッファの方は事前にFlushConsoleInputBufferで解決しました
2020/12/14(月) 12:14:03.24ID:GY9gb+Ps
コマンドプロンプトのコンソールを使う案件は、スクリプト言語とのプロセス通信を使ったほうが幸せになれる確立が高い。
2020/12/19(土) 12:04:23.50ID:+WDUx37o
GetProcAddressってAやWないよね?
それでいてwcharでもcharでも機能するのは仕様?
2020/12/19(土) 12:37:56.57ID:/QQvHqFx
wchar_t*渡して正常に動作するか?
2020/12/28(月) 00:26:19.90ID:222C9err
__declspec(thread)の変数ってスレッドごとに記憶域をもつわけですが
APIのTlsGetValue等でどうやって実現してるんでしょうか?

TLSインデックスをうまくスレッドハンドルと結び付けなけりゃならないと思うんですが。
2020/12/28(月) 02:51:22.15ID:p5Tcw1Ej
正直、このあたりは深く考えないことをオススメするのですが。
興味があるということであれば↓を参照しつつ。
http://www.interq.or.jp/chubu/r6/reasm/PE_FORMAT/6_6.html

コンパイラが__declspec(thread)の変数があった時に、どのようなコードを出力しているか
逆アセンブルしてみると理解が深まると思われます
2020/12/28(月) 09:50:34.64ID:222C9err
>>449
ありがとうございます
昔はTlsGetValueを使ってたのが、今はセクションが新設されてそこに作ってるんですね
2021/01/01(金) 22:20:09.03ID:kFKOiQ+I
VirtualAllocとHeapAllocの違いについてなんだけど
HeapAllocもヒープ残量以上のサイズを渡したらどの道VirtualAlloc呼ばれるって認識でいい?
2021/01/01(金) 22:30:52.02ID:3Cyk3fUO
HeapCreate以上のメモリはHeapAlloc
からは作れない。
2021/01/02(土) 09:33:50.89ID:Li/cNK13
>>452
ある程度大きいサイズのメモリ確保だとVirtualAllocの方が早くなるからそう勘違いしてたけどそういう訳じゃないんだね
最初に実際にアクセスした時に初めて実際にメモリ割り当てが行われるとかの挙動がHeapAllocでも走るってだけか
2021/01/02(土) 09:59:10.06ID:r4407Ytg
virtualの方がよりローレベルなので
チャンクアロケーターを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であらためてコンパイルすれば解決はしたのですが
#上の質問の解決策があるなら知りたいです
2021/01/12(火) 15:19:23.66ID:gjvDcKpD
>>455
C++の場合なら、ライブラリをdumpbinなどで調べて関数のマングリン化名を見れば分かる。
plain Cの場合は、実際にライブラリに1文字が2バイト以上のUNICODE文字を送ってみて、
正しく動作するかどうかテストしてみると分かる。
2021/01/12(火) 15:40:36.07ID:gjvDcKpD
>>456
plain C の場合、他の方法としては、
1. dumpbinでライブラリ関数を逆アセンブルしてみて、引数の扱いがbyteに
 なっているか、wordになっているかを調べれば分かる。
2. ライブラリの関数を呼び出すコードを書いてみて、デバッガで、ライブラリ関数の
 中を逆アセンブルする。
458デフォルトの名無しさん
垢版 |
2021/01/12(火) 15:41:24.71ID:LUlB/OIG
もしかしてマングリの PEB_W とかのが UNICODE 用ってことでしょうか?
2021/01/12(火) 15:52:56.37ID:gjvDcKpD
>>458
デマングラー
なるものが(ブラウザ上アプリとして)ネットであって、関数のシンボル名
を入れると関数プロトタイプ宣言に直してくれるので試すべし。
2021/01/12(火) 15:54:26.07ID:gjvDcKpD
>>459
gccとmsvcに対応した C++ デマングラー
https://demangler.com/
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 を作成しようとすると失敗します
2021/01/15(金) 15:12:37.26ID:Xgv++hhu
64bit?
2021/01/15(金) 15:12:57.53ID:7nTgmyE8
>>462
エラーメッセージは何でスカ?
2021/01/15(金) 15:16:41.23ID:PcvYNCYN
STDAPI は 暗に extern "C" を含んでてでマングリングなしの素
C++で _declspec(dllexport) の場合マングリングする
それで衝突してるんでないの?
466デフォルトの名無しさん
垢版 |
2021/01/15(金) 15:43:21.85ID:4rSXG5WT
>>465
なるほどそれのようですありがとうございます
http://eternalwindows.jp/windevelop/dll/dll06.html
467デフォルトの名無しさん
垢版 |
2021/01/15(金) 15:55:06.66ID:4rSXG5WT
解決っぽいです
https://python5.com/q/ntrrycea
2021/01/19(火) 04:48:40.40ID:gq4TTO9r
Windows10環境、お互いに管理者権限ありでPostMessageしても反応してくれないソフトがあったのですが
互換モードでWindows7を選択すると反応してくれるようになりました
そこで疑問に思ったのですがこの違いの原因は何でしょうか?
2021/01/19(火) 16:33:42.40ID:dOqXDJ4/
>>468
http://home.att.ne.jp/delta/hrymkt/PTIPS/UACvsAPI.txt
>PostMessage は 同じプログラムでも 一方が管理者権限で走っていると此にそのソフト特有の
>メッセージの ポストも出来ません。
>個々の メッセージは 受けとる方で ChangeWindowMessageFilter API で指定すれば受けとる様に出来ます。
2021/01/19(火) 16:36:03.29ID:dOqXDJ4/
ここを見ている人のために念のため貼っておくよ。ご参考に。

Win32のリファレンス マニュアル
Win32.chm http://laurencejackson.com/win32/
右クリックして「プロパティ」を選び、「許可する」をクリックして「OK」ボタンを押せばセキュリティのブロックを解除できます。
2021/01/20(水) 05:28:55.77ID:4MsON1Bd
>>469
ありがとうございます
そのページは私も確認したのですがお互いに管理者権限ありなので下記に該当すると思います
>自身が 管理者権限で走っていれば この制限は無くなります。
ポストに成功する互換モードでもお互いに管理者権限ありなのでWindows7と10の違いが原因だと思ったのですが具体的に何が違うのか分からず…
472デフォルトの名無しさん
垢版 |
2021/01/22(金) 11:43:02.03ID:LpWHKWeZ
64bitと32bit混在とか
LONG/HWNDの長さ違いとか
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:cJSBZXf9
>>473
Rust https://github.com/microsoft/windows-rs
C++ https://github.com/microsoft/cppwin32
C# https://github.com/microsoft/cswin32
https://forest.watch.impress.co.jp/docs/news/1301910.html
https://github.com/microsoft/win32metadata
2021/01/27(水) 16:13:17.46ID:ZPuhQ2SN
>>475
登録数だけ見るとやんわりには見えない
477デフォルトの名無しさん
垢版 |
2021/01/28(木) 11:08:41.51ID:dNWrUHbO
生暖かく応援するである
2021/02/04(木) 20:13:07.23ID:m67WeuC9
フルパス以外でのファイル固有のユニーク値ってBY_HANDLE_FILE_INFORMATIONのnFileIndexHigh、nFileIndexLow以外に何かない?
2021/02/04(木) 21:39:45.02ID:NI9TS1Gg
ハッシュ?
2021/02/05(金) 00:39:50.48ID:AkHBgQOB
GetOpenFileName()でファイルを開くダイアログが使えますが、
https://dotup.org/uploda/dotup.org2378520.png
このダイアログの赤枠内のように、チェックボックス等が追加されたカスタムのダイアログはどのようにすれば実現できるのでしょうか?
2021/02/05(金) 00:56:51.01ID:Nx26rnNw
>>478
FILE_ID_INFOのFileIdで128bitに拡張されてるな
2021/02/05(金) 01:06:52.68ID:U+NO2W2G
>>480
https://hp.vector.co.jp/authors/VA016117/esccd.html
483480
垢版 |
2021/02/05(金) 08:22:01.08ID:AkHBgQOB
>>482
まさにこれです!
ありがとうございました!
2021/02/05(金) 11:21:57.41ID:L6Uw8oZz
>>479>>481
膨大な量のファイルを列挙するにあたってハッシュ計算するのも、ハンドル開いてBY_HANDLE_FILE_INFORMATION読み込むのも億劫だったんだが
NtQueryDirectoryFileでmftからファイルID取れるってことに気付いた
2021/02/05(金) 12:13:51.05ID:UnxdNd0N
画像ビューワまだできないの?
みんな待ってんだから
486デフォルトの名無しさん
垢版 |
2021/02/06(土) 00:30:35.01ID:L1ZLjs+J
コントロールパネルでフォントを「非表示」にすると、言語に応じて
フォント選択画面に出てこなくなり選びやすくなるという機能があります。
この「非表示フォント」かどうかを判別する方法はありますでしょうか?

ChooseFont()ではなくEnumFontFamiliesEx()を使い、独自のフォント選択ダイアログを作成中ですが
非表示フォントを判別する方法がわからずすべて列挙してしまいます。
2021/02/06(土) 00:37:08.03ID:j9M7S4X7
>>486
レジストリ設定によるらしい。

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Font Management

https://visualstudiomagazine.com/Peterson1110?m=1
2021/02/06(土) 02:04:53.58ID:L1ZLjs+J
>>487
ありがとうございます!
レジストリに「非表示フォント」の一覧が記録されているのですね。
その内容を取り出して比較してフィルタリングしたいと思います。
489デフォルトの名無しさん
垢版 |
2021/02/13(土) 06:46:11.29ID:neaggcXJ
ExpandEnvironmentStrings() は、%環境変数%を展開してくれるけど、
PowerShellの$env:環境変数 を展開してくれるAPIとかないのかな?
2021/02/13(土) 10:11:29.20ID:PYtZn7CJ
>>489
[Environ]::ExpandEnvironmentVariables($env:環境変数)
491デフォルトの名無しさん
垢版 |
2021/02/14(日) 11:18:45.76ID:PGTjJwEI
2021/02/10
WindowsのTCP/IP実装に複数の重大な脆弱性、今月のセキュリティパッチはかならず適用を
ブルースクリーンが引き起こされるサービス拒否(DoS)脆弱性はすぐに攻撃が出回る可能性
https://forest.watch.impress.co.jp/docs/news/1305583.html
2021/03/03(水) 09:48:23.14ID:GTR/ytE6
Win32の質問というよりOSの仕様に近い質問になってしまいますが、
新しくファイルを作るにあたり予めファイルサイズが分かっている場合、SetFilePointerEx&SetEndOfFileで予めファイルサイズを決めておくと断片化しづらいというテクニックがありますが
一度のWriteFileで一気に書き込む場合は上記の工程を行わずとも断片化しづらいのでしょうか?
2021/03/03(水) 17:46:09.32ID:Uextqx1e
本当にそんな制御になっているか分からないけど理屈だけだと、最初に一発ここまで
使うよって宣言しておけば領域が一挙に確保されるかもしれない

逐一書き込みを行ってその度に領域を確保すると、システム全体がシングルスレッドで
動いていれば(ありえないけど)、自分が書き込みを行っている間に別の
プロセス/スレッドが書き込みを行うと、領域が分断されると思うのだけど
494デフォルトの名無しさん
垢版 |
2021/03/09(火) 14:20:50.29ID:iP4nVCks
断片化対策というか
常に同じセクタに書き込むように出来なかったっけ?
2021/03/09(火) 23:41:10.45ID:zAPDJC3N
高速ファイルコピーのフリーソフトの作者のブログか何かでこんだけWindowsのコピーは大変だよみたいな記事を読んだ覚えがある
2021/03/10(水) 03:22:04.66ID:Gf/98J6J
これやな
ttps://m.facebook.com/dnobori/posts/2142836202459674
2021/03/10(水) 07:59:53.47ID:pDjVp4Qi
面白かった
2021/03/10(水) 09:21:13.05ID:XSc6HIdm
結構読んだと思ったらまだスクロールバーが半分で、うんざりして読むのとWindowsでファイルコピーするのをやめた
2021/03/10(水) 09:48:53.12ID:ayODL1B0
リーナスですらもNTFSが現状ベストって認めてるくらいだからその分複雑なんだろうね
500デフォルトの名無しさん
垢版 |
2021/03/26(金) 09:24:09.04ID:saZG9dHC
ほとんどの環境で特にエラーは出ないのですが
特定の環境でSHFileOperation()をFO_COPYで呼ぶとERRORONDESTが返ってきます
ファイルが使用中で書き込みできない場合は別のエラー、
ファイルではなく同名のフォルダでも別のエラーとなり
エクスプローラで手動でコピーは可能です
コピー元は全て英語のD:\AAA\BB.exe, コピー先は%temp%\AAA\\BB.exeを展開したもので
C:\Users\Username\AppData\ocal\Temp\AAA\\BB.exe
リトライしても改善しません

SHFileOperation()でERRORONDESTが返る要因てどんなのがありえそうですか
2021/03/26(金) 12:36:51.59ID:HcNsE5xL
>>500
バックスラッシュが二重になってるよ。
2021/03/26(金) 13:42:06.64ID:cPlbb1Mg
pFromとpToの末尾は'\0'が2つ必要だけど忘れてない?
2021/03/26(金) 17:20:08.28ID:XmR64PQN
pTo はダブルにする必要なくて pFrom のみじゃね?

複数個のファイル名を \0 をセパレータにしての連結して渡す意図かと
 pFrom "fileA\0fileB\0fileC\0"
 pTo "dir\\"
fileA,fileB,fileC を dir\ へ
504500
垢版 |
2021/03/26(金) 18:24:57.44ID:saZG9dHC
>>501
すみません、バックスラッシュはコード上は正しかったです
ちなみにスラッシュが足りない場合は0xA1 指定されたパスは無効です が返ります
多い場合は0xb7 既に存在するファイルを作成することはできませんとかが返ります  

>>502
'\0’は末尾に4個以上はいれてます

FOF_SILENTは無効にして試しているんですが、有効にして書き込み禁止のファイルを上書きしようとすると
0x7cシステム コール レベルが間違っていますがかえります

この環境では、0x10000:ERRORONDESTが返るんですけど、
ほかの環境でERRORONDESTが再現できないんですよね..
505デフォルトの名無しさん
垢版 |
2021/03/26(金) 18:28:02.43ID:3gUI29td
>>499
あわしろ氏は、NTFSは欠陥品と言ってたけどな。
2021/03/26(金) 19:16:16.62ID:MYLkW03n
>>504
FOF_MULTIDESTFILES を指定した場合はどうなるの?

というか、まず C:\Users\Username\AppData\ocal\Temp\AAA というディレクトリじゃなくて
決め打ちでコピー先を D:\BBB\BB.exe って指定してうまくいくかどうか試してみたら?(D:\BBB というディレクトリは作成しておく)
これで失敗すれば関数の呼び出しに問題があると言えるし
成功すればその C:\...\Temp\AAA というディレクトリに問題がある
507500
垢版 |
2021/03/26(金) 19:31:39.70ID:saZG9dHC
>>506
決め打ちでパス指定してもダメでした
というかどこからどこにコピーしても全部ERRORONDESTのエラーになります
問題あるのは特定のPCだけで、他のPCだと問題なく動作するので、
何か変なソフトに邪魔されているかもしれません

もうだいぶあきらめ気味ですが、解決したら続報のせます
回答くれた人ありがとう
2021/03/26(金) 21:05:36.78ID:mmjZdfI1
セキュリティーソフトとか、アクセス権限とか
2021/03/26(金) 21:09:03.33ID:CAbtDF19
エクスプローラの手作業ではコピーに成功してるらしいんだよねぇ
2021/03/27(土) 15:56:10.46ID:VE8mC68O
特定のも含めてPCがそれぞれどんな構成か出さないとエスパー案件になりそう

windowsがunicode設定だったり実はバージョン違いとかとか
511デフォルトの名無しさん
垢版 |
2021/04/03(土) 22:56:21.93ID:pdE0Ehe0
GetFullPathNameW() に C:\ ではなく C: を渡すとどんな文字列が返ってくるのかお教えください
2021/04/04(日) 01:15:17.97ID:SuYLyBNw
>>511
ばーか
って返ってくるよ
2021/04/04(日) 08:37:20.89ID:SvWSCx06
>>511
試す気は全くないんだな?w
514デフォルトの名無しさん
垢版 |
2021/04/05(月) 01:40:45.93ID:VcR5h3be
fopen()に環境変数、例えば %VARIABLE% を含むパスを渡した場合、
fopen()の側で環境変数を展開してからファイルオープンするかどうかって決まってますか?
2021/04/05(月) 02:22:21.13ID:hqxnqcGl
>>514
環境変数は@自分で目的のものを入手して、A自分で展開するしかない、かと
2021/04/05(月) 05:55:39.12ID:B3M7CzzN
>>514
決まってる
2021/04/05(月) 20:35:30.57ID:XdKinJWZ
fopen()はWin32APIじゃないから、決まってないんじゃないの?
2021/04/05(月) 21:00:39.05ID:ogb+W0EK
決まってるという言い回しがアレだが、仕様としては>>515なのではないか
GetEnvironmentVariableとかExpandEnvironmentStringsとか使えと

つーか、511にせよ514にせよ自分で試せよ
内容からして同一人物か?
2021/04/05(月) 22:17:44.32ID:36Cyp5PA
便乗だけどREG_EXPAND_SZ属性のレジストリの文字列って適当なAPIで取り出す時には展開されてる事を期待していいのかな
520デフォルトの名無しさん
垢版 |
2021/04/05(月) 22:28:04.02ID:VcR5h3be
fopen()つまりCreateFile()の環境変数展開の仕様が決まっているのならその文章のURLを貼ればいいだけで、そういった文章がないということは決まってないということだろう。
2021/04/05(月) 22:35:50.69ID:SUd0RcBB
環境変数を展開するというなら%が含まれるファイル名の時は%をどうエスケープするの?
CreateFileのリファレンスに書いてある?
2021/04/05(月) 22:41:43.76ID:5fbmy6mD
>>520
そういった文章がない=展開しないと決まっている じゃないかね
523デフォルトの名無しさん
垢版 |
2021/04/05(月) 22:42:12.28ID:VcR5h3be
>>518
ローカル環境で試すことに意味はない
重要なのは仕様だけ

>>521
みたことない
524デフォルトの名無しさん
垢版 |
2021/04/05(月) 23:41:24.36ID:VcR5h3be
そもそもWin32APIはコマンドプロンプトのシェルに依存すべきではないから%VARIABLE%を勝手に展開するのはあまり好ましくない。
PowerShellやbashの書式で環境変数展開できないのは不公平になる。
2021/04/06(火) 00:50:31.34ID:7Od2aTl4
>>520
>fopen()つまりCreateFile()の環境変数展開の仕様が決まっているのならその文章のURLを貼ればいいだけで

お前が自分で探してこいよ
何言ってんだこいつ
2021/04/06(火) 00:51:08.33ID:yLju/cD3
>>521
%%じゃないの?
2021/04/06(火) 00:56:50.13ID:XnTB+TXu
>>526
printfじゃねーんだぞ
2021/04/06(火) 01:41:26.10ID:Im/sjr+Q
書いていることが仕様であって、書いてないことは仕様ではない
CreateFileでパンが焼けないと書いていないからパンが焼けると判断するのはキチガイ以外他ない
2021/04/06(火) 05:09:02.50ID:wdOO9l8n
全てのAPIにパンは焼けませんって書かせる基地外w
2021/04/06(火) 09:41:04.31ID:9TplgPlq
文字列の痴漢は頼みもしないのに勝手にされたら邪魔だ
2021/04/06(火) 12:59:56.19ID:EpJptavP
テストもしないクズなのは確定なんだが
「仕様」かどうかが主語であるべきなのに、仕様かどうか「決まっている」というところを主語にして
続けていること自体がもはや技術者ではない
2021/04/06(火) 17:02:11.12ID:BqyPmRZM
>>520
>fopen()つまりCreateFile()

全然つまりじゃねー
Windowsではそういう環境変数よりもレジストリ使えってスタンスじゃないの
2021/04/06(火) 17:26:56.80ID:mi+0bNxV
C言語って極力余計なことはしないスタンスだから
環境変数の展開はやりたければ、自前でやったうえで fopen に渡せであって
展開動作を行なうようなのは printf のフォーマットのように 特記されてる


気がする
2021/04/06(火) 17:50:22.69ID:yLju/cD3
>>526
でもレジストリに記録されているMSのデータって%1とかそういう系多いよね
535デフォルトの名無しさん
垢版 |
2021/04/08(木) 14:31:52.37ID:BYjSvKlS
cout 前提に描かれてて
wcout 使うとおかしくなる
2021/04/08(木) 15:39:57.79ID:96RQoR7P
よかったね
2021/04/12(月) 12:14:25.84ID:8dcLaG4E
レジストリのCLSIDのツリー見ると吐きそうになるんだけどどうにかならないのか
2021/04/12(月) 13:51:17.63ID:1iNVR91A
あれは人の赴くところではない
2021/04/12(月) 21:29:02.33ID:coUHZ64T
プロセスにデバッガがアタッチできないようにしたい場合はどうすればいいのかな
2021/04/13(火) 00:39:58.51ID:FveNCngD
IsDebuggerPresentでも使ってアタッチされてたらプログラムを終了させる
カジュアルハック相手なら十分でしょ

本気でハックしてくる相手なら十分な対策は存在しないので考えるだけ無駄
Webアプリにするとか、攻撃者のテリトリーで秘密を実行しないことを検討しろ
2021/04/13(火) 09:31:13.07ID:KgfckCYX
多重のアタッチってできたんでしたっけ?
自前で用意しておいたデバッガプロセスに先にアタッチさせておくとか?
2021/04/13(火) 09:58:40.85ID:K5Ly9c1T
それAPIHookでFALSE返されたら終わらない?
2021/04/13(火) 15:25:33.02ID:FveNCngD
だから考えるだけ無駄だって
2021/04/13(火) 16:57:10.31ID:XgVnBmdE
難読化も含めて ある程度攻撃者に対して面倒くさくさせることは出来ても
バイナリ渡した時点で無敵はない。。。
2021/04/13(火) 17:42:43.87ID:fWoCeTea
サブスクが許される時代なので
546デフォルトの名無しさん
垢版 |
2021/04/16(金) 06:12:55.34ID:aOiTCYkX
バッチファイルのコマンド文字列に含まれるマルチバイト文字が既定のコードページで解釈されることを保証するにはどうすればいい?
バッチファイルをパイプでつないだ別プロセスがSetConsoleOutoutCP()を呼び出すと、バッチファイルから呼ばれたコマンドで引数が文字化けしてしまうようだ
547デフォルトの名無しさん
垢版 |
2021/04/16(金) 06:14:31.74ID:aOiTCYkX
SetConsoleOutputCP()に訂正。
hodeでSetConsoleOutputCP()が呼ばれると、foo.bat内のコマンドが正しく引数を受け取れない

foo.bat | hoge
2021/04/16(金) 12:10:08.81ID:k5zYfJVI
Windows 版 Ruby(MSYS2)では、端末の日本語入力でバグるので、あきらめた。
CP932, UTF16LE などか?

UTF-8 にも設定できるようだが、それでもバグる。
自分で環境変数RUBYOPT に、--encoding=UTF-8 を設定しているからかも知れないけど

結局、Windows をあきらめて、Linux を使う事にした

WSL2, Ubuntu 18.04 の端末では、バグらない。
たぶん、UTF-8 に固定されているのだろう
549デフォルトの名無しさん
垢版 |
2021/04/16(金) 15:13:16.68ID:aOiTCYkX
>>548
情報をありがとう

foo.bat標準出力の受信先プログラムhogeでSetConsoleOutputCP()を呼び出すのを可能な限り遅らせることで対処することにします
batファイル全体が読み込まれてからバッチ処理されるのではなく一行ずつ解釈されていく副作用は以前にも経験したことがあります
バッチ実行中に、batファイルから一行を丸ごと削除したら、その行が呼ばれなかった
550デフォルトの名無しさん
垢版 |
2021/05/04(火) 11:19:33.09ID:g/PMv139
戸田覚ωωω
https://www.youtube.com/watch?v=tikizYdsaVs
https://www.youtube.com/watch?v=LuqNTgrOIwY
551デフォルトの名無しさん
垢版 |
2021/05/07(金) 17:44:46.80ID:X6HNN+5P
WNDCLASSEX
↑明らかにセクハラ。発音するたびに気まずくなる。MSはセクハラ用語を廃止すべき。
2021/05/07(金) 18:07:42.33ID:jd+9/N8Q
>>551
中学生か
2021/05/08(土) 11:00:03.48ID:St3wXYGV
6809の0x1dとかね
2021/05/09(日) 13:14:58.69ID:Ad3WTS9Y
先生「続きを読みなさい、551
551「はい、えーとワンドクラス…セ、セックス…
先生「ウィンドウクラスイーエックスな
みんな「クスクス…
555デフォルトの名無しさん
垢版 |
2021/05/09(日) 13:37:13.38ID:WMytKT+1
EX
556デフォルトの名無しさん
垢版 |
2021/05/17(月) 13:31:21.74ID:giSQx4b2
vc2017だとkernel32.libとかuser32.libとかリンクするファイルに書いておかないといけなかったけど
vc2019だと何も書かなくても勝手にリンクされてる気がするんだけど
気のせい?オプション変わった?
2021/05/26(水) 08:51:12.20ID:Z7O4lEqC
SelectObject 関数利用時の注意事項
https://jpdscore.github.io/blog/windowssdk/note-when-use-selectobject-function/
2021/05/26(水) 08:56:28.37ID:D9TQ/wp9
印刷関係全滅しそうな怖さがあるな
559デフォルトの名無しさん
垢版 |
2021/05/26(水) 09:06:31.66ID:VVGa10VW
白黒でしかプリントしないアプリとか影響ありそう。
サクラエディタのソースコードCImageListMgr.cppの668行付近に以下のようなコメントがある。

// 単にCreateCompatibleDC(0)で取得したdcや
// スクリーンのDCに対してCreateCompatibleBitmapを

// 使うとモノクロBitmapになる.
560デフォルトの名無しさん
垢版 |
2021/05/26(水) 12:37:07.57ID:D7HypFOx
1.昔がいい加減過ぎたので治すのは良いこと
放置はセキュリティホールになりかねない

2.MSがWin32APIを終わらせるための陰謀
2021/05/26(水) 14:11:55.64ID:e8ZuE3dO
そもそもスクリーンDCにプリンターDCをSelectObjectする意味が分からん
印刷(プレビュー)のときに使うの?

それなら普通、描画処理に出力先のDCを渡してスケーリングするだけじゃないの?
562デフォルトの名無しさん
垢版 |
2021/05/26(水) 16:01:40.89ID:D7HypFOx
WYSIWYG: 「しらんがな」
2021/05/26(水) 18:02:46.62ID:pvBUijTc
今時プリンタにはあんま印刷しないけどpdfには出力したりするから影響はありそうだね
2021/05/26(水) 21:49:00.27ID:OwCAYyY8
いまだにGDIがメンテされているのに驚いた
565デフォルトの名無しさん
垢版 |
2021/05/27(木) 14:47:18.05ID:U0nLnJgd
pdf に出力するときに DC とか使わんやろ
566デフォルトの名無しさん
垢版 |
2021/05/27(木) 15:07:08.38ID:IJ5CRrqh
>>565
え?
2021/05/27(木) 15:13:42.50ID:Rsi8GDuA
DC使うにせよ>557みたいなことしてて問題になるとは思えんけどな
2021/05/28(金) 08:24:04.05ID:8x0p4uVO
>>565
??
2021/05/28(金) 20:06:12.33ID:EVIGfz1i
>>565
???
2021/05/28(金) 20:58:05.97ID:bppkVuU/
自作アプリのPDF作成はプリンタDCに頼らずに自力でやってる
2021/05/29(土) 06:42:49.20ID:XrsIdb/I
わぁそれは凄い。是非GhostScript越えの
OSSとして公開してくれたまえ
2021/05/30(日) 07:46:15.09ID:p+VrCgXk
[名前を付けて保存]で.pdfが選択できるあのパターンか
2021/05/30(日) 07:58:56.70ID:WEq4SBwj
まさか、そんなWin32api全く関係ない
やり方で実装して専用スレで自慢したりしないでしょぅ
XPS経由だってスレ違いかと。

自慢するからにはバイナリーで直接生成していると見た。
公開早よう
2021/05/30(日) 09:45:29.63ID:LN/prPAP
>>573
何を言ってるんだ?
> [名前を付けて保存]で.pdfが選択できるあのパターンか
が簡単にできるなら俺も知りたいぞw
2021/05/30(日) 10:42:53.61ID:ssDmNHo+
PPAPは馬鹿っぽい
2021/05/30(日) 16:45:35.69ID:PqG+8+2Y
>>572
印刷の出力先をプリンタでなく「Microsoft Print to PDF」とかにするって普通にやらない?
古いOSならフリーソフトの「Cute PDF Writer」とか
2021/05/30(日) 20:56:15.06ID:WEq4SBwj
それはプリンタDCを使って印刷するんだべ

570でそれは否定されているぞ
2021/05/30(日) 20:57:42.71ID:p+VrCgXk
>>576
普通にやるけど
ワードも一太郎もドライバ型じゃないpdf出力機能あんじゃん
2021/05/31(月) 16:22:50.06ID:XbQeT4fa
ReadDirectoryChangesExWでroutine渡して非同期フォルダ監視してるんだけど、これって通知来るたびに一回一回登録し直さないといけないの?
通知 → 登録し直しの間は監視漏れが発生しうるって事だよね?
2021/05/31(月) 16:52:07.49ID:3RgsPXyf
http://eternalwindows.jp/shell/shellname/shellname06.html
https://www.usefullcode.net/2007/01/post_45.html
https://docs.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shchangenotifyregister
https://docs.microsoft.com/ja-jp/windows/win32/fileio/obtaining-directory-change-notifications
2021/06/01(火) 02:10:15.60ID:Rxn2JXc8
どうやらDeleteFile関数はナイフのように危険な関数と見なされているらしい。使うのはためらうがいい。
2021/06/01(火) 03:20:20.18ID:iJwujeZa
詳しく
2021/06/01(火) 16:25:48.20ID:IAoswQIc
思わせぶりなんやな
2021/06/01(火) 16:31:57.56ID:29GPvfIS
>>580
完璧に監視したいならカーネルドライバ仕込むしかなさそうか
2021/06/02(水) 04:00:06.74ID:CFdyIdLe
完璧かどうか忘れたが、登録し直しなんてやった記憶ないな
2021/06/02(水) 11:14:04.96ID:qtmfAhQ7
登録し直しなんてやった記憶無いし
しなくても通知は来ることは来るけど
ちゃんとしてても普通に取りこぼすことはあった気がする
2021/06/03(木) 00:06:10.42ID:mgPJdS86
>>585>>586
それはSHChangeNotifyRegisterの話?
もしくはReadDirectoryChangesExWでもIO完了ポートで受け取る方式なら継続的になるとか?
完了ポートでの非同期IQはややこしそうだからとスルーしていたが
2021/06/03(木) 19:50:54.55ID:smLJNlVA
>>587
585だけど昔のソース見たら専用スレッドで下みたいなことしてた。登録し直してるわ
OVERLAPPED ol;
ol.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

for (;;) {
bRet = ReadDirectoryChangesW( hDir, buffer, buffer_size, TRUE,
FILE_NOTIFY_CHANGE_FILE_NAME |FILE_NOTIFY_CHANGE_LAST_WRITE|FILE_NOTIFY_CHANGE_SIZE |FILE_NOTIFY_CHANGE_CREATION|FILE_NOTIFY_CHANGE_SECURITY
, &dwByte, &ol, NULL);

ol.hEvent を WaitForMultipleObjects で待つ

bRet = GetOverlappedResult(hDir, &ol, &dwByte, TRUE );

for (;;) {
pInfo = (FILE_NOTIFY_INFORMATION *)&buffer[i];

別スレッドの待ち行列に追加

if (pInfo->NextEntryOffset == 0)
break;
i += pInfo->NextEntryOffset;
}
}
2021/06/07(月) 03:29:32.93ID:N0vu82AX
タッチスクリーンとして扱われる入力デバイスがあるのですが、これをマウスのように扱いたいです。
具体的に言うと、ブラウザ等のアプリ上でWM_POINTERDOWNが発生した時点でマウスの左クリックと同等の動きをさせ、POINTERDOWN以外のWM_POINTER系メッセージを握り潰したいです。

SetWindowsHookEx()で、起動中の各アプリケーションに対して自作dll内のフックプロシージャをインストールしたのですが、下記StackOverflowの投稿と同じ状態になって詰まっています。
https://stackoverflow.com/questions/21069643/is-it-possible-to-remove-touch-messages-wm-pointerdown-etc-that-an-applicatio

フックタイプにWH_CALLWNDPROCを指定すればメッセージの握り潰しや書き換えができるようなのですが、その場合どのようなウィンドウメッセージをフックすれば良いのでしょうか?
2021/06/12(土) 10:06:00.61ID:AjrJ9Ngk
このスレでいいのか判りませんが質問です。
WindowsのタブレットはUSBマウス等のポインティングデバイスを差さないとマウスカーソルが表示されないのですが、
APIか何かでマウスカーソルを表示させる方法ってありませんか?
タブレットでSendInputで自動操作させる時にマウスカーソルが表示されず、何が起こっているのか判らないので何とかしたいです。
kokomiteみたいなソフトも試しましたが、ログイン前とかでは使えないので他の方法がないか探しています。
2021/06/12(土) 14:25:29.90ID:EUQ7Uxqr
マウスジグラーを繋ぐとかは抜きなら
DDKじゃね
2021/06/12(土) 14:30:19.46ID:5buAbQHn
SetProp(), GetProp() っていつごろからあるんだろう?
これらの関数の存在を最近まで知らなかった
2021/06/12(土) 14:35:57.37ID:oXB7qEBX
>>592
Windows 2000
2021/06/12(土) 15:21:40.84ID:5buAbQHn
>>593
回答ありがとう

HWNDにユーザ定義構造体を紐づけて管理できるのはかなりありがたい。
今まで20年以上知らなかったのは、我ながら恥ずかしい。
2021/06/12(土) 18:39:01.20ID:bymgAWyc
SetProp/GetPropはstd::mapみたいに使えて便利だが、システムやアプリが無断で勝手に使う関係ないデータが交じる恐れがあるから注意。
2021/06/12(土) 19:56:59.39ID:bG62sF4n
>>594
WindowClass.cbClsExtra や WindowClass.cbWndExtra にポインタのサイズを登録しておいて、
::CreateWindow(..., this)
::SetWindowLong()/::SetWindowLongPtr()
::GetWindowLong()/::GetWindowLongPtr()
とかをやる手法は win3.1 からあったと記憶しています

>>593,592
https://docs.microsoft.com/en-us/windows/win32/winmsg/using-window-properties
を初めてみていますが、Window Properties とはどういう概念でしょうか?みたところ上記の api 群が扱うオブジェクトとは違うようですが
2021/06/12(土) 20:53:52.52ID:5buAbQHn
>>596
はい。ご紹介いただいた関数は知ってましたが、
ユーザー定義データをひとつしか登録できないので、使うのを避けてました
598590
垢版 |
2021/06/13(日) 08:15:12.76ID:qn2LXnlL
>>591
>マウスジグラー
こういう製品があるんですね。ご紹介ありがとうございます。
ただ、機能の割にお値段が結構するみたいなので、無線マウスのドングルでも繋いどけばよさそうですね。
仮想マウスドライバの作成も検討してみます。
ありがとうございました。
2021/06/13(日) 14:01:31.30ID:oB3VpSlH
SetCursorでダメなん
2021/06/14(月) 01:35:24.65ID:CyJY6/R2
>>599
SetCursor、ShowCursorを試してみましたがだめなようです。
マウスカーソルがが表示されない状態の簡単な再現方法ですが、
Windows10が入った適当なデスクトップPCにマウス等を繋がずに起動するとこの状態になるようです。
2021/06/14(月) 10:46:03.90ID:wsn+oRmt
GetTickCount()

東京五輪期間中の49日間、在宅勤務を求めた政府に「不吉」の声 - ライブドアニュース
https://news.livedoor.com/article/detail/20359990/
2021/06/14(月) 14:11:06.25ID:u1SE1Un5
もともとテレワークだから関係ないけど
夏期休暇中にバリバリ旅行する予定は入れてるな
ハハハ
603デフォルトの名無しさん
垢版 |
2021/06/14(月) 20:25:26.99ID:wsn+oRmt
49.7日間で終わるのが嫌ならGetTickCount64()を使えばいい
2021/06/14(月) 21:41:37.22ID:hyIjE3NB
今さらだがGetTickCountで四十九日という考え方をしたことないけど、覚え方としてはありか
2021/06/14(月) 21:44:55.35ID:00nQT5bL
95時代から何度もトラブルを起こしている
49日deathと名前が付くぐらいだし
606590
垢版 |
2021/06/14(月) 21:54:18.56ID:CyJY6/R2
次の設定でマウスカーソルが表示できました。

Windowsの設定 → 簡単操作 → マウス → マウスをキーパッドで操作する : オン

または下のレジストリ設定後、一度ログアウトし再度ログオンする。
rem マウスオン
reg add "HKCU\Control Panel\Accessibility\MouseKeys" /v Flags /t REG_SZ /d "159" /f
rem マウスオフ
reg add "HKCU\Control Panel\Accessibility\MouseKeys" /v Flags /t REG_SZ /d "158" /f
レジストリ設定の場合、一度ログアウトが必要なのが解せませんが、これで一応ソフトウェアでカーソルの表示まではできました。
607590
垢版 |
2021/06/14(月) 22:00:24.26ID:CyJY6/R2
なお、ログオフ前もマウスカーソルを表示させたい場合はHKU\.DEFAULTに設定すれば良いようです。
reg add "HKU\.DEFAULT\Control Panel\Accessibility\MouseKeys" /v Flags /t REG_SZ /d "159" /f
とりあえずこれで大丈夫かな?
2021/06/15(火) 20:39:42.52ID:yNzX82gi
>>605
Vistaでいろいろ作り直されたせいで497日になったのが笑えた
当時2008R2動かしてたサーバが引っ掛かりまくったわ
2021/06/18(金) 04:52:47.87ID:G04bvGTj
こんにちは。
C++ でSDIウィンドウを管理するためのラッパークラスを作っているのですが、
正直、継承クラスを作成してウィンドウをカスタマイズするたびに新しい
ウィンドウクラス名を指定する作業が面倒くさいです。当初は

 string SDIWindow::get_wndclass_name() const {return typeid(*this).name();}

このような仮想関数を用意していたのですが、std::typeid::name() の返却値は実装依存で、
空文字すら返すことがあると聞き、ボツ案になりました。どうにかウィンドウクラス名を
自動生成したいのですが、妙案はありませんでしょうか。MFCなどのツールではどのように
名前を付けているのでしょう?よろしくお願いいたします。
2021/06/18(金) 11:13:45.48ID:jgOXgIk3
>>609
自分でMFCヘッダーを探せばいいことを、わざわざ質問すべきではありません
質問を取り下げてください
2021/06/18(金) 19:51:49.70ID:JwPASKzL
>>609
コンストラクタで__func__を使ってみたらどう?
2021/06/18(金) 20:14:25.45ID:Y3n+d/Ne
ATLはオブジェクトのアドレスだったような
613609
垢版 |
2021/06/19(土) 01:33:45.59ID:zlIXB2NK
ご回答くださった方々、ありがとうございます。
__func__ これだ、と思ったのですが、いま使用しているコンパイラが相当古く、
この機能をサポートしていないようです。何かうまい方法がないかもう少し考えてみます。

>>612
自分もオブジェクトのアドレスを利用できないかと考えていたのですが、インスタンスごとに
アドレスが異なると困るのではと思い、保留していました。
2021/06/19(土) 05:54:37.84ID:IUR6A6FI
uid、guid生成すんのがトレンド
2021/06/19(土) 13:13:08.67ID:tbYH3ICf
コンストラクタの呼び出し位置で __FILE__と__LINE__を使った文字列をセットするとか
616609
垢版 |
2021/06/19(土) 15:58:26.49ID:zlIXB2NK
>>614-615
ありがとうございます。
なるほど! __FILE__, __LINE__ の組み合わせは盲点でした。
これなら確かに、オブジェクトとウィンドウクラスを1対1で対応させることができますね。
少なくとも当座はこれでしのげます。
uid、guid 案もありがとうございます。
知識不足のため、勉強してから考えてみたいと思います。
2021/06/19(土) 16:18:13.72ID:BH9bYKW9
ウインドウクラス名は文字列の他にATOMでも指定できる
ATOMはRegisterClass()が返す
2021/07/09(金) 07:17:28.46ID:Qg7nE9lI
dllmainの最初の引数のHMODULEっていうかハンドルと同じ値を取得するwin32apiある?

ライブラリ作ってるけど、dllmain自体をライブラリに含めたくないから困ってる。

dllmainからHMODULEをライブラリに渡せ
みたいな変な規則も出来れば避けたい...
2021/07/09(金) 07:19:48.14ID:If26C/4W
GetModuleHandle(NULL)をキャストしる
2021/07/09(金) 07:50:25.45ID:Qg7nE9lI
GetModuleHandleのNULLは大元の実行ファイルのパス。
そうじゃなくて.dllのパスが欲しい。
その際dllmainの第一引数を使わない形で欲しい。
2021/07/09(金) 08:17:41.20ID:r/5b40UG
んでリンカーでエントリーポイントを自前のにしつつ
コンパイラのスタートアップに渡す過程で hInst をくすねるしかないんじゃないの?
622620
垢版 |
2021/07/09(金) 08:53:28.23ID:Qg7nE9lI
定義関数自身を渡しつつ、リファレンスカウンタを増やすのを回避する以下の形でいけるっぽい。
HMODULE GetCurrentModule()
{
DWORD flags = GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT;
HMODULE h = 0;
::GetModuleHandleEx(flags, reinterpret_cast<LPCTSTR>(GetCurrentModule), &h);
return h;
}
2021/07/09(金) 11:00:40.24ID:r/5b40UG
そのライブラリを利用して
dll を記述するときは dll 自身を指して
アプリケーションを記述するときは実行ファイル自身を指すと

(GetModuleHandle() は、常に実行ファイルを指す)
2021/07/09(金) 12:53:16.14ID:If26C/4W
Module32First でも使えば〜
2021/07/09(金) 16:42:11.88ID:egaI+P/a
>>618
DLLは、アプリと同じ仮想アドレス空間を共有しており、HMODULEの値は、
DLLの PE イメージの先頭アドレスだと聞いている。
そして、DLLは単なる関数の集まりに過ぎないので、「現在のDLL」という
概念が存在しない。
dllmain が呼び出されて、OSに戻るまでの間の時間、現在どの dllmain が呼び出されているか、
という情報なら OSはどこかに持っているはずではあるが。
なお、DLLの関数群は、通常、dllmain が呼び出されている間以外に使うことが原則。
2021/07/10(土) 05:25:42.40ID:fmB/UGP2
dllは現在実行中のdllという概念はあるのでは。
あるからこそ、c++/cliでは簡単かつ確実なものとして提供されてるわけで。
2021/07/10(土) 05:59:03.94ID:fmB/UGP2
あと、現在実行中のニーモニックのアドレスより若い直近アドレスに位置するモジュールのエントリーアドレスであればそれが求めるものだし。
620は関数定義が属するdllのハンドルを得る関数になってるから、実用上問題なく機能するよね。
2021/07/10(土) 06:50:44.17ID:JLp3Oijw
そもそもDllMainのHMODULEを使わないって縛りプレイでのお話でおすし
2021/07/10(土) 09:10:30.89ID:e+Cu97LZ
>>626
そういう概念は無い。
dllmain() は、DLL が最初にロードされたとき、スレッドが開始するとき、
及び、それらの終了する時に呼び出されるエントリ関数に過ぎない。
2021/07/10(土) 09:18:08.53ID:CnbTxKRZ
>>618
> ライブラリ作ってるけど、dllmain自体をライブラリに含めたくないから困ってる。

そういのだとリンカーとかの話で、APIでどーとかってのとはまた違うような
2021/07/10(土) 09:39:49.89ID:e+Cu97LZ
>>629
[補足]
「現在ロード中で使用中の DLL」
という概念ならある。
2021/07/10(土) 09:41:14.25ID:e+Cu97LZ
>>621
[補足2]
2つ以上のDLLを使用中の場合は、その内のどのDLLのどの関数が今まさに「実行中」か
どうかは、OSレベルでは管理されてないという意味で言っている。
2021/07/10(土) 09:41:47.91ID:e+Cu97LZ
>>632
>>631 へのアンカーミスだった。スマン。
2021/07/10(土) 09:43:15.11ID:MJuwQyYP
tool help 32
2021/07/10(土) 11:50:04.86ID:fmB/UGP2
いや実行中のステップがどのdllかという概念はあるよ。
あるからデバッガでも今の瞬間実行中のステップがどの.dllのどのアドレスかまでわかってるわけで。
2021/07/10(土) 11:56:56.14ID:6bm+w6Lu
>>635
それをOSが管理してるか?って話だろ
2021/07/10(土) 12:01:47.23ID:fmB/UGP2
各々dllのベースアドレスは管理してるんだから、管理してるだろ。
管理してるかはdllは解放されるんだろ?
ベースアドレスからファイル名が辿れるから何のファイルか解るようになってるんやないか。
だからぶっ飛ぶとシステムログに飛んだdll名が明記されるやないか。
2021/07/10(土) 13:28:51.32ID:nAGZi/ZP
本当に飛躍した話が好きだよなおまえ達は
2021/07/10(土) 13:41:35.94ID:fmB/UGP2
GetModuleHandleExの仕様をみればOSの管理下にあるのわかるじゃん。

2番目の引数には。モジュールのパスでもよいが、
「モジュール内の任意のアドレス」でもいいわけ。
即ち今プログラムでましに実行中位置であるEIPレジスタやRIPレジスタの値から
dllなりexeなりのハンドルがとれると書いてあるわけで。
もちろんハンドルがとれるからファイルのパスもわかる。

管理下になかったらどうやって取れるんだってのw
2021/07/10(土) 14:24:30.76ID:aRchcoDj
ReactOSでGetModuleHandleExWをたどってみると次のようになる:

https://github.com/reactos/reactos/blob/master/dll/win32/kernel32/client/loader.c#L866
https://github.com/reactos/reactos/blob/master/dll/win32/kernel32/client/loader.c#L716
https://github.com/reactos/reactos/blob/master/dll/win32/kernel32/client/loader.c#L767
https://github.com/reactos/reactos/blob/20c1da7963debb69a46cf9f19f3e4c5e504c7fc9/ntoskrnl/rtl/libsupp.c#L34
https://github.com/reactos/reactos/blob/3fa57b8ff7fcee47b8e2ed869aecaf4515603f3f/ntoskrnl/ke/bug.c#L41

PLDR_DATA_TABLE_ENTRY構造体でプロセスの空間を保持しているようだ。
2021/07/10(土) 15:12:39.28ID:fOJ6OsHP
>>637
> 各々dllのベースアドレスは管理してるんだから、管理してるだろ。
それは
>> 「現在ロード中で使用中の DLL」
2021/07/10(土) 15:26:13.52ID:fmB/UGP2
でも結局CPUの命令アドレスからdll名を求められるから、
今CPUが実行中のdllやexeはOSが管理してるし、それ用のwin32apiも提供されている、であってるやん。
2021/07/10(土) 15:45:03.11ID:iYY30g0K
どこを実行中かをOSが管理してるなら、暴走なんてせんわな
デバッガはbreakしたらやってるだけ
2021/07/10(土) 16:12:20.61ID:6bm+w6Lu
>>642
dllを実行中かなんて管理してないぞ
単にスタックの戻りアドレスから.dll検索してログに書き込んでるだけ
2021/07/10(土) 16:44:08.48ID:fmB/UGP2
プロセス単位でexeやdllのアドレスを簡易的に言えば配列のように保持してて
あとはEIPが配列のインデックスであるかのように実行時に動くだけだから管理できてるじゃん。

indexに幅があるってだけでしょ。
2021/07/10(土) 17:41:11.37ID:fOJ6OsHP
>>645
OSはEIPを管理なんてしてないぞ
そもそもぶっ飛んだ時に関数レベルのスタックトレースができるからと言ってOSがどの関数を実行してるかを管理してるとでも言うのか?
2021/07/10(土) 17:43:28.93ID:plgO0oJb
激重OSになりそう
2021/07/10(土) 18:58:44.17ID:fmB/UGP2
いったいいつ関数の話になったんだ。
EIPからいつでもモジュールを辿れる形でプロセス情報を保持してるから管理されてると言ってるんだが。

プロセス情報を保持してないなら管理してないと言えるが。
2021/07/10(土) 19:18:42.88ID:fmB/UGP2
管理されてるを監視してるに勝手に脳内で置き換えてないやろな?
2021/07/11(日) 00:19:00.34ID:5nx6GB9W
でそれを取得するAPIは?
2021/07/11(日) 03:01:15.31ID:OgOa7vqd
管理されているというより、EIPアドレスから逆算しているという感じだね。
実行中のマシン語の命令のアドレスが分かれば、リンク時のマップファイルのような
情報があれば、どの関数の中のマシン語かまで分かるから。
2021/07/11(日) 03:07:37.40ID:OgOa7vqd
どの人がどこにいるかを国は普段は追跡してないけど、科学捜査すればどこにいるか
分かることが多いと言う意味で、「管理はしてなくても見抜くことは出来る」
のと同様の事。
2021/07/11(日) 03:11:46.75ID:OgOa7vqd
>>649
各DLLがロードされている場所のアドレス範囲とEIPさえあれば、そりゃ、どのDLL
にいるかは分かるけれど、それは管理とは言わないと思うな。
マシン語で、jmp アドレス、call アドレス で、1クロックですぐに EIP = アドレス
になるが、それをOSはいちいち追跡も管理も全くしていない。だから、
現在どのDLLの関数を実行中かをOSは情報としては持ってない。
ところが、EIPの値からどのDLLの中を実行中かを「逆算」することが可能と言うだけ。
2021/07/11(日) 03:17:09.08ID:OgOa7vqd
プログラミングの世界で「管理」というのは、
struct SomeInfo {
 int curDllIndex; // 現在実行中のDLLのインデックス番号(0-)
};
のようなデータ構造があり、idx1 という番号の DLL の中の関数を呼び出すときに、
プログラムで curDllIndex = idx1 にちゃんと書き込む、ということをイメージする。
このような意味での書き込みは行われてない。
2021/07/11(日) 03:24:26.40ID:OgOa7vqd
OSに管理されているのであれば、idx1 番の DLLから、main モジュールの関数 f()が
コールバックされたような場合でも、どのDLLから呼び出されたかまで分かるはずだが、
現実にはEIPは、f()の中をポイントしているから EIP だけからは、idx1 を逆算する
ことは不可能。
デバッガが出来てしまうのは、デバッグしやすい様にコンパイラが
「スタックフレーム」という構造が出来るようなコードをわざと作っているから。
その構造によれば、スタックとEBPの値で呼び出しもとの関数の履歴を全て辿って
いける。
しかしこれは、OSが管理しているのではなく、デバッグ版ではそのようなコードを
コンパイラが生成しているからに過ぎない。
リリース版では効率向上のためスタックフレームが省略されることもあり、その
場合は呼び出しもとの関数が辿れなくなるので idx1 という番号を算出することは
原則的には出来なくなる。
2021/07/11(日) 03:33:02.64ID:OgOa7vqd
>>655
[補足]
スタックフレームは、「ユーザーランド」のアドレス空間に構成された構造で、
OSが「管理」する「システムランド」のアドレス空間にはない。
前者はプログラムに誤りが有ると壊れることがあるし、コンパイラのオプション次第
で省略されることもあるから、いつでも存在するわけでも無いし、いつでも正しい
訳でもない。
その意味で、OSの管理する構造ではない。
2021/07/11(日) 03:48:47.46ID:NwP/aFzk
Tool Help Library ぐらいは調べて
から書きたまえ。
2021/07/11(日) 07:22:23.17ID:k3ZSGeVZ
>>657
オタクが調べて書けばいいんじゃね?
何を書きたいのか知らんけどw
2021/07/11(日) 09:13:47.20ID:NwP/aFzk
とっくに書いてるよばーか
2021/07/11(日) 09:20:59.49ID:LL6sPKEi
「管理」の定義が独り歩きしているがもともとは>>629-632だろ?
その意味では「管理」されているでいいんじゃね?
2021/07/11(日) 10:40:25.91ID:cuQ6hQba
>>659
どこに書いてあるのかレス番示して引用してみ
どうせ逃げるなら速い目に頼むw
2021/07/11(日) 10:42:50.54ID:cuQ6hQba
>>660
それに対する>>635がおかしいって言われてるんだろ
2021/07/11(日) 10:50:14.49ID:f8Vvx+nx
これは話をループさせる手段なのか?w
2021/07/11(日) 11:20:11.96ID:zTx2mwKY
「Hacking: 美しき策謀 」ぐらいは読んでこいよ
2021/07/11(日) 11:49:37.25ID:OgOa7vqd
本当に管理されていると言うのなら、別のlibで定義されている
HMODULE get_this_dll_module();
という関数によって、あらゆるDLLのHMODULEを取得できるようになるはずで
あるが、この関数は、スタックフレームを前提にしない限りは基本的に
作ることが出来ない。なぜなら
void get_this_dll_module() {
 // ここの EIP の値は、呼び出しもとの DLL のものとは違っている。
}
からである。
2021/07/11(日) 11:51:10.61ID:OgOa7vqd
>>665
誤: void get_this_dll_module()
正: HMODULE get_this_dll_module()

EIPのアドレスは、簡単に変わりうるものなのだ。
667デフォルトの名無しさん
垢版 |
2021/07/13(火) 12:38:32.06ID:WUJYnH4r
だらだらしてるので
3行でまとめてくれ
2021/07/13(火) 12:47:15.46ID:oy1AsII3
>>667
現在の関数からその関数が格納されているDLLのパスまで取得できる情報があることを
OSが管理していると呼ぶかどうかで
外野がうんこの投げ合いをしている
2021/07/13(火) 13:19:09.51ID:bYykchBX
そういうのは動物園でやれよ
2021/07/13(火) 13:50:43.04ID:EtxXgsUj
無駄な議論ではなく、質問者が、現在実行中の関数の所属する
DLLを正確に取得する方法があると思い込んでいた可能性があるので
大事な指摘だった可能性がある。
結論から言えば、安定してそれを取得する方法は無い。
2021/07/13(火) 14:46:12.78ID:imApokgP
質問者は普通に安定した方法で自己解決していったな
2021/07/13(火) 16:28:34.84ID:NGIJbx4Y
get_this_dll_moduleてなんなんってぐぐったら
このスレが引っかかってわろた
脳内の関数だったか
2021/07/13(火) 17:47:39.31ID:QuGmZAoV
未解決のせいで盛り上がってたのかと思ったら>>622で解決してたのか
2021/07/14(水) 20:59:18.35ID:bf5Y3F+J
>>620
他のこと調べてたら見つけたけど__ImageBaseって変数のアドレスがまさに目的そのものっぽいわね

https://devblogs.microsoft.com/oldnewthing/20041025-00/?p=37483
2021/07/14(水) 21:06:59.94ID:v50kRHgT
「D:\aaaa\bbbb」などの、ファイルやフォルダのパス名から、
そこがCDやDVDなどの光学ドライブかを判定する仕組みはありますか?
2021/07/14(水) 21:11:04.17ID:DOxWmp+E
GetLogicalDriveStringsかな
2021/07/14(水) 21:13:56.34ID:DOxWmp+E
途中送信ごめん

全ドライブ文字と種類がわかるから
後は比較するオレオレ関数作る感じ
2021/07/14(水) 21:15:40.83ID:DOxWmp+E
何度もごめん

種類はGetDriveTypeね
2021/07/14(水) 21:36:03.70ID:v50kRHgT
>>678
ありがとうございます。
GetDriveTypeは、"D:\"の3文字の部分しか渡せないようですが、
PathGetDriveNumberでも使えば、"D:\"の部分だけを作れそうですね。
2021/07/15(木) 01:52:58.00ID:0fB1tPL7
リッチエディットに複数行の文字列をプログラムから定期的に送って全内容を更新するプログラムを作成しています。
更新中は垂直スクロールバーで任意の行に移動できるようにしています。
コードは下記です。

LRESULT Line = SendMessage( hEdit, EM_GETFIRSTVISIBLELINE, 0, 0 ); // 現在の表示行を控えておく

SendMessage( hEdit, WM_SETREDRAW, FALSE, 0 ); // 文字列更新中の状態が露呈しないよう再描画を抑制する

SetWindowText( hEdit, str ); // 全文字列更新

SendMessage( hEdit, EM_LINESCROLL, 0, -INT_MAX ); // 表示行を一番上に移動する
SendMessage( hEdit, EM_LINESCROLL, 0, Line ); // 表示行を、控えておいた位置に移動する

SendMessage( hEdit, WM_SETREDRAW, TRUE, 0 ); // 再描画再開

InvalidateRect( hEdit, NULL, FALSE ); // 表示を促す

これで、ある程度までの行数の文字列であれば、意図通りの挙動となるのですが、
行数が多くなってくると、動かしていたスクロールバーが一瞬一番下まで下がってから
元の位置に戻るという現象が文字列更新の度に起こります。
ただ、リッチエディット内の表示位置は、動かしていたスクロールバー位置に対応する位置のままで、
スクロールバーが一瞬一番下がる動きとは連動しません。

一体何が起こっており、どのようにすれば回避できそうでしょうか?
2021/07/15(木) 09:58:52.50ID:ux6gJq+a
もしかしてそれって32767行くらい超えてから?
682680
垢版 |
2021/07/15(木) 12:02:49.75ID:0fB1tPL7
>>681
改行文字(\n)だけの80行くらいでも発生しました。
そして>>680の内容に訂正があります。
>動かしていたスクロールバーが一瞬一番下まで下がってから
は、一番下までは下がっていませんでした。
また、下がったときはバーが長くなっており、
あたかも行数が少なくなったかのよう(エディット内の表示は意図通り)な挙動です。
さらに、以下のような性質も分かりました。

・スクロールバー位置が一番上のときは一瞬下がる症状が発生しない
・スクロールバー位置が一定より下になると一瞬下がる症状が発生しない
 ・この位置は全体行数とリッチエディットの縦幅との関係によって変わり、
  スクロールバーの長さが全体の大半を占める場合はどの位置でも発症しなくなる
2021/07/15(木) 13:08:28.58ID:ux6gJq+a
>>682
キャレットが画面外にあるか画面内にあるかで挙動は変わったりする?
2021/07/15(木) 13:18:19.61ID:dBy6yJWz
一口にリッチエディットっていってもバージョンが4種類くらいあって
それぞれ微妙に動作が違ったような気がする
685680
垢版 |
2021/07/15(木) 14:06:57.14ID:0fB1tPL7
>>683
文字列更新前にキャレットが画面内にあるか画面外にあるかで挙動に変化ありませんでした。

>>684
リッチエディットのバージョンはv2.0(UNICODE)です。
2021/07/15(木) 15:02:56.70ID:GxcfqrJG
特定プロセス(PID)のアドレス空間の情報を取得するAPIはありますか?
687デフォルトの名無しさん
垢版 |
2021/07/15(木) 15:17:12.92ID:ygp86UHP
スクロールバーの描画も同時に禁止するとか
スクロール範囲の最大値も強制的に変更してから描画再開するとか
2021/07/15(木) 15:39:38.74ID:SuupqHo1
>>685
キャレットが画面内でも外でも
おかしな症状が発生するかどうかは>>682の条件って事?
689680
垢版 |
2021/07/15(木) 16:21:18.89ID:0fB1tPL7
>>687
スクロールバーのハンドルを取得する方法が分からなかったので、
テキスト&スクロールバー位置更新時、ダイアログ全体の再描画を抑制してみましたが、
再描画がかかるタイミングでやはりスクロールバーが一瞬動きます。

スクロール範囲の最大値もテキスト更新前に控えておいた数値を、テキスト更新後に設定しましたが変わらずでした。

>>685
はい、>>682の条件です。


進展がありました。
SetWindowText()でテキスト更新をしていた部分を

SendMessage( hEdit, EM_SETSEL, 0, -1 );
SendMessage( hEdit, EM_REPLACESEL, FALSE, ( LPARAM )str );

と置き換えたところ、
スクロールバーを動かしても、その後、一瞬下に動くといったことがなくなり、
期待通りその場に留まり続けてくれました!
しかし、ダイアログのフォーカスを外した後、再度フォーカスを得ると、一番下に飛んでしまいます・・・。
惜しい・・・。

フォーカス取得の際、スクロールバー位置が更新されるものと思われますので、
そのときのウインドウメッセージを捕えて、テキスト更新時と同様にスクロールバー位置を制御すればいけるかもです。
2021/07/15(木) 16:33:06.78ID:t/RIbQSu
>SendMessage( hEdit, EM_LINESCROLL, 0, -INT_MAX ); // 表示行を一番上に移動する
>SendMessage( hEdit, EM_LINESCROLL, 0, Line ); // 表示行を、控えておいた位置に移動する
これで振動してるような気もする

フォント高さ x 行数 と クライアント領域の高さが不一致な状態で
SetWindowText() で更新したとき、クライアント領域内の先頭行側が欠けて 最終行側がきっちり見えてるんだけど

上の2行の変わりに
 SendMessage( hEdit, EM_LINESCROLL, 0, 0);
を投げると先頭行がきっちり収まる位置にきて、スクロールバーがピコピコすることもない雰囲気
2021/07/15(木) 17:34:53.12ID:SuupqHo1
>>689
ダイアログカヨ

WM_ACTIVATEが悪さしてるとかない?
2021/07/15(木) 18:00:01.33ID:P7zOCeng
WM_VSCROLL.SB_TOP使った方がいいんじゃね?
2021/07/15(木) 18:23:17.10ID:L0wYNjuD
>>680
>SendMessage( hEdit, WM_SETREDRAW, FALSE, 0 ); // 文字列更新中の状態が露呈しないよう再描画を抑制する
↑は、RichEditControl のメッセージではなく、Win32のWindow一般のものらしい。
但し、MSDNには、ListBoxで複数のアイテムを追加するときに便利だと書いてある。
質問者の実験を聞く限り、RichEditControlにのみこのメッセージを送っただけでは、
そこにくっついているスクロールバーに対しては効果が無いようだ。
2021/07/15(木) 18:45:09.69ID:L0wYNjuD
Rich Edit Control を作成する時のスタイルに
WS_VSCROLL
を付け、
ES_DISABLENOSCROLL
を付け、
ES_AUTOVSCROLL
を外すと縦スクロールバーが出るが、勝手に制御されにくくなるかも。
2021/07/15(木) 18:49:18.52ID:L0wYNjuD
WM_SETREDRAWは、ListBoxに関しては色々語られている:
https://devblogs.microsoft.com/oldnewthing/20110124-00/?p=11683
2021/07/15(木) 18:55:04.61ID:L0wYNjuD
SendMessage( hEdit, WM_SETREDRAW, FALSE, 0 );
は効果は有るにはあるが、アプリ側が自らスクロールバーを制御するようなメッセージを
Rich Edit Control に送った場合、↑の設定が無視されて、スクロールバーの描画が
起きてしまっている可能性がある。なので、
>SendMessage( hEdit, EM_LINESCROLL, 0, -INT_MAX ); // 表示行を一番上に移動する
>SendMessage( hEdit, EM_LINESCROLL, 0, Line ); // 表示行を、控えておいた位置に移動する
の部分、上の行を省いて、下の行だけにするとちらつかなくなる可能性が高い。
また、上の行の役割の代わりとして、カーソルの位置はスクロールの位置とは別に制御すると良いはず。
697680
垢版 |
2021/07/16(金) 01:36:18.95ID:iUp23Wxq
>>690
EM_LINESCROLLは現在位置からの移動を指示するので、
SendMessage( hEdit, EM_LINESCROLL, 0, 0);
だと何も作用がありませんね。

>>691
>>689の処理ですが、WM_ACTIVATE後、次のテキスト更新までの間に、スクロールバーが一番下に移動する動きが確認できました。

>>692
SB_TOPで一番上に戻しても症状は同じでした。

>>693
再描画抑制をしないと、テキスト更新の際の過渡的な状態が露呈し、スクロールバーも一瞬動くのが見えたりするのですが、
再描画抑制により、これらが露呈しなくなるので、スクロールバーにも効果があるようです。

>>694
試してみましたが症状変わらずでした。

>>695
英語が苦手で完全には理解できないのですが、
再描画抑制解除後のWM_PAINTあたりでスクロールバー位置が更新され動いてしまうということがあり得そうですね。

>>696
上記の通り、
EM_LINESCROLLは現在位置からの移動を指示するので、
SendMessage( hEdit, EM_LINESCROLL, 0, Line );
だと下に動き続けてしまいます。


試しにリッチじゃないエディットボックス(MultiLine有効)に置き換えたところ、すんなりいきました。
前にも試したことがあったんですが、リッチエディットが\nだけで改行されるのに対し、
エディットボックスでは改行されなかったのでダメだと思っていました。
本日、エディットボックスの場合は\r\nで改行されることを知り、これでうまくいきました。
\rが増える分、更新(転送)する文字量が増えてしまいますし、その他、リッチエディットとは異なり、
・ReadOnlyだと背景がグレーになる(審美的にはリッチエディットのような白が好ましい)
・表示矩形内に文字が収まっていてもスクロールバーの枠が表示される
・表示がたまにチラツく
といった気になる点があるのですが、不安定なスクロールバーに比べたら許容範囲です。

多数のご助言をいただき、ありがとうございました。
2021/07/16(金) 01:48:03.35ID:5FJrAAJE
どうでもいいけどWin32とかの文字列の型名わかりずらすぎて嫌がらせとしか思えない
なんだよLPCTSTRってconst wchar_t*でいいだろ
2021/07/16(金) 11:06:31.00ID:rEsqDZWm
それだとLPCWSTRでは
2021/07/16(金) 11:36:36.57ID:teDb7k99
スカラ値へのポインタではなく配列先頭アドレスですよという意図は一応あるのかもしれない
701デフォルトの名無しさん
垢版 |
2021/07/16(金) 11:42:16.54ID:5FJrAAJE
>>699
はにゃ?
https://imgur.com/a/1pn6Inx
2021/07/16(金) 11:57:18.77ID:teDb7k99
UNICODE マクロが定義されていればそれはそう
2021/07/16(金) 11:58:40.86ID:wMimqxZO
Tがつく奴はUNICODEの定義の有無でwchar_tかcharに変わるから
2021/07/16(金) 13:31:01.23ID:rEsqDZWm
>>701
そもそも全部wchar_tでいいって事なら
TじゃなくてWでいい
2021/07/16(金) 14:39:23.11ID:qFBlhvM+
UNICODE対応とはいわばUTF8に対応していると思っている僕がかつて居ました
706デフォルトの名無しさん
垢版 |
2021/07/16(金) 16:32:41.77ID:6/LQ7Fle
いまどき -D_UNICODE せんやつはおらんよな?よな?
2021/07/16(金) 17:34:41.64ID:AYv25WJv
>>706
>いまどき -D_UNICODE せんやつはおらんよな?よな?

自分はここしばらくWindowsのプログラムから離れてるんで、思い違いしてるかもしれんが・・・
いまどきはWindows10のワールドワイド言語サポートを使ってアプリ内部・外部入出力ともUTF-8にするんじゃないか?
2021/07/16(金) 17:54:02.54ID:kcNPB8fl
_UNICODEはWin32APIがUTF-16版かどうかの話なんでアプリは好きにやりゃええねん
2021/07/16(金) 17:58:18.04ID:uF0JvJPV
>>707
VC付属のCライブラリがUTF-8に完全対応してない
ファイルオープンで積む
VCの対話デバッガも変数のUTF-8テキストビューに対応してない
2021/07/16(金) 18:27:58.18ID:uF0JvJPV
失礼、積むではなく詰むだった
2021/07/16(金) 19:08:27.97ID:tbXedaSH
ビジネスが破綻する大半の原因は、 ”ビジネスを始める人の大半が、真の意味での
「起業家」ではなく、 起業したい、という熱に浮かれた「職人」として働いているに過ぎない。”
という事実にあります。
「職人」によって運営されているビジネスは、ビジネスが働くのではなく、彼ら自身が毎日働くこと
によって、成り立っています。
彼らは毎日、自分がやり方を知っている仕事を一生懸命にこなしていますが、「起業家」としての
視点が無いために、成長に限界が生まれます。
そして、生計を立てるために、彼ら自身がずっと働き続けないとならないのです。

誰もが必ず陥る罠
私が見ている限り、起業熱にうなされる人たちは、必ずと言ってもよいほど誤った
「仮定」を置いてしまうようだ。実は、のちに彼らが苦難の道を歩むことになるのは、
この、「仮定」が致命的に間違っているからなのである
致命的な仮定とは・・・「事業の中心となる専門的な能力があれば、事業を経営する能力は
十分に備わっている」ということである
私がこの仮定を致命的だと書いたのは、この仮定が間違っているからにほかならない
事業の中で専門的な仕事をこなすことと、その能力を生かして事業を経営することは
全く別の問題である。高い専門能力を持つ人にとって、独立は他人の為に働くという苦痛から
解放されるということを意味していた。それにもかかわらず、前提となる「仮定」が致命的とも
いえるほど間違えているために、彼らは自由になるどころか、自分が始めた事業に苦しめ
られるようになってしまうのである
マイケルEガーバー「はじめの一歩を踏み出そう」P28~29
2021/07/27(火) 13:44:15.34ID:y9fA4YVt
Windows用のMFC製のアプリをシェアウェアとして公開するのに、
Vector以外に良いものは無い?
Vectorは作者登録の手順がとてもメンドクサイ。
写真を送ったりとか、作者にばかりプライバシーや個人情報を負担させる仕組み。
2021/07/27(火) 14:41:02.45ID:sR0km73W
色々書こうかと思ったけどスレ違い
714デフォルトの名無しさん
垢版 |
2021/07/27(火) 16:09:06.09ID:Dog97Bpd
窓の杜
2021/07/27(火) 16:48:35.67ID:LLIxYIVW
>>712

>作者にばかりプライバシーや個人情報を負担させる仕組み。
ソフトウェア等のダウンロード販売は、
特定商取引法に基づいて住所や氏名(法人名)等の公開が必要

>Vector以外に良いものは無い?
自分のHPにアップしてReadMeに振込先等書いとけば?
2021/07/27(火) 18:12:55.62ID:4Be/pZ1T
>>715
Vectorのシェアレジって、作者の住所が公開されるんだっけ?
それは困るな。
2021/07/27(火) 18:24:12.75ID:M3obGnf2
こういうのとかは?
ttps://blog.okazuki.jp/entry/2018/10/04/160349
2021/07/27(火) 18:40:47.67ID:4Be/pZ1T
>>717
マイクロソフトストアに登録するためにMFCを変換しなくてはいけないらしくて
そのやり方がめんどうくさそう。
どうすればいいのかよく分からない。
2021/07/27(火) 18:44:25.23ID:4Be/pZ1T
インストーラー作りに2ヶ月くらいかかりそう。
なんのためにそんな必要が。
2021/07/27(火) 18:45:21.80ID:M3obGnf2
MFCメインアプリを起動するためだけのUWPランチャアプリでも登録すればワンチャン?
2021/07/27(火) 18:55:07.32ID:klQCV9Qk
金のためちゃうの
2021/07/27(火) 19:06:58.56ID:4Be/pZ1T
ヤフオクでデータやパスワードを売ることも出来るらしいけど、
一回登録したら100人でも1,000人でも売れるようにすることは出来ないのかな?
そもそも、1000人分を「商品」として一度に登録できるのだろうか?
2021/07/28(水) 15:46:01.54ID:RWVJ8OqO
Windows 11のストアで配布する
あれって何でも配布できるようになるんだっけ??
2021/08/18(水) 23:54:37.99ID:aABRWXP6
以下のようにテキストログファイル名を変更してそれを読み出す処理があるのですが
fopenでNULLが返ってくる事があり、GetLastErrorで得られるエラーコードは0x00000020で
「プロセスはファイルにアクセスできません。別のプロセスが使用中です。」
となります

自アプリだけが吐き出して使うログファイルでプロセスの多重起動もしておらずシングルスレッドで、
そもそもMoveFileで成功が返ってきているのに直後のfopenでエラーになる原因が見当付きません

unlink(dst_path);
if (MoveFile(path, dst_path)) {
  fp = fopen(dst_path, "rt");

苦し紛れにMoveFileの部分を
if (rename(path, dst_path) == 0 && PathFileExists(dst_path)) {
とやってみたこともありますが、やはりfopenでエラーになることがあります

毎日10時間以上稼働していて今年累計で13回ほどのエラーで低確率すぎるのと対策が思い付かなくて困っています
原因と可能性について助言頂けませんでしょうか
2021/08/19(木) 01:01:43.70ID:Dgde8QnE
>>724
ウィンドウズは、裏でシェルの変更通知やウィルススキャンやフックなどが動いてたりするんだよね。

それでファイルの確実な処理をしたいと言うことなら、処理を見直す必要がある。MoveFileを一つの処理と思ってるなら間違いだ。実際にはコピーした後で削除している。

【現在の処理】
Dを削除。
SをDに移動(実際はSをDにコピーしてSを削除)。
Dを読み込み。

【提案】
SをDに上書きコピー(CopyFile/CopyFileEx)。
Sを読み込む。
Sを削除。
2021/08/19(木) 01:26:06.58ID:EXq1UPUJ
>>725
>実際にはコピーした後で削除している。
それは異なるドライブの場合だろ?
同じドライブの場合はファイルシステムの書き換えだけのはずだろ
2021/08/19(木) 03:06:16.65ID:2X4o3WxG
>>725-726
レスありがとうございます
質問が長くなったので要点を絞り込んだつもりでしたが、もう少し追記させていただきます

dst_pathはpathの拡張子のみを変更したものですので、同じドライブ・フォルダになります
また、MoveFileの仕組みは仰るような仕組みで理解しているつもりですが、renameでも解決しないのが理解に苦しむところです
(といってもrenameの実装がどうなっているのか知らないのですが)

この処理で行っていることは、テキストログ中の不要な行を削除したいということで、

【現在の処理】
Dを削除。
SをDに移動(実際はSをDにコピーしてSを削除)。
Dを読み込みながら、Sに新規書き込み(削除したい行を読み捨てながら)。

という単純なことを行っていますのでご提案そのままではだめですが

【修正案】
Sを読み込みながら、Dに新規書き込み(削除したい行を読み捨てながら)。
Sを削除。
DをSにリネーム(MoveFile/rename)。

が思い付くのですが、そうするとSを書き込んでいるところ(全く別の場所ですが)で
もしかしてエラーが出るようになるのではという不安があります

いっそのことMoveFileの代わりになるものを自分で作ることも思い浮かびますが、
そもそも論として今回のような処理でここまでするものなのか?
という疑問と疑心暗鬼に陥っています
2021/08/19(木) 09:56:10.36ID:SzZ4tH6X
原因についてはわかりませんが。。。
MoveFile()代替として、ハンドル開いた状態でファイル名を変更する場合にはSetFileInformationByHandle()を使用する。

HANDLE h =CreateFileW(srcfilename, GENERIC_READ| GENERIC_WRITE| DELETE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
size_t fri_size =sizeof(FILE_RENAME_INFO)+(wcslen(dstfilename)+1)*sizeof(wchar_t);
FILE_RENAME_INFO *fri =(FILE_RENAME_INFO *)malloc(fri_size); memset(fri, 0, fri_size);
wcscpy(fri->FileName, dstfilename);
fri->ReplaceIfExists =TRUE;
fri->FileNameLength =(DWORD)wcslen(dstfilename);
fri->RootDirectory =NULL;
BOOL res =SetFileInformationByHandle(h, FileRenameInfo, fri, (DWORD)fri_size);
free(fri);
CloseHandle(h);
2021/08/19(木) 18:37:22.67ID:STngTfXn
>>724
fopenでのエラーを調べるならGetLastErrorじゃなくてerrnoじゃないかな?
2021/08/19(木) 21:29:03.55ID:kB3hjHkq
>>724
カーネル内でのリソース開放は即座に行われるとは限らない。
お触りしたプロセスがいなくなった後でもカーネルの中で残ることがある。
この場合は成功するまでfopen()するしかないね。
2021/08/20(金) 01:37:15.55ID:irg7D4zd
皆さんありがとうございます

>>728
対象ファイルがテキストファイルで一行ずつの処理のため、CreateFile系では
fgets系のAPIがないのでそこまで自作する必要がある点で最終手段として取っておきたいと思います

>>729
内部でWin32APIを叩いているイメージがありましたが、確かに言われてみればerrnoを使うべきですね
そのようにしてみます
2021/08/20(金) 01:39:08.93ID:irg7D4zd
>>730
本件とは別件で新たな質問になってしまいますが、

プロセスAでファイルAをunlinkで削除
WM_APPを別プロセスBにPostMessageで通知
プロセスBでファイルAを再作成(プロセスBが起動していなくても、起動時にファイルAが無ければ再作成)

という箇所があるのですが、要するにキャッシュファイル的なものを削除して別プロセスで再作成を指示するようなことをしています
ここも稀に(?)再作成で失敗することがあるので気になっていました

Windowsプログラミングにおいて、ファイルの削除や移動についてはその後ウェイトを挟むか、
ファイルの作成でエラーが出たらリトライを入れるというのは常識的なものなのでしょうか?
2021/08/20(金) 07:19:25.62ID:BD3SOXSp
確実に作りたければ、中間ファイル作るやろ
2021/08/20(金) 07:42:41.01ID:T1KE4JYK
まーた覚え立ての言葉使いたがる子供が
735デフォルトの名無しさん
垢版 |
2021/08/20(金) 09:25:06.01ID:Swd1/18e
>>732
常識って人それぞれだからなあ...
エラー終了して使用者に丸投げするか、どこまでリトライするか、
ウエイトするのかリトライするのかはプログラムの次第だし...

今回の件のように、直前に誰かがお触りしてるのが
確実なのであれば、リトライするかウエイト入れるのが
確実だと思うよ。
736デフォルトの名無しさん
垢版 |
2021/08/21(土) 10:35:42.11ID:+K/WXdke
>>724
closeしてないやん?
737デフォルトの名無しさん
垢版 |
2021/08/21(土) 10:38:21.22ID:+K/WXdke
>>731
CreateFile したハンドルを FILE * に変換したら fgets 使えるが
738デフォルトの名無しさん
垢版 |
2021/08/21(土) 10:40:30.17ID:+K/WXdke
>>732
>Windowsプログラミングにおいて、ファイルの削除や移動についてはその後ウェイトを挟むか、
>ファイルの作成でエラーが出たらリトライを入れるというのは常識的なものなのでしょうか?

根本的な思い違いをしているに一票
2021/08/21(土) 11:38:33.02ID:ssXITtrX
>>736
>>724がfcloseしていないというならそもそもfopenしただけとも言えるわけで説明のために以降は省いているってわかると思うんだが
そもそもが閉じ忘れならMoveFileも失敗するだろう
2021/08/21(土) 12:28:01.97ID:FhcAlSkM
>>737
せやな

_osfhandleとかfdopenをキーワードにggr
2021/08/21(土) 12:54:10.92ID:JKiZ0yss
そこまでせんでもcreatefileしたハンドルで移動してから一旦閉じてfopenでよくね?
2021/08/21(土) 14:27:27.29
再現できる簡単なソースは公開可能ですか?
2021/08/21(土) 21:53:40.08ID:dwXwyCwb
>>741
今回の問題は、いったん閉じてもカーネルが握ってるのでfopen()できないって話で
2021/08/22(日) 12:32:08.06ID:fq28dqqO
>>743
だからMoveFileを代替しても同じやんって話で
2021/08/22(日) 14:46:53.71ID:HtdC9XOd
MoveFileEx「あのっ」
2021/08/22(日) 16:25:47.23ID:44Fq7Iy0
論理的に考えれば「カーネル」が
握るわけ無いだろう。
ゴルフか麻雀でもしているののか
2021/08/22(日) 16:40:10.74ID:oA0Vr62Q
ロクに質問読まずにというか理解せずにレスしてる馬鹿は何なの
2021/08/22(日) 17:05:53.52ID:kaETDw8p
747の同類かと
2021/08/22(日) 18:03:47.50ID:3exyu3cG
>>732
環境依存なことを考えて戻り値確認するのは別にWindowsに限らないし、戻り値が正常でも外部デバイス相手だとドライバ次第なこともある
別件で、組み込みWindowsでユーザがアプリが正常終了してすぐに電源コード引っこ抜くから
キャッシュがHDDに書き込まれずに消えるって事例はあったな
2021/08/23(月) 07:47:18.19ID:klNpYQV6
>>749
NAS関係でOK出ているのに書き込まれて
いないってのはあったな
751デフォルトの名無しさん
垢版 |
2021/08/25(水) 19:50:31.67ID:s4bO6YKI
LoadLibraryとかGetProcAddressしたものは
必ずFreeLibraryしないといけませんか?
自分のプロセスが必ず終了するときにFreeLibraryせずに放置しても勝手に解放される?
2021/08/25(水) 20:26:18.34ID:TCNLfe6z
>>75
されるわけないだろ
OSがナイナイしてくれるだけ
2021/08/25(水) 21:58:54.28ID:ENQvEefU
>>751
プロセスごと始末してくれるから放置で構わん
2021/08/26(木) 05:00:21.78ID:znb4Cn9C
変な日本語・・・
755デフォルトの名無しさん
垢版 |
2021/08/26(木) 16:28:52.50ID:WPRv8+9f
こっちくんな
756デフォルトの名無しさん
垢版 |
2021/08/26(木) 17:50:13.63ID:DS5buh7a
やって来ました
メッセージボックスで「計算結果はXX」って表示したくて

1 LPCWSTR func() {LPCWSTR a = L"//計算結果の値"; return a;} //計算結果を文字列にして返す関数
2 //以下WinMain()内
3 LPCWSTR a = L"計算結果は";
4 LPCWSTR b = func();
5 LPCWSTR c = 文字列を連結する関数(a, b); //StringCchCatW(), lstrcatW()などを試したがだめだった
6 MessageBoxW(hWnd, c, L"タイトルバー", MB_OK);

と書いたが動かなかった・・・
まず、1行目の「L"//計算結果の値"」に計算結果の変数を入れる方法がわからない
そして、5行目のLPCWSTR型の文字列を連結する方法がわからなからない
一日の大半がエラーとのにらめっこに費やされて辛い・・・
頼む、手伝ってくれさい
2021/08/26(木) 17:58:52.10ID:+hQVnBsv
宿題スレ案件ですか?
758デフォルトの名無しさん
垢版 |
2021/08/26(木) 18:24:36.40ID:DS5buh7a
>>757
いや普通にニート
2021/08/26(木) 18:27:20.48ID:56nPMNqk
>>756
Win32APIではなくC言語の文字列とポインタの違いを勉強するところからやり直し
2021/08/26(木) 18:29:12.42ID:iCFmJ4nN
wsprintf
2021/08/26(木) 19:08:13.70ID:Dr81uOON
ニートならできないことは諦めればいいんじゃね?
2021/08/26(木) 19:18:34.62ID:s9ncfwmd
>>756

1 void func(CString &str) { str = "計算結果の値" } //計算結果を参照型引数の str に返す関数
2 //以下WinMain()内
3 CString str1 = "計算結果は";
4 CString strKekka;
5 func( strKekka ); // strKekka に計算結果の文字列が入って返って来る。
6 CString str2 = str1 + strKekka;
7 str2 を wide 文字列に直して、wpszText に入れる。 // ここはやり方を調べる。
8 MessageBoxW(hWnd, wpszText, L"タイトルバー", MB_OK);
2021/08/26(木) 19:19:53.55ID:WgbRBOxo
>>756
自分がどう書いたのかソースそのまま出して
764デフォルトの名無しさん
垢版 |
2021/08/26(木) 19:21:59.37ID:ltVuiEkY
普通にwstringベースで作れ。
win32のwchar_t*型渡すところで、data()やc_str()使え。

std::to_wstring で数値などなどメジャーな数値型はwstringになる。

最初はwin32の型に代替名つけまくりな文化は
一体なんの型だよって感じで戸惑うわな。
765デフォルトの名無しさん
垢版 |
2021/08/26(木) 19:22:39.20ID:s9ncfwmd
>>762
以下の関数を使えば、7 は、
wchar_t *wpszText = ConvertAcpMbcsToUtf16(str2);
でいける。

wchar_t *ConvertAcpMbcsToUtf16( const char *pszStr )
{
  // ワイド文字列(UTF16, unicode) へ変換後の文字列長を得る
  int      lenUnicode  = MultiByteToWideChar( CP_THREAD_ACP, 0, pszStr, -1, NULL, 0 );
  
  // 必要な分だけ ワイド文字列(UTF16, unicode) のバッファを確保
  wchar_t    *pbufUnicode    = new wchar_t [lenUnicode];
  if ( pbufUnicode == NULL ) {
    return  NULL;
  }
  
  // デフォルトコードページ(ShiftJISなど) から ワイド文字列(UTF16, unicode) へ変換する :
  MultiByteToWideChar( CP_THREAD_ACP, 0, pszStr, -1, pbufUnicode, lenUnicode );
  
  return  pbufUnicode;
2021/08/26(木) 19:24:55.54ID:s9ncfwmd
>>765
訂正:
1. は代入文の最後にセミコロンが抜けていたので正しくはこう :
void func(CString &str) { str = "計算結果の値"; }
2021/08/26(木) 19:30:35.44ID:s9ncfwmd
おっと、最後、MessageBoxW ではなく、MessageBoxA を使っていれば、
7や >>765 の工程は不要で、
MessageBoxA(hWnd, str2, "タイトルバー", MB_OK);
だけでいける。
2021/08/26(木) 19:32:37.80ID:s9ncfwmd
なのでまとめると以下のようになる :

void func(CString &str) { str = "計算結果の値"; }

// 以下WinMain()内
CString strKekka;
func( strKekka ); // strKekka に計算結果の文字列が入って返って来る。
CString str2 = CString("計算結果は") + strKekka;
MessageBoxA(hWnd, str2, "タイトルバー", MB_OK);
2021/08/26(木) 22:24:23.76ID:OnjvrKFf
連結はstrcatかsprintf("%s%s", s1, s2 )のTCHAR(wchar_t)版でいけるやろ
あとLPCWSTRはポインタなので、ちゃんと割り当てしてなくて未初期化のままとかないだろうな?
2021/08/27(金) 02:18:22.79ID:PcAf749w
LPCWSTRのCはCONST(定数)という意味だから、変更できない。WはWide、つまりUTF-16.
Win32をやる前にC言語の文字列処理をマスターしてくれ。
wsprintfは時代遅れ。バッファオーバーフローを避けるため、バッファサイズ指定できる<strsafe.h>のStringCch...関数群を推奨。
2021/08/27(金) 02:34:26.66ID:PcAf749w
ポインタ変数は実体を持たない。文字列扱うにはバッファが必要。動的にバッファを確保して楽したいなら、標準C++のstd::wstringか、MFC/WTLのCStringWを使う。
ただし、std::wstringを使う場合でC文字列が欲しい場合はc_str()メソッドを使う必要がある。下手な型キャストはケガのもと。
2021/08/27(金) 07:26:15.44ID:4k6BS6Dx
WindowsでC/C++を学ぼうとすると、文字列の扱いは混乱するだろうね
OSを特定しない教科書に載ってるようなやり方もできるから心配するな
一応の結果の表示をできるようになったら、とりあえずその方法だけ使って次に進んで、一通り理解したらまた文字列処理に戻ってくるといいんじゃないかな
773デフォルトの名無しさん
垢版 |
2021/08/27(金) 07:43:07.26ID:bixNKZnz
ぎゃー
教えてくれたのに遅れてすまん
今からエディター起動する
2021/08/27(金) 08:37:51.16ID:lOnGsJ7M
スレタイ読もうな?
2021/08/27(金) 10:35:04.22ID:Zo8CY4eq
>>770-771
この段階の人には情報過多
2021/08/27(金) 10:43:55.91ID:BFKMFKNN
C言語の基礎からやり直せ、と助言するのが正しい
777デフォルトの名無しさん
垢版 |
2021/08/27(金) 11:25:56.35ID:bixNKZnz
付き合ってくれた人が多くて感謝!
上のコードで実験しながら知識の掘り下げも含めて少し調べてみる
ありがとうな
いつか立派なプログラマーになってこのスレで恩返しするわ(泣ける)

>>774
文字列の扱いがここまで面倒だとは思ってなかった
Windows APIの関数に適当に投げ込むだけだと思ってた

>>776
入門書は読んだだけで実作は先週始めた
(これ以上は理解が進まないので実作をすることにした)
まだ知識が実践で使えるように修正されてない状態
まあ知識もないんだが
778デフォルトの名無しさん
垢版 |
2021/08/27(金) 11:59:25.59ID:Ti/YAON1
お前には完成する能力は無い
2021/08/27(金) 12:35:37.97ID:S83DaDnk
先が思いやられるな
特にWin32APIにこだわる理由が無いならC#でやることをおすすめする
2021/08/27(金) 18:42:32.62ID:v1ag2e+a
特殊な理由でもない限りネイティブc/c++なんて使わんでいいよ
2021/08/27(金) 19:44:48.26ID:ykQTaA3x
Cだと、こんな感じかな
- - - - - - - - - - - - - - - -
LPCTSTR a;
int b;
TCHAR c[20];

a = TEXT("計算結果は");
b = 2;
wsprintf(c, TEXT("%s%d"), a,b);
MessageBox(NULL, c, TEXT("タイトルバー"), MB_OK);
2021/08/27(金) 20:04:56.02ID:v1ag2e+a
今でもTEXT()って要るの?
2021/08/27(金) 20:22:50.96ID:S83DaDnk
なんでせっかくTCHAR使っててwsprintfやねん
2021/08/27(金) 20:24:35.54ID:EK7jPK8d
MBCSかUNICODE決め打ちならいらない
LPCTSTR,TCHARも同じ
2021/08/27(金) 20:35:07.25ID:Zo8CY4eq
>>783
#ifdef UNICODE
#define wsprintf wsprintfW
#else
#define wsprintf wsprintfA
2021/08/27(金) 20:36:31.85ID:oI5nTqpL
>>783
wsprintfはTCHARでは
2021/08/27(金) 20:36:59.87ID:olVwmysy
>>785
>>760
2021/08/27(金) 20:42:31.64ID:Zo8CY4eq
?
2021/08/27(金) 20:45:13.11ID:PcAf749w
sprintf/swprintfはC標準。
wsprintfはWin32。
これはテストに出ないぞ!
2021/08/27(金) 20:48:57.74ID:olVwmysy
>>789
Win32apiのスレなので、それ以外の答えを
書いた奴全員アウトあるね
2021/08/27(金) 22:20:01.88ID:5zZ7szBm
>>786
TCHARはワイドとマルチバイトの両方なんだからwprintf決め打ちじゃなくて_tprintf
2021/08/27(金) 22:35:10.18ID:oI5nTqpL
>>791
wsprintfはTCHARでは
2021/08/27(金) 22:53:41.84ID:ykQTaA3x
>>782
これからWin32APIを理解し始めようと考えている人には、そうゆう疑問を持てるレベルにまで頑張って到達してほしいな、という思いでマクロ表記にしてみたよ。
実用上、必要か不要か・・・で言えば場合によるんだろうけど。
現時点でWin32API が内部で ANSI と UNICODE を明確に区別しているので、作法として気にする必要はあると思われます
2021/08/27(金) 23:06:30.48ID:5zZ7szBm
>>792
なんでだよw
wprintfはWCHAR
2021/08/27(金) 23:07:19.75ID:PcAf749w
_T系の関数マクロは<tchar.h>で定義されていて、主にC実行時関数を振り分ける。これらはAnsi/Wideを振り分けるTEXT系とは別に分離された機構になっている。
2021/08/27(金) 23:09:32.07ID:PcAf749w
>>794
wprintfはC標準のワイド関数。
wsprintfはWin32関数でA/W版がある。
一文字違いに注意。
2021/08/27(金) 23:18:41.05ID:PcAf749w
UNICODEマクロでA/Wの振り分け。
頭に下線のついた_UNICODEマクロで_T系の振り分けができる。
これらはVisual Studioで適切にソリューション/プロジェクトの設定を行えば自動で定義される。
GCCやclangでは-municode をコンパイルオプションに追加する。

ただし、ユニコードプロジェクトではWinMainはwWinMainに切り替わるので注意しよう。
2021/08/27(金) 23:22:46.33ID:PcAf749w
ユニコードプロジェクトにせず、代わりにUNCODEマクロと_UNCODEマクロを定義済みにするというやり方もある。こちらはCMakeでよく使う。
2021/08/27(金) 23:25:34.94ID:PcAf749w
ユニコードプロジェクトではないときにUnicode のコマンドラインを取得したい場合は、GetCommandLineWと
CommandLineToArgvWと
LocalFree を使う。
2021/08/27(金) 23:32:23.92ID:PcAf749w
ミッキマウスミッキマウスミッキミッキマウス
天安門事件
旭日旗☀
2021/08/28(土) 06:56:04.31ID:zdnaC7QB
,>>798
まぁ今となってはWindowsのUTF16LEはUNCO(ウンコ)なコードだったな
2バイト固定で1文字ってのは、簡易な多言語対応とstrlen系の文字数計算に楽だったんだろうけどそれだけだろ
2021/08/28(土) 08:30:55.56ID:UNt1DdTH
サロゲートペアに対応したので、その文字数計算も単純にできなくなってしまった。
文字数計算がややこしいのはUTF-8もそうなので、UTF16〜が全然ダメということではないが。

開発面では、将来的に UTF-16(IVS)が必要になってくると、UTF8でいいじゃん、ということになって。
Visual stduio のデフォルトが再度ANSI(UTF-8)に戻る可能性はある。
長い目でWin32APIを見るなら、ANSIアプリの構築方法も忘れないでおく必要はありそうだ
2021/08/28(土) 09:06:21.83ID:YWpKrN9v
アラビア語かなんか知らんが、サロゲートペアの問題ではなく、さらに
UTF32 では 2 文字(32BIT x 2) なのに、画面上では文字の上や下に斜線
が入るような文字がある。日本語の濁点のようなもの。サに点々を打ってザ
と書くようなのを、サ + ” みたいな二文字で表現するらしい。
そんなものまで日本人が対応しなくて良いと個人的には思ってる。
2021/08/28(土) 09:09:13.47ID:YWpKrN9v
UTF8 --> UTF16(サロゲートペア) --> UTF32 1 文字
の問題だけでなく、特殊な言語では、
UTF8 --> UTF32 2文字 --> 画面上では 1 文字
の問題が有るということ。
日本人が対応できるのは、UTF32 1文字が画面上で1文字に見えるまでが限界。
2021/08/28(土) 09:33:08.48ID:nCwHwokI
KPS 9566-2000にはフル対応しる
2021/08/28(土) 09:53:59.20ID:3VTMYlES
>>803
> サ + ” みたいな二文字で表現するらしい
Macってこれだよね
UTF-8-MACくたばれ
2021/08/28(土) 10:02:21.59ID:gw2R54kI
>>779
C#だっておバンバン
2021/08/28(土) 10:50:07.25ID:Wn50/Mou
>>794
勘違いしましたごめんなさいは?w
2021/08/28(土) 12:21:19.46ID:jkQHTYKd
>>803
>そんなものまで日本人が対応しなくて良いと個人的には思ってる。
欠けリンゴの世界ではそっち採用してるからファイル名の扱いとか厄介だよ
2021/08/28(土) 13:14:56.03ID:I3iUh714
>>801
MBCSのsjisとeucに戻りたいかというと、嫌かな(´・ω・`)
今の敵は絵文字
2021/08/28(土) 13:29:17.35ID:78cNf6mY
中東とアメリカは中が悪いから、わざと変な文字コードにしたのかも知れんな。
経済的な敵である日本を倒すため、オートリピートなんてそもそも不要なIMEのON/OFF
キーに普通のアルファベットキーよりも開始時間の短いオートリピート機能を付けた
上に、現在のON/OFF状態を画面の右下の分かりにくい場所に小さく表示したりとか
と同じで。
2021/08/28(土) 14:51:45.63
>>811
政治の世界と商売の世界は違いますよ、商売のためならなんでもするのが商売人というやつですよ
2021/08/28(土) 15:17:42.31ID:Wn50/Mou
そして悪徳へ
2021/08/28(土) 17:32:49.86ID:nCwHwokI
>>794
スレタイ3回音読してからごめんなさいは?
2021/08/28(土) 18:09:30.98
ワンワンワンごめんなさい
2021/08/29(日) 01:17:36.66ID:MsJ8kGio
どうでもいいけどオリパラのRPCはリモートプロシージャコールじゃなくてなんちゃってロシア
まめな
817デフォルトの名無しさん
垢版 |
2021/09/06(月) 20:30:01.34ID:d5h9Y6Qi
フフフフフ…で埋められたWin32アプリデバッグメモリを思い出した人、どのくらいいるかな

「フフフ…」4歳娘が撮影した花火に家族で爆笑! 見ると笑顔になる“奇跡の1枚”の状況を父親に聞いた | FNNプライムオンライン
https://www.fnn.jp/articles/-/224754
2021/09/06(月) 20:54:15.47ID:q0BBk2oV
0xABADBABE がwindows7のUSB
0xBAADF00D がlocal alloc

深淵に到達するとフフフじゃないのよ
819デフォルトの名無しさん
垢版 |
2021/09/09(木) 19:55:16.63ID:VcdPV4nP
カカカ
2021/09/10(金) 06:52:10.21ID:zxx6HeQ0
六歌仙のひとり
2021/09/10(金) 11:54:52.84ID:kc5oWHp5
Debugモードで実行すると配列の中身が「フフフノフフフ」になってワロタ
2021/09/10(金) 11:56:22.34ID:2Fxd4w67
16進数で表示して英語で読んでみ
2021/09/11(土) 21:33:34.97ID:x2ZLDQix
INT3
824デフォルトの名無しさん
垢版 |
2021/09/11(土) 23:15:17.42ID:EO9owr6G
dabadabada
2021/09/15(水) 09:50:59.74ID:5Dhe4KoF
HANDLE SetClipboardData(UINT uFormat, HANDLE hMem);
に渡すhMemは必ずGlobalAllocで確保したものでなくてはいけないのでしょうか?

mallocやnewやスタック領域のポインタを渡すとどうなるんでしょうか・・・?
2021/09/15(水) 12:24:45.10ID:SFBdYzCp
>>825
渡すのはポインタではなくハンドルやぞ
2021/09/15(水) 12:43:50.08ID:LR7HEnPp
>>825
クリップボードはOS単位
スタックはプロセス単位
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
蟻人間が悪い
2021/10/24(日) 22:24:25.46ID:jz1DejpB
おちんちん切除の刑な
2021/10/25(月) 10:45:57.68ID:vmRZrQEp
>>902-903 で終わってた
930デフォルトの名無しさん
垢版 |
2021/10/25(月) 10:56:02.77ID:SLeimCOK
コンボボックスはスタイルにCBS_NOINTEGRALHEIGHTを追加すればドロップダウンリストの自動リサイズを抑止できるんだけど、
表示後の明示的なリサイズはどうすればできますか?
2021/10/25(月) 13:29:15.55ID:tw1a+0Qf
>>930
COMBOBOXINFO.hwndListとSetWindowPos/MoveWindowを使う。
932デフォルトの名無しさん
垢版 |
2021/10/25(月) 16:29:02.07ID:SLeimCOK
>>931
CBN_DROPDOWN通知時にhwndListでSetWindowPos()を試したけど反映されなかった
どのタイミングならサイズを変更できるのだろう?
2021/10/25(月) 18:33:34.75ID:fI0MqBKa
PostMessage?
2021/10/25(月) 20:18:01.64ID:/y1ZSI8/
リサイズしようとしたら
WM _ GETMINMAXINFOが出て
それを処理しないといけない。

なので、独自にメッセージをポンプするか、PostMessageで現在のメッセージ処理を
一旦終了させないといけない。

直前に書いてある回答の蛇足だとこんなもん
935930
垢版 |
2021/10/25(月) 22:02:06.33ID:SLeimCOK
>>930,932 の質問の表現を変えます
CBS_NOINTEGRALHEIGHTスタイルのコンボボックスはrcファイルで指定されたドロップダウンリストのサイズを維持しようとするらしい
WM_INITDIALOGでコンボボックスのフォントを変えるとフォントに応じてドロップダウンリストのサイズも変わってしまう
WM_INITDIALOG後にコンボボックスのドロップダウンリストのサイズを変更するにはどうすればよいか?
2021/10/25(月) 23:13:41.66ID:2h62u+//
むしろフォントに応じてサイズが変わるのが正解
メッセージ処理のタイミングなどで動的変更する方法は知らんが、
ダイアログリソースを編集すればワンチャン

ダイアログ表示してから編集というのはしたことないから保証しない(というか無理なきはする)が
表示前なら編集してどうにかなる
937930
垢版 |
2021/10/25(月) 23:20:40.84ID:SLeimCOK
コンボボックスのドロップダウンリストの縦サイズはデスクトップの縦サイズの半分より十分小さくないと、
コンボボックスが縦方向中央付近にある時にテキストボックスがドロップダウンリストに隠れやすくなる
2021/10/25(月) 23:42:53.98ID:2h62u+//
面倒なので試さないけど、もしかしてフォント変更後にコンボボックスコントロールの
ウィンドウハンドルそのままSetWindowPosに投げたらドロップダウンサイズ変わらんか?
2021/10/26(火) 19:58:48.51ID:2BgEM434
a.exe という service 用の exe があるとして
その WinMain の中で
登録済みの service (a.exe) として実行されたときと
デスクトップから起動 (a.exe) されたときと
区別する方法はありますか?
2021/10/26(火) 21:43:07.14ID:Dp6wzto0
>>939
GetModuleFileNameで実行ファイルの場所がわかる。
2021/10/26(火) 21:49:16.90ID:55s5H13U
デスクトップって言うのはダブルクリックで起動って読み替えたけど違うんかな
2021/10/26(火) 21:52:04.16ID:cAwQ+zjg
・実行ファイル自体は同じ場所にある
・(ダブルクリックによる)エクスプローラーからの起動
・システムのサービスに登録してての起動
実行ファイル側のコードで自分自身で区別することが出来るか? という話でいいのかな?
2021/10/26(火) 21:57:13.21ID:Dp6wzto0
ショートカットファイルならコマンドラインオプションをつけることができるから、それで区別可能。
2021/10/26(火) 22:10:48.14ID:DnJtJtaA
サービス用のEXEをそのまま実行する仕組みなんて普通は作らないけど
そのプロセスを起動した親のPPIDで判別できると思うよ
2021/10/26(火) 22:13:30.49ID:WqHq7Z2L
親プロセスがservices.exeかどうか見るとか。結構めんどくさそうだけど
2021/10/26(火) 22:22:56.91ID:DnJtJtaA
.NETにはPPID取得する方法が用意されてないのが驚きなんだよね
WMIかピンボケするしかない
2021/10/26(火) 22:50:49.81ID:WzQpbfaj
独自のコマンドラインオプションをつけたものをサービスとして登録して、
それがついているときはサービスとして動作するように作ってる
2021/10/27(水) 07:31:35.16ID:Zj1idbQo
>>939
ServiceMain とWinMainで入口から
違うが?
2021/10/27(水) 09:54:33.98ID:t2iD5tO8
>>941
cmd とかからのコマンド指定で起動も含みます
>>942
それです
>>944-946
ひと手間だけで取得出来る一般的な API やパラメータは無さそうですね?
>>947
それは最初に思い付いたのですが元々起動時のパラメータや API で取得する方法があるならその方が良いかなと思いました
2021/10/27(水) 11:38:38.74ID:jUeTV2mv
>>948
アプリケーションのエントリポイントは WinMain (or main) で変わらんでしょ
その中で登録だなんだを経てWinMain からは抜けるけどプロセスは生き残ったまま
別スレッドで ServiceMain をディスパッチしてるだけじゃなかろうか
2021/10/27(水) 17:24:24.16ID:Zj1idbQo
>>950
そんなコードは無いな。
どこの資料にそんな事書いてあるのかね?
952デフォルトの名無しさん
垢版 |
2021/10/27(水) 21:34:16.61ID:rXHlGl3r
win7以前かな
2021/10/27(水) 22:39:54.26ID:FvdEROp3
サービスのAPIってWindows NTの時代からたいして変わってないだろw
2021/10/27(水) 23:35:14.09ID:joAdtZnc
NT4 から2000でSCMの動的ロードが出来るようになったな
2021/10/27(水) 23:50:16.32ID:ou7Wlnm/
>>951
WinMain(またはmain)内でStartServiceCtrlDispatcherを呼ぶ以外の方法あるの?
2021/10/28(木) 09:41:55.77ID:XVuwIiyB
おまいの眼は節穴か
2021/10/28(木) 21:15:42.35ID:WySuLNFg
yes.It's the power of Christ that compels you!
2021/11/02(火) 16:25:02.03ID:yLMj4W62
IOCTL_DISK_GET_DRIVE_LAYOUT_EXで得られるパーティションの情報と
FindFirstVolume, FindNextVolumeで得られるボリュームとの
対応付けはどうやるんです?
2021/11/03(水) 12:54:39.69ID:VhVmtrn9
>>958
何をやりたいのかわからないけど、IOCTL_DISK_GET_DRIVE_LAYOUT_EXの情報からドライブ名にしたいのなら、
"\\?\Volume" + PartitionId(GUID) にすれば、ボリューム名になるのでそれを変換すればいいはず
2021/11/03(水) 16:28:52.42ID:XJPYAEvm
>>959
おー
ありがとうございます。
2021/11/05(金) 13:35:11.77ID:aDspL8GE
WS_EX_TOPMOSTなウインドウが時々、
通常ウインドウごときに前に出しゃばられるんだけど
防ぐか、出しゃばられたのを自動検知してZオーダーを
奪い返すにはどうすればいい?
2021/11/05(金) 13:42:11.04ID:AxgqQTGR
他所の窓が WS_EX_TOPMOST で奪っていって前に出しゃばられてるのであれば
WM_STYLECHANGED 捕まえて奪い返す?
2021/11/05(金) 14:22:05.51ID:x8tAGQOE
>>961
もしかして
そうなった時って一度アクティブにしたらなおるやつ?
964デフォルトの名無しさん
垢版 |
2021/11/06(土) 14:43:09.91ID:b1XdA94q
ランサムウェアでも造ってんのか
2021/11/06(土) 15:06:28.83ID:Iy8k0Kf7
yes!
966961
垢版 |
2021/11/06(土) 21:24:14.45ID:7Goy9i30
CreateWindow直後は理屈のとおりなんだけど
長時間稼働させて忘れた頃にAdobe Readerだの一太郎だのに
前に出しゃばられてるんだ
2021/11/06(土) 21:29:06.09ID:n6Z+kNBR
>>963はどうなんだよって
2021/11/06(土) 22:27:59.28ID:Iy8k0Kf7
>>961
WM _ windowposchanging
2021/11/07(日) 15:26:34.47ID:eUZdhF5f
>>966
忖度だ
970デフォルトの名無しさん
垢版 |
2021/11/08(月) 18:39:57.62ID:GDZdggMg
継ぎスレよろ
971sage
垢版 |
2021/11/11(木) 21:36:46.70ID:sXUxuuhm
質問します
自作ソフトからのドラッグアンドドロップで
デカいファイルのコピーなどで DoDragDrop から長時間制御がかえって来ないことを嫌って
DoDragDrop に渡すデータオブジェクトに IDataObjectAsyncCapability を実装しています
これで、D&Dが非同期になり、データのコピーなどが始まると、StartOperation が呼ばれ、
終わると、EndOperation が呼ばれると思っていたのですが・・・
で、何がしたいかといいますと、自作ソフトからエクスプローラにファイルなどをD&Dをしたとき、
エクスプローラが自作ソフトのプロセス中の IDataObject を
使用している間は自作アプリの終了を出来ないようにしたいわけです(なぜならエクスプローラが使用中だから)
それで、StartOperation でカウンタを一つ上げて、EndOperation でカウンタを一つ下げれば
現在なんらかの IDataObject が使用中かどうかわかるので、その間は終了できないようにしたいわけです
ところが、実際には、StartOperation は呼ばれますが EndOperation は呼ばれません!(なぜ?)
Win10 と Win11 の両方で試しましたが、両方ともそうでしたのでそういう実装なのでしょう
そこで、IDataObject のデストラクタ をもってして EndOperation の代わりにしようと考えました
IDataObject の参照カウンタが0になって解放されたなら、だれも使ってないことは確実なので、、、
で、エクスプローラは IDataObject を使い終わったら素直に Release してくれるのでいいですが
そうでないソフトもあります、具体的には Visual Studio 2022 がそうでした
勝手な想像ですが、おそらく IDataObject の解放が GC 任せになっているのでしょうか、いつ解放してくれるか分かりません
問題は、Visual Studio 2022 に直接ドロップしなくても
D&D 中に少しでもマウスカーソルが Visual Studio 2022 のウィンドウの上を通過するだけで
Visual Studio が IDataObject を握ったままになることです
探せば Visual Studio 以外にも、特に .Net 系のアプリなんかで IDataObject の解放を
GC任せにしているアプリはあるんじゃないですかね
そういった経緯がありまして、どのタイミングでファイルのコピーなどが終了して
アプリを終了してもい状態になったかどうか、判断する手立てがなくて困ってます
何かいい方法ないですかね
972デフォルトの名無しさん
垢版 |
2021/11/12(金) 00:10:15.19ID:4fWazNbK
迷惑な香具師だな
2021/11/12(金) 00:15:39.07ID:sPOmWbjM
961もそうだが只の釣りだろ
2021/11/12(金) 02:05:20.32ID:M7lyd7nj
Ruby なら、まずデスクトップに、Rubyスクリプト・a.rb を起動するショートカットを作る

ショートカットのリンク先
C:\Ruby25-x64\bin\ruby.exe C:/Users/Owner/Documents/a.rb

a.rbの内容は、以下のように、
DryRun を使っているので、実際にはコピーされない

普通は、以下のように同期処理で作るけど、非同期にしたいのなら、
別プロセス・worker process でも起動すれば?

require 'fileutils'

dest_dir = "C:/Users/Owner/Documents/tmp/"

# ARGV は、ドロップした複数のファイルパスの配列
ARGV.select { |full_path| File.file?( full_path ) } # ファイルのみ処理する
.each do |full_path|
file_name = File.basename( full_path ) # ファイル名のみ

FileUtils::DryRun.move( full_path, dest_dir + file_name)
end

sleep # 出力したコマンドプロンプト画面を閉じないようにする

出力
mv C:\Users\Owner\Documents\x.txt C:/Users/Owner/Documents/tmp/x.txt
2021/11/12(金) 02:18:11.02ID:+s5Ye2oF
読んでないぞガイジ
2021/11/12(金) 02:47:31.80ID:0Z8rlyMb
上のキチガイも書いてるがそういう場合は別プロセスにして放置だな
単一プロセスでうまくいかない事なんて沢山ある
977971
垢版 |
2021/11/12(金) 14:34:55.49ID:+qQdSUS6
そうですね、確かにただのファイルのコピーなら別プロセスで実行してもいいのですが
ドラッグアンドドロップと絡んでくると難しいんじゃないですかね
なにせ実際にファイルのコピーを行うのは自アプリじゃなくて
エクスプローラ側のなのでですね

別プロセスで DoDragDrop を呼び出せってことなんでしょうけど
ドラッグアンドドロップの起点となるのはメインアプリのマウスメッセージからなので
これはかなり難しいと思います
なにせ DoDragDrop は別スレッドから呼び出しただけで動かなくなる変なAPIなので
http://bbs.wankuma.com/index.cgi?mode=al2&;namber=94173&KLOG=163
別プロセスとなるとさらにハードルが高いと思われます

なぜ別スレッドで DoDragDrop が呼び出せないかは謎なんですが
多分 Windows 内部で WM_LBUTTONDOWN 系の何か「今」マウスが押されてる
ウィンドウかスレッドを覚えていて、それとは別スレッドで DoDragDrop が実行されると
失敗する処理が入っているんだと思います
ドラッグアンドドロップはかなり、なんというか、まぁ、特別というか
他のアプリにも影響が出る処理なので、OS全体を巻き込んでフリーズしないように
何かしてあるんでしょうね、これ、ちょっとよく分かりませんが、、、
ともかく別スレッドで実行できないです、なんででしょうね

それを回避するのが IDataObjectAsyncCapability なんですが
https://docs.microsoft.com/en-us/windows/win32/api/shldisp/nn-shldisp-idataobjectasynccapability
MSDN にも StartOperation が呼ばれたら、データ維持しろ、みたいなことが書いてあるけど
それをいつまで維持すればよいのかという話で、最後に EndOperation が呼ばれるって書いてあるけど
実際には呼ばれないんですよねー、まぁ呼ばれることもあるんですけど、この辺がまた一貫してない
2021/11/12(金) 15:45:20.47ID:rNKaN3pL
おい片山、これの対応と次スレ建てやっとけ
2021/12/02(木) 12:18:05.69ID:Q5DdwN4N
DialogBoxでメインウインドウを作るとタイトルバーのHeightが若干短くなるものと認識していたのですが、色々とスタイルを試しても一般的なウインドウと同じものしか出来上がりません
世に出てるダイアログベースのフリーソフトは短いものが多いと思いますが何が違うのでしょうか?
2021/12/02(木) 12:31:16.49ID:aNBqwDTQ
自分で描いてるんじゃね?
spy++で属性見るべし
2021/12/02(木) 12:36:49.79ID:vBr1OiF/
比較画像とかある?
2021/12/02(木) 12:43:31.97ID:zC7DodB0
>>979
> DialogBoxでメインウインドウを作るとタイトルバーのHeightが若干短くなるものと認識していたのですが、

そのようなことはありません

> 色々とスタイルを試しても一般的なウインドウと同じものしか出来上がりません

それが通常です

> 世に出てるダイアログベースのフリーソフトは短いものが多いと思いますが何が違うのでしょうか?

思い違いです

WS_EX_TOOLWINDOW を付与したウィンドウを求めてるだけじゃないのですか?
2021/12/02(木) 13:03:17.36ID:Q5DdwN4N
>>980->>982
返答ありがとうございます
spy++で全く同じスタイルを付与してもタイトルバーの長さは変わらず太いままでした
短い方のフリーソフトにはWS_EX_TOOLWINDOWは立ってないようです

そして色々とググってみた所stackoverflowの質問によると、manifestにて最小サポートOSをWindowsXPにすると短くなるみたいな仕組みっぽいです
https://stackoverflow.com/questions/32426055/windows-10-dialog-box-titlebar-behavior
2021/12/02(木) 19:14:11.18ID:8y/JBuUj
この値ってファイル重複は調べられないのね
ハードリンク、シンボリックリンクだと同一の値だったが

(unsigned __int64) nFileIndexLow + ( (unsigned __int64) nFileIndexHigh<<32)
985デフォルトの名無しさん
垢版 |
2021/12/02(木) 21:02:13.06ID:8y/JBuUj
上のファイルIDって、ボリュームごとにナンバーがつけ変わるんですか?
そもそもどのようにファイルIDが生成されてるのか不明なんですが
コピーだと別のIDになりましたが
ボリューム番号を付けないでファイルIDが一致した場合、全く別のファイルってことがあるんですか?


ファイルの同一性判定
Windows
ボリュームシリアル番号とファイルIDを用いて同一性判定を行う。
https://yohhoy.hatenadiary.jp/entry/20130311/p1
2021/12/02(木) 21:07:25.22ID:NUCi8UEu
うめ
987デフォルトの名無しさん
垢版 |
2021/12/02(木) 21:09:25.23ID:8y/JBuUj
ファイルIDが変更されるルールが不明なんですが



その昔の nFileIndexHigh/Low の日本語説明はこうなっている。

この識別子とボリューム シリアル番号により、 ファイルが一意に識別されます。
この番号は、 システムの再起動時やファイルのオープン時に変更される場合がありますが、
プロセスがファイルをオープンした後は、 識別子はファイルがクローズするまで一定の値になります。
アプリケーションはこの識別子とボリューム シリアル番号を使って、 2つのハンドルが同じファイルを参照しているかどうかを判断することができます。

成る程、比較にはボリューム シリアル番号も含めねばならぬ。
当時の「ファイルオープン時に変更されるかも」の文言の真意は判らないが、nFileIndexHigh/Low を長期間保存しておくのは問題有るかも知れない。
usskim.blog37.fc2.com/blog-entry-555.html
2021/12/02(木) 21:39:46.13ID:z73dHP14
https://docs.microsoft.com/en-us/windows/win32/api/fileapi/ns-fileapi-by_handle_file_information

英語読めよ..
989デフォルトの名無しさん
垢版 |
2021/12/02(木) 23:17:05.29ID:8y/JBuUj
サンクス
でもよくわからないです
2021/12/03(金) 19:56:31.26ID:SutKwY48
NTFSの内部情報がないとどうにもならん
終了
2021/12/07(火) 10:03:39.54ID:m4TDhLeb
dbgviewの後継ツールってないの?
特定のプロセスだけ監視するとか
大量のゴミ撒き散らしてるプロセスだけ除外するとかしたい
2021/12/07(火) 13:11:46.58ID:VYmmPtZe
>>991
dbgviewのFilter機能じゃダメなの?
>特定のプロセスだけ監視とか
>大量のゴミ撒き散らしてるプロセスだけ除外するとかしたい
自分が作ってるアプリなら、Traceの頭に固有文字列付けとけばよいし、
そうで無いなら[プロセス番号]でフィルターすれば事足りると思うが?
2021/12/07(火) 13:35:15.66ID:KkhoCDsy
>>987
FATならディレクトリの最初のクラスタと、ファイルのバイトオフセットから生成
デフラグによってそのクラスタ位置やバイトオフセットが変われば識別子も変わる
削除して別のファイルを生成した場合に、同じファイルIDが生成される可能性がある

NTFSなら削除されるかReplaceFileによって置き換えられるまでは一意

またFAT、NTFSともにファイルIDはファイルシステムごとだから、同一コンピュータ上でも論理ドライブが違えば被ることもあるので、
同じ論理ドライブか異なる論理ドライブかを判断するもの(ボリューム シリアル番号など)が必要
2021/12/07(火) 21:50:48.67ID:kG93TMWa
デフラグやファイル操作で変わるなら何の意味もないように見える
活用したい場面なんてないのでは
995デフォルトの名無しさん
垢版 |
2021/12/09(木) 20:57:10.24ID:aTCz13pR
うめる
996デフォルトの名無しさん
垢版 |
2021/12/09(木) 20:57:15.04ID:aTCz13pR
落とせ
997デフォルトの名無しさん
垢版 |
2021/12/09(木) 20:57:20.79ID:aTCz13pR
捕手
998デフォルトの名無しさん
垢版 |
2021/12/09(木) 20:57:34.68ID:aTCz13pR
外野手
999デフォルトの名無しさん
垢版 |
2021/12/09(木) 20:57:48.44ID:aTCz13pR
これでこのpartスレは終わりだ
1000デフォルトの名無しさん
垢版 |
2021/12/09(木) 20:58:48.50ID:rdeWvBW2
1000ならこのpartスレはこのスレで終了
未来永劫立てるなボケガイジ低学歴低年収底辺ども
しねしね
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 586日 22時間 41分 57秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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