X



Win32API質問箱 Build126
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん垢版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/
0004デフォルトの名無しさん垢版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/
0005デフォルトの名無しさん垢版2020/05/02(土) 14:36:08.36ID:83EB0DAt
MemoryMappedFile で造ったファイルのパスとかファイル名を取得する方法はありますか?
0006デフォルトの名無しさん垢版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
下部の他のリンクが色々あるね
0007デフォルトの名無しさん垢版2020/05/03(日) 09:53:31.92ID:zajIy9nA
GJ(袖の下)
0009デフォルトの名無しさん垢版2020/05/04(月) 03:41:12.64ID:yjWu452E
MoveFileって同一ドライブであればディレクトリも移動できたんだな
エクスプローラーだと一瞬だし何かおかしいと思ってたが
今まで再帰で糞真面目に移動してた

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

>Windows NT/2000:この関数の ANSI 版では、名前は最大 MAX_PATH 文字に制限されている。
>この制限をほぼ 32,000 ワイド文字へ拡張するには、この関数の Unicode 版を呼び出し、パスの前に "\\?\" という接頭辞を追加する。
これも知らなかった
ファイラーとか作ってる人ってこの辺ちゃんと処理してる?
0014デフォルトの名無しさん垢版2020/05/06(水) 16:46:07.85ID:WRi3OS9Z
GetQueueStatus() API って Windows10(もしかすると 8)以降
動作が遅くなってない?
(未だに VB6 で作成したソフトをメンテナンスしている関係で調べてたら、
DoEvents より遅くなっていることに気が付きました)
0016デフォルトの名無しさん垢版2020/05/06(水) 17:20:26.54ID:WRi3OS9Z
連投すみません。
64bit OS だから遅くなるということはないですよね・・・
g++ で簡単な速度計測用のプログラムを使って確認してみました所、
Windows7 と Windows10 では、約 6 倍くらい速度差がありました。
(まさか、Windows10 で遅いのは、Windows Defender が原因だったりして・・・)
0017デフォルトの名無しさん垢版2020/05/07(木) 10:15:27.49ID:iKRewGMt
まさかWindows10のデフォルトの電源モードが省電力になってるのを知らないとか
0018デフォルトの名無しさん垢版2020/05/07(木) 11:13:42.62ID:biI6CgIS
基本的なことかもしれませんが、教えてもらいたいことがあります。
Win32APIで作成中のゲームで、ウィンドウを最小化してみてタスクバー格納してみたら、
画像の背景部分の画像が消えて、背景が真っ白になってしまいました。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

WM_SIZINGで大きさが変わったを知って
見合ったサイズのBMPに作り直し→表示内容を更新
0037デフォルトの名無しさん垢版2020/05/07(木) 17:42:01.72ID:0pZrsm5h
とにかく、最小化状態から通常状態に戻したときは、何もかもそれまでの描画が
失われるのは昔からのWindowsの仕様。
普段は高速化のため部分描画をしたい場合は、そうしておいて、WM_SIZEが
来た直後にだけは、なんとか色々な方法で工夫して全体描画すればよい。
0038デフォルトの名無しさん垢版2020/05/08(金) 00:39:11.34ID:taENaF02
CreateWindow関数って存在しないの知ってる?これ豆な
0039デフォルトの名無しさん垢版2020/05/08(金) 01:17:12.85ID:0sjMHJ2y
>>38
マクロでは存在している。
実際のDLL内での関数名は、Unicode版と非Unicode版でそれぞれ語尾にWとAが付くが。
0040◆QZaw55cn4c 垢版2020/05/08(金) 01:23:45.95ID:dYQlSH+b
>>39
CreateWindow
って、ファイルシステムとは関係ないのに、どうして A と W を実装しているのでしょうか?
0041デフォルトの名無しさん垢版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に自動的に切り替わる。 
0042デフォルトの名無しさん垢版2020/05/08(金) 05:42:10.41ID:FYQVpLgs
〜Exって関数名、拡張は1回きりって浅はかな付け方を
よくここまで堂々とやるなって感心しちまう
0044デフォルトの名無しさん垢版2020/05/08(金) 08:24:01.23ID:UfrpmU+3
なんなら***ExExもアリだからな
Exが一度だけという浅はかな固定観念に縛られていてはMSには成れないのさ
0046デフォルトの名無しさん垢版2020/05/08(金) 08:35:06.55ID:+jRc4+db
じゃあ逆にどうしろと?
eclipse のソースコードなんかでも、インターフェースはバージョン番号増やしてく感じだよ

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

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

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

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

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

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

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

ファイルのアクセスや各種プロトコルでは
いろんな文字コードを使うはずで
全ての文字コード用に各種APIが対応してる
なんて必要は全く無い
変換APIだけ用意してくれれば良い
0068デフォルトの名無しさん垢版2020/05/09(土) 11:14:28.38ID:QCHAZIsg
OS側で文字を入力・加工したものを制御系に流す、又はその逆のことを全く考慮しないならそうだね
0070デフォルトの名無しさん垢版2020/05/09(土) 11:56:33.06ID:3rxWY8lS
UTF8とUTF16は表現が違うだけで空間は一緒やろ
(厳密には一対一ではない)

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

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

WSL なら、Linux/Windows間の変換を、Windowsが自動変換するだろ
0073デフォルトの名無しさん垢版2020/05/09(土) 13:44:45.28ID:OifcNah8
ちょっと前にWindows10がUTF8を使用する機能が追加されたと聞いたけど、あれはどういう仕組みなの?
開発するときはWCHARやW系の関数を使っててもいいの?
0074◆QZaw55cn4c 垢版2020/05/09(土) 13:53:34.15ID:y1dzFt5u
>>73
>Windows10がUTF8を使用する機能が追加された
設定で A 系がデフォで UTF-8 になると聞いています
0077デフォルトの名無しさん垢版2020/05/09(土) 18:36:20.72ID:MO8a3o69
設定で変えないとな今だとちゃんとシステムがUTF8かどうか確認しないとバグるだろうなぁ。。。
0079デフォルトの名無しさん垢版2020/05/09(土) 20:45:09.00ID:bNQ8i22s
聞いてるだけでよくわからなくなってくる
マルチバイト星人はこの先もしばらくは無駄な苦労をしていくことになりそう
0080デフォルトの名無しさん垢版2020/05/09(土) 23:03:31.09ID:VZmAPRaM
TCHAR はもういらない子
0084デフォルトの名無しさん垢版2020/05/10(日) 07:07:50.16ID:TKKqj4ZC
>>70
> (厳密には一対一ではない)
UTF8 と UTF16 って符号化文字集合は同じだから全符号化表現が一対一対応するんだと思ってたわ
例えば何が一対一にならないん?
0086デフォルトの名無しさん垢版2020/05/10(日) 10:02:11.48ID:Fp1kS4OT
WinSockの話はこのスレであってる?
ブラウザを作りたいんだけど、書店で本を探しても無くってさ
0087デフォルトの名無しさん垢版2020/05/10(日) 10:16:37.79ID:iOuxRny5
プロトコルはRFCをあたる
受け取ったデータの可視化やうそんこの文字指定から文字化け回避とか、そっちのほうは知らない
0088デフォルトの名無しさん垢版2020/05/10(日) 10:18:22.51ID:Fp1kS4OT
>>86
自作ゲームに、将来的に通信対戦の機能とかをつけたいから。
0089デフォルトの名無しさん垢版2020/05/10(日) 10:22:11.17ID:Fp1kS4OT
>>87
わかった。RFCを調べてみる。

あと、2ちゃんの別スレも見つかったから、それも調べてみる。
『ネットワークプログラミング相談室 Port30 [転載禁止]©2ch.net 』
https://mevius.5ch.net/test/read.cgi/tech/1414709836/
0093デフォルトの名無しさん垢版2020/05/14(木) 17:10:26.05ID:xR/PZA9p
32bit アプリサポート終了のお知らせ
0101デフォルトの名無しさん垢版2020/05/14(木) 19:38:59.13ID:wD9bKf3u
「どころか」
全然つながってない

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

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

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

Windowsに限定すれば今は32bit/32bitだけだが
0111デフォルトの名無しさん垢版2020/05/14(木) 21:16:04.45ID:uakMKPpl
まーた自分の希望的観測を大局的指針だと強弁しちゃう勘違い君が来ちゃったか
前と全く同じ事言っちゃってて進歩してないな
0113デフォルトの名無しさん垢版2020/05/14(木) 21:39:36.59ID:wbq2quQU
なんのこっちゃと思ったらOEM向けの32bit版OSを提供しなくなるってだけの話か
Windowsに関しちゃMSはゆーっくり削ってくねえ
0115デフォルトの名無しさん垢版2020/05/14(木) 23:55:54.26ID:7qxmxCRs
真っ赤な奴が一人で喋ってるというだけで信頼度0
0116デフォルトの名無しさん垢版2020/05/15(金) 01:57:25.78ID:T5z4Mqc/
この人前も同じ様なガバガバ理論を連レスしてたな

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

これをドヤ顔で推すのなら、同じ理論で128bitOSが出るまでは32bitアプリは生きることになるぞ
0117デフォルトの名無しさん垢版2020/05/15(金) 02:07:48.44ID:PClFYiSI
>>116
96bitで切ります
0123デフォルトの名無しさん垢版2020/05/15(金) 09:25:45.18ID:v3x5k1hP
インテルのロードマップによると次に出るのは80ビットプロセッサ。
0124デフォルトの名無しさん垢版2020/05/15(金) 10:32:06.39ID:Sz6wqqvQ
レジスタに名前つけてほしいんだ
r10とか無機質な使い捨て兵士みたいな奴よりraxやrbpのほうがかわいげがあるだろ
0128デフォルトの名無しさん垢版2020/05/15(金) 18:18:02.87ID:QE59VEMD
昔、昔、あるところでの対話
友人: おまえPC何使ってんの?
俺:   486/33
友人: ????????
0129デフォルトの名無しさん垢版2020/05/15(金) 18:45:16.23ID:sHW7IJmG
PCを問われてるのにCPUを答えたらそうなるだろ
車何のってんの?って聞かれてHR15DEとか言ったら
オタクを蔑む目で見られるだけだろ
0135デフォルトの名無しさん垢版2020/05/16(土) 12:36:13.35ID:is04b0b3
SSDとかすごそうだな
0137デフォルトの名無しさん垢版2020/05/16(土) 12:48:31.52ID:Os/XxFcn
>>133
8bitCPUと言われる奴にだって16bitレジスタはあったよ?
でもそれを16bitCPUとかいったら馬鹿にされるよ?
0140デフォルトの名無しさん垢版2020/05/17(日) 13:33:26.86ID:qdHuVgcd
>>127
アオいいよね
0141デフォルトの名無しさん垢版2020/05/24(日) 10:26:06.68ID:aVoyeE00
>>138
昔から定義があいまいだしな

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

子供ながらに早く定義を確定させろよと思ってたな
0144デフォルトの名無しさん垢版2020/05/24(日) 16:10:49.32ID:x8aMDsmm
8088だか8085だかもう忘れたが
0145◆QZaw55cn4c 垢版2020/05/24(日) 17:15:35.64ID:Y2PNnK8W
>>144
8085 は Z80 に似た位置付け
8088 は 8086 の 8 bit 版
0146デフォルトの名無しさん垢版2020/05/24(日) 18:23:26.62ID:WIKh9/kk
8080 は周辺回路用に、8251 (USART)、8253 (CTC / PIT)、8255(PPI)
というファミリがあったんだ。
「CHIPSET」というものの走りか。
0147デフォルトの名無しさん垢版2020/05/25(月) 11:49:32.24ID:xHeORMOB
64180やろ常考
0152デフォルトの名無しさん垢版2020/05/26(火) 19:24:46.61ID:kaVJ2d4/
アドレス空間の広さという定義もあった
さらに仮想アドレスや実アドレスに物理的サイズ(アドレス線の数)とか
0153デフォルトの名無しさん垢版2020/05/26(火) 20:41:32.11ID:tlZqmZqw
Win32でなんでこの話かとは思うが、基本的に
どれでも頭打ってる最小のビットがNならNビットCPUだろ
アドレスバスが32ビットでも命令長が16ビットのしかできなければそれは16ビットCPUだ
0160デフォルトの名無しさん垢版2020/05/31(日) 05:29:27.69ID:AV9N3TDc
何かしら新しいものを担ぎ上げたと思ったら梯外しを続けて屍累々だしね
泥林檎全盛時代モバイルWin大敗北という状況なのに、それでもUWPでバリバリ開発するぞってプログラマーなんて増えないだろ?と思ってたけど、この有様よ

>>158
我々の勝利でしょう
0161デフォルトの名無しさん垢版2020/05/31(日) 10:02:47.12ID:O94AXa21
EnumWindowsのコールバックの中でHWNDからEXEを割だそうとしてるんだけど
GWLP_HINSTANCEで取得したハンドルをGetModuleFileNameに渡してもうまくいかん
どうやんのコレ?
0163デフォルトの名無しさん垢版2020/05/31(日) 10:12:13.98ID:2cTTa+6C
全然関係ないけど、この略であってる?
なんか Win32API って、略しまくってて一見さんお断りって感じ

GWLP
Get Window Long Pointer
HINSTANCE
Handle to the Instance
0164デフォルトの名無しさん垢版2020/05/31(日) 10:23:14.96ID:xFqcIaF1
この略で書かれたオプションを使ってる関数名の略語なんだから別にこれは合理的だろ
GetWindowLongPtrAのオプションなのにEDH64_とかで始まってたら頭おかしいが
0165デフォルトの名無しさん垢版2020/05/31(日) 15:49:36.34ID:T8jWCE6M
HINSTANCE はハンガリアン記法じゃね
0170デフォルトの名無しさん垢版2020/05/31(日) 20:45:34.27ID:ttbYfwVJ
エラー情報ハンドルからエラー情報を取得するには関数を使います
0175デフォルトの名無しさん垢版2020/06/01(月) 10:19:00.27ID:GLKffah/
HFONT,HBRUSH,HDC,HPEN,etc
何でもかんでもハンドルとして扱ってるのに、HRESULTだけHEXかもなんて思うの?
0176デフォルトの名無しさん垢版2020/06/01(月) 10:51:47.09ID:INZFVYtf
>>175
HEXと思うのはどうかと思うけど
> HFONT,HBRUSH,HDC,HPEN,etc
こいつらはハンドルだけどHRESULTの型はlongだし値もどう見てもハンドルじゃないからあーだこーだ言ってるんだろ
0177デフォルトの名無しさん垢版2020/06/01(月) 11:03:16.80ID:17VfLqvo
通常voidだがエラーの場合は符号付きのlongにしてるだけ
実質型を隠蔽してハンドルとして扱うのは慣例みたいなもんだし、気にする必要は無い
0179デフォルトの名無しさん垢版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.
ってことだろ
0181デフォルトの名無しさん垢版2020/06/01(月) 11:56:51.06ID:Lo4SeZQj
>>173
だから意味不明な "interface not supported" とか返ってくるのか
Cだとエラー情報の領域管理が面倒なのはわかるけど固定で5個ぐらい持つとかやりようはあったと思うんだけどね
0183デフォルトの名無しさん垢版2020/06/01(月) 17:38:12.77ID:JphI8rwQ
>>176
bool なのに 0 と 1 と -1 とか帰ってくる API に何求めてんだ
0186デフォルトの名無しさん垢版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);
}
0187デフォルトの名無しさん垢版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.
エラーです。
0188デフォルトの名無しさん垢版2020/06/05(金) 14:23:44.24ID:WSRdRexs
失格
やり直し
0190デフォルトの名無しさん垢版2020/06/05(金) 18:41:24.19ID:+T3Zxd1w
ここ Win32 API の質問箱なんですが、
WaveDeviceII とやらがなんなのかをノーヒントで推測する能力が求められてます…?

…そもそもリンク先見てないけど
0192デフォルトの名無しさん垢版2020/06/05(金) 19:58:06.58ID:D0XPmYCp
WaveOutDeviceIIに名前変えなきゃ。。。

>>191
うーん。他のアプリで音が鳴らないわけじゃないのだけど。うーん。
0193デフォルトの名無しさん垢版2020/06/05(金) 20:09:06.67ID:kzWGRm1w
>>187
具体的にエラーを出したAPIを特定して、その仕様をググって調べてこい。
あとその英語のメッセージに具体的に何をしろと欠いてあるからそれも調べて試してこい。
0194デフォルトの名無しさん垢版2020/06/06(土) 19:05:08.37ID:XjfTk0ib
接続されているUSBメモリの名前ってどうすれば取得できますか?
ドライブレターではない名前で、メーカー名とかが含まれるやつです。
例:SONY、Transcend
0198194垢版2020/06/06(土) 22:20:22.51ID:XjfTk0ib
>>196-197
おおお!!ありがとうございましたぁ!!
0199194垢版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

自分は最後の方法でうまくいきました!
0201デフォルトの名無しさん垢版2020/06/15(月) 19:04:01.61ID:tqTNgz/u
GDI+のスレッドがないのでここで質問させていただきます。。
SetStretchBltMode(COLORONCOLOR)の描画をGDI+のDrawImage()でやろうと思ったら、
どのような指定をすればよいのでしょうか。
なにも指定しないままだと補間がかかってしまうのですが。
0204デフォルトの名無しさん垢版2020/06/16(火) 17:03:02.58ID:i4a8GiUa
答えになってないように見えるけど
メモリコンテクスト相手にGDIで SetStretchBlt かけて出来上がったものを
GDI+ のDrawImage()に渡せということかしら
0205161垢版2020/06/19(金) 12:23:58.37ID:UjmatHu8
>>162
できた dx

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

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

>>208
ざっとしか見てないのですが、
OpenCVを使ってキャプチャしてるので合ってますでしょうか。
OpenCVでは無くwindows APIを使ったサンプルがあったら助かります。
0213デフォルトの名無しさん垢版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なんていまさら論外。
0214206垢版2020/06/21(日) 19:29:16.51ID:kUjMwJEz
>>212
Video for Windowsも検討したのですが、
かなり古いAPIみたいでいつまでサポートされるか不安だったので
DirectShowかMedia Foundationでいこうと考えていました。
0217デフォルトの名無しさん垢版2020/06/22(月) 17:43:47.11ID:5/AaGMJP
まぁ、やり方は色々あるよね
私だったらキャプチャするDirectShowのフィルターだけ作って
モニタ表示はフィルター構築できるプレーヤーに任せるかな
0219デフォルトの名無しさん垢版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がインストール出来なくて苦戦した。)
0220デフォルトの名無しさん垢版2020/06/22(月) 21:34:56.69ID:NxxL+RwQ
そりゃカメラの出力フォーマットだな。ものによってはmpegやmjpegで出力できるカメラもあったりするが。
画像ファイルフォーマットの出力はWICとかを使うことになるだろうけど、そこへの並び替えはたぶん
自分でやるしかない。
0221デフォルトの名無しさん垢版2020/06/23(火) 09:37:14.54ID:4kHZmTBE
>>219
OpenCV 使え
0223206垢版2020/06/24(水) 00:00:36.72ID:yIpXk3ZI
https://docs.microsoft.com/ja-jp/windows/win32/medfound/mfcaptured3d-sample
このサンプルをよく見たら、動画を吸い出しているのではなくて、
静止画を1フレームずつ、RGB32フォーマットに変換して画面に表示しているだけみたいでした。
RGB32フォーマットならとりあえず、保存・表示が出来そうなので、
このサンプルを使って静止画をキャプチャする方針で進めようと思います。

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

トップウィンドウのCreateWindowで指定するサイズはピクセル単位で外枠を含めたサイズ。
子コントロールの位置は、トップウィンドウの中のクライアント座標系で指定し、子コントロールのサイズはピクセル単位で子コントロールの外枠を含めたサイズ。
トップウィンドウでクライアント領域のサイズを指定したい場合はAdjustWindowRectEx関数を使用する。
0226蟻人間 ◆T6xkBnTXz7B0 垢版2020/06/24(水) 16:03:25.28ID:SnGEO7rh
スクリーン座標とクライアント座標を相互に変換したい場合はMapWindowPointsかMapWindowRectを使用する。
0228デフォルトの名無しさん垢版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づつ縮むみたいな説もあるようですがそのせいなんでしょうか
0229デフォルトの名無しさん垢版2020/06/24(水) 18:08:11.67ID:irp07WaX
>>228
Widthなどは、同じ値じゃ駄目。
TopWindowの左右のBorderのドット数を引き算した値を、子ウィンドウの
Widthに指定する必要がある。
どのくらい引けばよいかは、>>225-227 で求める。
0230デフォルトの名無しさん垢版2020/06/24(水) 18:11:54.40ID:irp07WaX
>>228
TopWindowのWidthは、枠を除いた部分のドット数ではなく、
枠まで含めたドット数。
だから、ChildWindowのWidthと同じに設定してしまったら、
必ずChildWindowが収まりきれなくて枠にクリッピングされてしまう。
0231デフォルトの名無しさん垢版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にしてみたら丁度良くなりました。
どうもありがとうございました。
0232デフォルトの名無しさん垢版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 を処理すればツールチップ表示は可能なのですが、
それ以外に方法は無いのかなと。
0233蟻人間 ◆T6xkBnTXz7B0 垢版2020/06/25(木) 17:48:21.56ID:CRgrEcBh
>>232
iStringへのキャストで変なことしてない?
x64ではポインタ型と32ビット整数には互換性ないよ。
0235232垢版2020/06/25(木) 18:12:29.19ID:lHQabM2A
>>233
iString は INT_PTR なので x64 だと64ビット長で互換はあるかと思います。
キャストは reinterpret_cast<INT_PTR>を使ってます。

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

x86がANSIでx64がUnicodeビルドになってたりしないか?
0243デフォルトの名無しさん垢版2020/06/26(金) 14:02:58.76ID:PjbtVFt+
>>242
+1
0244デフォルトの名無しさん垢版2020/07/10(金) 22:47:33.40ID:c4ANmjzx
たとえば、編集不要なアセンブルリストを表示して、デバッガでステップ実行するようにボタンをクリックして現在行を反転させながら表示したいとしたら、もちろんループやジャンプもあるのですが、どのコントロールを使用しますか?
行数は10,000位にはなります
自分でクライアント領域に書きますか?
0248デフォルトの名無しさん垢版2020/07/25(土) 14:18:05.35ID:JLD5gc9b
ドライブ文字を変更したら、PdhAddCounterでLogicalDisikの
パフォーマンスオブジェクトを追加できなくなりました。エラーが返ってくる。
再起動してドライブ文字元に戻しましたがやはりダメです。
typeperf -qを実行してオブジェクトの一覧見てもLogicalDiskの項目がないです。
また取得できるようにするにはどうしたらいいでしょうか?
0249248垢版2020/07/25(土) 14:48:11.84ID:JLD5gc9b
自己解決しました〜!
コマンドプロンプトからlodctr /rを実行すると
パフォーマンスオブジェクトを再構築出来てそれで大丈夫でした!
お騒がせしました。
0250デフォルトの名無しさん垢版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
0252デフォルトの名無しさん垢版2020/08/02(日) 16:28:19.35ID:hIQzyyzC
多言語からの呼び出しに対応するためにメタデータに拡張の入ったCOMとでも思っておけばいいよ
APIによってはデスクトップから呼べなかったりするのもあるけど
Win32APIかどうかを議論する意味はない
0254デフォルトの名無しさん垢版2020/08/03(月) 13:41:03.78ID:3aFKjSal
関数を使います
0255デフォルトの名無しさん垢版2020/08/03(月) 22:17:32.43ID:uGqrBkR1
糞翻訳はポイーで
0257デフォルトの名無しさん垢版2020/08/20(木) 16:41:05.34ID:TZFigD9E
IMEで確定前の入力をキャンセルされるにはどうすればよいでしょうか?
0259257垢版2020/08/20(木) 17:04:27.56ID:TZFigD9E
>>257
自己解決しました

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

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

まあ>267の言うとおりの問題はあるので、Windows全般でどうなっているのかという
判断が必要ならば仕様の見直しが必要
0273デフォルトの名無しさん垢版2020/08/22(土) 12:46:26.84ID:oUSNiZjo
>>266
やはり、フックですか。
実は、この件でのフックでの実験は既にやってみて、成功したことがあります。
ただし、フックは、32BITと64BITで DLL を分ける必要があるため、
実験したのは、32BITのみでした。
64BITにも対応しなくてはならないので、手間がかかるので中断してます。
0274デフォルトの名無しさん垢版2020/08/22(土) 15:55:52.64ID:hVxrtALE
>>262
GetDC(null)で画面全体のdevice contextを取得
bitblt()で画面イメージをメモリーDCに取得
>画面右下に IMEのON/OFF状態が表示
の部分を画像比較でON/OFF状態を判定
0277デフォルトの名無しさん垢版2020/08/23(日) 12:54:28.26ID:SVuEjc7r
>>276
そうでしたか?
フックを始めるための API 関数名やフラグ定数名やモードなどを教えていただければ幸いです。
0279デフォルトの名無しさん垢版2020/08/23(日) 14:07:51.37ID:Exm+Pt+Z
32bit用に描いたフックを64bit用に描き治すのってそんなに大変?
0281デフォルトの名無しさん垢版2020/08/23(日) 15:50:19.81ID:a/7Z84eB
普通にsetwindowshookexでできるぞ

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

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

>>277
IMEのON/OFFのキーバインドなんて環境で様々なんだからキーボードフックなんかじゃ実現無理なの分かれよ
アプリ側でもプログラム的にON/OFFするのに
そもそもアプリ問わずIMEの状態を取得する意味あるのか?何したいんだよ
0289デフォルトの名無しさん垢版2020/08/30(日) 15:09:45.20ID:GgAZZaQa
質問が間違ってるから答える気にもならないことはある
0293デフォルトの名無しさん垢版2020/08/30(日) 19:00:20.18ID:ClA8nGT1
皆キーボードフックしか言ってないけど
IMN_SETCONVERSIONMODE捕まえればいいやん
それもやったってんなら64bit対応するだけやん
0295デフォルトの名無しさん垢版2020/08/31(月) 21:02:36.79ID:fGHCeYBV
ONだと普通の数字は全角なのに
テンキーだと半角
ちゃんと分岐してるならテンキーのうにょうにょも無しにしたらいいのに
0296デフォルトの名無しさん垢版2020/09/07(月) 07:46:03.38ID:h3kjQIhT
おまいらGetCommandLineが返した文字列からコマンド名だけ除いた部分て、どうやって得てる?
0299デフォルトの名無しさん垢版2020/09/07(月) 08:39:11.94ID:h3kjQIhT
やっぱり自前でコマンド名だけ取り除くしかないのかな
空白や引用符に特別な意味を持たせたくないんだけど
0301デフォルトの名無しさん垢版2020/09/07(月) 10:21:46.55ID:Egt+Qwmp
結果にコミットする気が無い回答者たち
0304デフォルトの名無しさん垢版2020/09/07(月) 14:10:25.67ID:MtDNWdkb
CreateProcess見るといろいろな指定の仕方ができそうで不安になるよね
0308デフォルトの名無しさん垢版2020/09/08(火) 01:38:27.47ID:BXhGoa38
質問なんですがWindowsのカレントディレクトリって
アプリ毎に持ってるものなんでしょうか?
それとも全アプリ共通なのでしょうか?
0311デフォルトの名無しさん垢版2020/09/08(火) 11:55:58.97ID:POT3YWIT
プロセスごとだろ
嘘つくなよ
0314デフォルトの名無しさん垢版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:

・・・
0315デフォルトの名無しさん垢版2020/09/08(火) 13:29:57.92ID:oUJlYCUI
ということは、同一プロセス内の別スレッドでSetCurrentDirectoryが発行されると
自スレッドのカレントがいつの間にか変わっているということが起きるのか
0316デフォルトの名無しさん垢版2020/09/08(火) 13:50:32.04ID:JNlu12o+
カレントディレクトリの取得なんて、グローバル変数から情報を取ってくるようなもんなので危険ってことだ
そんなもん使うな
0317デフォルトの名無しさん垢版2020/09/08(火) 14:09:32.72ID:5CeoL0rA
>>315
もちろんそういうこと。
というより、カレントディレクトリも、広い意味で「UI」に関係したものと
考えられなくもないので、必ず Mainスレッドから取得するようにすれば、
安全と言える。絶対そうしなくてはならないわけではないが。
Window作製、グラフィック描画、マウス、キーボードからの入力なども、
Mainスレッドで行うのが原則。
これも絶対そうでなくてはならないというわけではないかも知れないが、
敢えて Subスレッドでやる意味も余り無い事が多く、Mainスレッドに限定
すれば、さまざまな危険回避のための余計なことを考えなくて済むメリットがある。
0318デフォルトの名無しさん垢版2020/09/08(火) 14:13:07.26ID:5CeoL0rA
>>317
補足すれば、カレントディレクトリは、MS-DOS時代では、command.com
が管理していたもので、アプリごとに異なるわけではなかったはず。
というのは、カレントディレクトリを便利に変更できるツールを作りたい
場合などに、アプリローカルであれば、不便だったからだと思う。
その設計哲学や文化や習慣が、Windowsにも受け継がれる必要は有ったと思う。
Unixの環境変数なども、アプリローカルになっていたりするが、意外と不便な
事も多い。
0320デフォルトの名無しさん垢版2020/09/08(火) 18:38:57.08ID:HYNPtfS+
>>315
>自スレッドのカレントがいつの間にか変わっている
自分で管理できないスレッドなんてあるのか?
その別スレッドだって自分で作ったものだろ?
DLLとか自分で管理していないものもあるけどそれはスレッド関係ないわけだし
0322デフォルトの名無しさん垢版2020/09/08(火) 19:34:11.85ID:oUJlYCUI
>>320
別スレッドにするってことは自スレッドとの間にタイミングの束縛がない処理を任せるってことだよな
カレントディレクトリの変更がプロセス内の他のスレッドにも伝搬するということは
それはタイミングの束縛が生じうるってことだろ
つまり、それが困るなら別スレッドにしてはならない処理内容ってことで
そこの判断こそが「自分で管理」ということだ
0325デフォルトの名無しさん垢版2020/09/08(火) 22:47:13.26ID:txiCBqFi
スレッドがお互いを信用できないとか、そんな羅生門みたいなプログラムは嫌だなぁ。
0327デフォルトの名無しさん垢版2020/09/09(水) 00:11:58.92ID:VoppH/up
指定フォルダ以下のファイルをすべて処理するプログラムで
サブフォルダごとにスレッドを起動してみよう
0328デフォルトの名無しさん垢版2020/09/09(水) 09:51:28.66ID:9MEEjZyT
フォルダ間移動ですね判ります
0329デフォルトの名無しさん垢版2020/09/09(水) 11:03:42.50ID:w9YsWEn5
そんなバッチファイルみたいなアルゴリズムでカレントディレクトリ移動しながらマルチスレッドをやるとかがそもそも迂闊だよな。
0330デフォルトの名無しさん垢版2020/09/10(木) 08:55:55.87ID:YCiClA3r
>>329
マルチスレッドじゃなくてマルチプロセスなら作業ディレクトリは完全に分離できる。
せっかくマルチタスクOSを使っているのだから、別プロセスに丸投げするのが最適だよ。
0331デフォルトの名無しさん垢版2020/09/10(木) 08:57:16.11ID:YCiClA3r
タスクマネージャー開けばわかるけど、今時のWebブラウザ(具体的にはEdgeやFirefox等)はたくさんの子プロセスを動かしている。
0336デフォルトの名無しさん垢版2020/09/22(火) 08:18:54.27ID:EoOf3jnh
win32apiを使っている人は、普段の文字コードは
stringとwchar_tを使っているのでしょうか。
0338デフォルトの名無しさん垢版2020/09/22(火) 12:46:05.64ID:EoOf3jnh
ありがとうございます。
調べてみます。

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

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

考えてみれば実運用でこの部分は文字リテラル決め打ちにめったにならないから
知らずに回避してることも多いのかも
0340デフォルトの名無しさん垢版2020/09/22(火) 14:14:47.55ID:iCejn/78
>>336
>>338
wstring
0342デフォルトの名無しさん垢版2020/09/22(火) 14:16:37.87ID:5Q3AK6nV
LPTSTR で受け取ってるから書き換え可能なメモリアドレスでないとあかんのじゃないのん?
リテラルは const で書き換え不可だし 一回変数経由しないと
0343デフォルトの名無しさん垢版2020/09/22(火) 14:22:15.75ID:uF0JvJPV
自転車🚴のような絵文字をstd::stringで持つにはSJISではなくUTF-8として保持しておいて、
画面などの出力する直前にUTF-8からUTF-16に変換してUnicode版出力関数を呼び出す必要がある。
0344デフォルトの名無しさん垢版2020/09/22(火) 15:28:51.96ID:J6Z/5nZW
>>339
>lpCommandLine
>実行するコマンドライン。
>この文字列の最大長は、Unicodeで終了するnull文字を含めて32,767文字です。 lpApplicationNameがNULLの場合、lpCommandLineのモジュール名の部分はMAX_PATH文字に制限されます。
>この関数のUnicodeバージョンであるCreateProcessWは、この文字列の内容を変更できます。
>したがって、このパラメーターを読み取り専用メモリー(const変数やリテラル文字列など)へのポインターにすることはできません。
>このパラメーターが定数文字列の場合、関数はアクセス違反を引き起こす可能性があります。
0346デフォルトの名無しさん垢版2020/09/25(金) 10:57:09.24ID:4ovx1Tzj
非 const の引数に const リテラル与えたら
コンパイルエラーにならないか?
0349デフォルトの名無しさん垢版2020/09/25(金) 18:33:43.19ID:M9uVftQk
Win32API全部作り直してほしい
くだらない部分で人間の時間を消費しすぎだろw
0359デフォルトの名無しさん垢版2020/09/28(月) 15:10:38.57ID:q9HWvXQA
穴がさらにいっぱい見つかって攻撃方法が増えるんだから自明だろ
誰が対応するんや
0360デフォルトの名無しさん垢版2020/09/28(月) 16:14:01.27ID:n0MW1Etw
久しぶりに Windows Update したら
Edge レイプされてポカーン
0367デフォルトの名無しさん垢版2020/10/27(火) 20:43:03.29ID:rXCQsaV4
GetOpenFileName で初期ディレクトリとして OPENFILENAME の lpstrInitialDir に
任意のディレクトリを指定してファイルを開くダイアログを開いていて、おおよそ
意図した通りに動いているのですが、"C:\Users\Public\Documents"を指定したときだけ
初期ディレクトリが現在使用中ユーザーのドキュメントディレクトリになってしまいます

アクセス権のない他のユーザーのドキュメントディレクトリを指定したのなら
このような動作は理解できるのですが、パブリックディレクトリでこのように
なってしまうのは仕様でしょうか?
0368デフォルトの名無しさん垢版2020/10/28(水) 11:43:37.22ID:Mf8tEr2f
SHGetSpecialFolderPath
0369デフォルトの名無しさん垢版2020/10/28(水) 17:45:50.04ID:DoZwgPmf
パブリックディレクトリの取得方法を聞いているわけではないのですが
"C:\Users\Public\Documents" は存在する有効なパスです
0370デフォルトの名無しさん垢版2020/10/28(水) 18:30:52.56ID:Mf8tEr2f
再現した
C:\Users\Public
ならちゃんと public が開くが
C:\Users\Public\Documents
にすると自分のアカウントに行ってしまう
0371デフォルトの名無しさん垢版2020/10/28(水) 18:36:57.63ID:Mf8tEr2f
あと存在しないディレクトリを与えると
C:\Users\自分のアカウント\Documents
が開いた
0372デフォルトの名無しさん垢版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.
0373デフォルトの名無しさん垢版2020/10/28(水) 19:43:23.12ID:RpzUgl/d
comdlg32.dllのコモンダイアログ関係は >>367 のような想定外の動きをしたり
右クリックのコンテキストメニューで存在しない32bitフォルダを探しに行ったりと色々不具合を抱えてる
明らかにメンテされてない
ダイアログ内のListViewで開発者の想定外の事ができたりするから許されるなら使わない方が良い
0374デフォルトの名無しさん垢版2020/10/28(水) 20:10:50.98ID:xBovneds
コモンコントロール使ってるアプリに使うなと言ってしまうと、開発プラットフォームから見直さないとダメ案件では
0375デフォルトの名無しさん垢版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
確かに他にも怪しい挙動があるので差し替えたい所ですが、そんな単純にコモンコントロール部分だけ
差し替えが可能なものがあればいいのですが・・
0376デフォルトの名無しさん垢版2020/10/29(木) 11:27:15.51ID:wwhOrfBp
XP 以前と 7 で違うんだから
10 ならさらに変更されたとかありそう
0377デフォルトの名無しさん垢版2020/10/29(木) 11:29:27.07ID:wwhOrfBp
>コモンコントロール部分だけ差し替えが可能なもの

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

ただ、[5:]と[6:]の間にSleep(10000)を挟んでみた。OSが手放してくれる時
間?が必要かと思って・・・でも、そういう事じゃないみたい。
ボタンの配置はすぐには難しいですが(汗)。でも、とりあえず、物は試しで
ユーザの入力待ちを挟んでみます。getch()あたりで・・・。
0384デフォルトの名無しさん垢版2020/11/12(木) 12:17:21.07ID:f5BAQJxF
あと 6 だけ実行する別のアプリを造っておいて
アプリ終了後にそれを呼ぶとか
0387デフォルトの名無しさん垢版2020/11/12(木) 12:31:44.05ID:Twa29Hwt
379です。進展しそうなので、この質問はいったんクローズさせてください。
グーグル先生に「dll_process_detach 呼ばれない」と聞くと、イロイロ出て
きそうです。

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

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

なるほど
自分以外が使ってないことが確実に言えるならこれで良いんじゃないかな
0399デフォルトの名無しさん垢版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。
0401デフォルトの名無しさん垢版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 に示してあります。
フックの初回呼び出しにリファレンスが追加・・・かなぁ(妄想。
0403デフォルトの名無しさん垢版2020/11/15(日) 19:54:35.90ID:pziaxEZW
というか>>379でいうと
> 3:  ...あれやこれやの処理...
ここに原因があるってことでしょ
そこ次第じゃないの?
0405デフォルトの名無しさん垢版2020/11/15(日) 20:46:59.18ID:ALi3WLRE
LoadLibraryの参照カウンタって簡単に取れたっけ?
昔DDKのヘッダ持ってきてゴニョゴニョやった気がする。
しかもwin7と8以降で構造体定義が違ったり。
0406デフォルトの名無しさん垢版2020/11/15(日) 20:52:47.67ID:gutimSe2
成功するまで n回 FreeLibraryを試みて LoadLibrary しなおす?
ATTACH と DETACH が副作用おこすかもだけど
0407デフォルトの名無しさん垢版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
するループ内で参照カウンタが変化かもとかゾッとします。

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

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

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

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

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

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

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

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

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

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

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

自分が増やした分だけを、減らすべき!
0421デフォルトの名無しさん垢版2020/11/16(月) 12:21:40.31ID:sF1WJXNT
全部読まずにresするが
元々自分のexeの依存dllにそのdllを入れちゃってるのに
さらにLoadLibraryしてるとかかな
0423デフォルトの名無しさん垢版2020/11/24(火) 20:44:41.98ID:/h51r/r1
>>421
俺もそう思う
静的リンクと動的リンク合わせて2回呼ばれていると思う
0428デフォルトの名無しさん垢版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使ってコード書こうかと思ったがガックリだわ
0429デフォルトの名無しさん垢版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.
0431デフォルトの名無しさん垢版2020/12/08(火) 15:48:41.35ID:jRmhdWmE
なぜですか?
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13212452128

質問者からのお礼コメント
小学生でもわかるような回答ではなく、なぜそうなのかも回答できないと社会人として微妙ですよ。
わかる箇所だけ答えるのはニワカです。
0433デフォルトの名無しさん垢版2020/12/13(日) 17:26:48.55ID:/mwshU+q
AllocConsoleでコンソールを開いてそこからstdio.hのscanfしたいのですが、
ノンブロッキングではないので呼び出し側が固まってしまいます。

そこでscanf的な機能をもつノンブロッキングな関数をつくりたい。
FILE_FLAG_OVERLAPPEDでCONIN$を開いてReadFileで読むまではいいのですが
ReadFileしていない間の入力もバッファリングしてしまいます。そういう機能だから当然ですが。
このバッファリングをうまくオンオフする方法、もしくはバッファを棄てる方法はないでしょうか?

それともFILE_FLAG_OVERLAPPEDではない別の方法があるのでしょうか?
0436デフォルトの名無しさん垢版2020/12/13(日) 17:37:07.75ID:/mwshU+q
>>434
ありがとうございます
sscanfはもちろんするのですが、その前段階、文字列を読み込む部分が上手くいっていないのです。
0439デフォルトの名無しさん垢版2020/12/13(日) 18:26:49.33ID:/mwshU+q
setvbufやfreopenはcランタイムの関数で、バッファもOVERLAPPEDのバッファとは違う気がします
freopenしたstdinからのscanfがブロックされてしまうというのが443の話なので
そこからノンブロッキングのAPIを使う必要があるのでは、ということになったわけです
0440デフォルトの名無しさん垢版2020/12/13(日) 19:01:38.77ID:/mwshU+q
ReadConsoleってAPIもブロッキングなので使えないわけですが、低レベルなReadConsoleInputというのもあるらしく
OverlappedでのReadFileよりこっちの方が正攻法なようです。
ともかくやってみます。
ありがとうございました。
0441デフォルトの名無しさん垢版2020/12/13(日) 20:23:25.03ID:casXcC2M
>>433
プログラム側で「この時点以降の入力を有効とする」タイミングは管理してないの?
その時点でバッファされてる物を一旦読み捨てれば良いだけでは?
0442デフォルトの名無しさん垢版2020/12/13(日) 21:23:50.52ID:w0iK+TRN
生のコンソールは制約が多いから
コンソールアプリの入出力を奪って適当なコンソールもどき作った方が早そうだけど
0443デフォルトの名無しさん垢版2020/12/14(月) 00:15:39.66ID:pdqk93XN
スレッド作ってブロックさせておけば良いと思うんだけど
正直な話>>442
バージョンによって微妙に動きが異なるし
0444デフォルトの名無しさん垢版2020/12/14(月) 11:31:29.18ID:AspHUlaN
>>443
ありがとうございました
ブロックしないじゃなくてブロックしても大丈夫にして上手くいきました

バッファの方は事前にFlushConsoleInputBufferで解決しました
0445デフォルトの名無しさん垢版2020/12/14(月) 12:14:03.24ID:GY9gb+Ps
コマンドプロンプトのコンソールを使う案件は、スクリプト言語とのプロセス通信を使ったほうが幸せになれる確立が高い。
0448デフォルトの名無しさん垢版2020/12/28(月) 00:26:19.90ID:222C9err
__declspec(thread)の変数ってスレッドごとに記憶域をもつわけですが
APIのTlsGetValue等でどうやって実現してるんでしょうか?

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

コンパイラが__declspec(thread)の変数があった時に、どのようなコードを出力しているか
逆アセンブルしてみると理解が深まると思われます
0450デフォルトの名無しさん垢版2020/12/28(月) 09:50:34.64ID:222C9err
>>449
ありがとうございます
昔はTlsGetValueを使ってたのが、今はセクションが新設されてそこに作ってるんですね
0451デフォルトの名無しさん垢版2021/01/01(金) 22:20:09.03ID:kFKOiQ+I
VirtualAllocとHeapAllocの違いについてなんだけど
HeapAllocもヒープ残量以上のサイズを渡したらどの道VirtualAlloc呼ばれるって認識でいい?
0453デフォルトの名無しさん垢版2021/01/02(土) 09:33:50.89ID:Li/cNK13
>>452
ある程度大きいサイズのメモリ確保だとVirtualAllocの方が早くなるからそう勘違いしてたけどそういう訳じゃないんだね
最初に実際にアクセスした時に初めて実際にメモリ割り当てが行われるとかの挙動がHeapAllocでも走るってだけか
0454デフォルトの名無しさん垢版2021/01/02(土) 09:59:10.06ID:r4407Ytg
virtualの方がよりローレベルなので
チャンクアロケーターをMSのレベルを
超えて作れるか、ほぼ解放しない前提
のブロックを確保するとかでないと使わない。

普通のmalloc風に使うなら、ヒープ領域毎
あぼーん出来るCreateHeapの方が使い易い
0455デフォルトの名無しさん垢版2021/01/12(火) 15:11:58.85ID:LUlB/OIG
あるstaticなlibが既存の場合(.hで関数の引数がTCHAR *使用)
それがANSI用にコンパイルされたlibなのか
それともUNICODE用にコンパイルされたlibなのか
既存のバイナリのlibだけから判断する方法はありますか?

#ソースは.cppでTCHARで書かれているものがあったので
#そこから-DUNICODEであらためてコンパイルすれば解決はしたのですが
#上の質問の解決策があるなら知りたいです
0456デフォルトの名無しさん垢版2021/01/12(火) 15:19:23.66ID:gjvDcKpD
>>455
C++の場合なら、ライブラリをdumpbinなどで調べて関数のマングリン化名を見れば分かる。
plain Cの場合は、実際にライブラリに1文字が2バイト以上のUNICODE文字を送ってみて、
正しく動作するかどうかテストしてみると分かる。
0457デフォルトの名無しさん垢版2021/01/12(火) 15:40:36.07ID:gjvDcKpD
>>456
plain C の場合、他の方法としては、
1. dumpbinでライブラリ関数を逆アセンブルしてみて、引数の扱いがbyteに
 なっているか、wordになっているかを調べれば分かる。
2. ライブラリの関数を呼び出すコードを書いてみて、デバッガで、ライブラリ関数の
 中を逆アセンブルする。
0458デフォルトの名無しさん垢版2021/01/12(火) 15:41:24.71ID:LUlB/OIG
もしかしてマングリの PEB_W とかのが UNICODE 用ってことでしょうか?
0459デフォルトの名無しさん垢版2021/01/12(火) 15:52:56.37ID:gjvDcKpD
>>458
デマングラー
なるものが(ブラウザ上アプリとして)ネットであって、関数のシンボル名
を入れると関数プロトタイプ宣言に直してくれるので試すべし。
0462デフォルトの名無しさん垢版2021/01/15(金) 15:06:23.40ID:4rSXG5WT
STDAPI と __declspec(dllexport) を同時に使うと怒られるんだけど
原因は何が考えられますか?
__declspec(dllexport) を使わずに .def ファイルで .dll を作成することは可能なのですが
.def を使わずに __declspec(dllexport) で .dll を作成しようとすると失敗します
0465デフォルトの名無しさん垢版2021/01/15(金) 15:16:41.23ID:PcvYNCYN
STDAPI は 暗に extern "C" を含んでてでマングリングなしの素
C++で _declspec(dllexport) の場合マングリングする
それで衝突してるんでないの?
0468デフォルトの名無しさん垢版2021/01/19(火) 04:48:40.40ID:gq4TTO9r
Windows10環境、お互いに管理者権限ありでPostMessageしても反応してくれないソフトがあったのですが
互換モードでWindows7を選択すると反応してくれるようになりました
そこで疑問に思ったのですがこの違いの原因は何でしょうか?
0470蟻人間 ◆T6xkBnTXz7B0 垢版2021/01/19(火) 16:36:03.29ID:dOqXDJ4/
ここを見ている人のために念のため貼っておくよ。ご参考に。

Win32のリファレンス マニュアル
Win32.chm http://laurencejackson.com/win32/
右クリックして「プロパティ」を選び、「許可する」をクリックして「OK」ボタンを押せばセキュリティのブロックを解除できます。
0471デフォルトの名無しさん垢版2021/01/20(水) 05:28:55.77ID:4MsON1Bd
>>469
ありがとうございます
そのページは私も確認したのですがお互いに管理者権限ありなので下記に該当すると思います
>自身が 管理者権限で走っていれば この制限は無くなります。
ポストに成功する互換モードでもお互いに管理者権限ありなのでWindows7と10の違いが原因だと思ったのですが具体的に何が違うのか分からず…
0472デフォルトの名無しさん垢版2021/01/22(金) 11:43:02.03ID:LpWHKWeZ
64bitと32bit混在とか
LONG/HWNDの長さ違いとか
0474デフォルトの名無しさん垢版2021/01/23(土) 17:16:39.51ID:5Na5U87Z
C#は?
0477デフォルトの名無しさん垢版2021/01/28(木) 11:08:41.51ID:dNWrUHbO
生暖かく応援するである
0478デフォルトの名無しさん垢版2021/02/04(木) 20:13:07.23ID:m67WeuC9
フルパス以外でのファイル固有のユニーク値ってBY_HANDLE_FILE_INFORMATIONのnFileIndexHigh、nFileIndexLow以外に何かない?
0483480垢版2021/02/05(金) 08:22:01.08ID:AkHBgQOB
>>482
まさにこれです!
ありがとうございました!
0484デフォルトの名無しさん垢版2021/02/05(金) 11:21:57.41ID:L6Uw8oZz
>>479>>481
膨大な量のファイルを列挙するにあたってハッシュ計算するのも、ハンドル開いてBY_HANDLE_FILE_INFORMATION読み込むのも億劫だったんだが
NtQueryDirectoryFileでmftからファイルID取れるってことに気付いた
0486デフォルトの名無しさん垢版2021/02/06(土) 00:30:35.01ID:L1ZLjs+J
コントロールパネルでフォントを「非表示」にすると、言語に応じて
フォント選択画面に出てこなくなり選びやすくなるという機能があります。
この「非表示フォント」かどうかを判別する方法はありますでしょうか?

ChooseFont()ではなくEnumFontFamiliesEx()を使い、独自のフォント選択ダイアログを作成中ですが
非表示フォントを判別する方法がわからずすべて列挙してしまいます。
0488デフォルトの名無しさん垢版2021/02/06(土) 02:04:53.58ID:L1ZLjs+J
>>487
ありがとうございます!
レジストリに「非表示フォント」の一覧が記録されているのですね。
その内容を取り出して比較してフィルタリングしたいと思います。
0489デフォルトの名無しさん垢版2021/02/13(土) 06:46:11.29ID:neaggcXJ
ExpandEnvironmentStrings() は、%環境変数%を展開してくれるけど、
PowerShellの$env:環境変数 を展開してくれるAPIとかないのかな?
0491デフォルトの名無しさん垢版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
0492デフォルトの名無しさん垢版2021/03/03(水) 09:48:23.14ID:GTR/ytE6
Win32の質問というよりOSの仕様に近い質問になってしまいますが、
新しくファイルを作るにあたり予めファイルサイズが分かっている場合、SetFilePointerEx&SetEndOfFileで予めファイルサイズを決めておくと断片化しづらいというテクニックがありますが
一度のWriteFileで一気に書き込む場合は上記の工程を行わずとも断片化しづらいのでしょうか?
0493デフォルトの名無しさん垢版2021/03/03(水) 17:46:09.32ID:Uextqx1e
本当にそんな制御になっているか分からないけど理屈だけだと、最初に一発ここまで
使うよって宣言しておけば領域が一挙に確保されるかもしれない

逐一書き込みを行ってその度に領域を確保すると、システム全体がシングルスレッドで
動いていれば(ありえないけど)、自分が書き込みを行っている間に別の
プロセス/スレッドが書き込みを行うと、領域が分断されると思うのだけど
0494デフォルトの名無しさん垢版2021/03/09(火) 14:20:50.29ID:iP4nVCks
断片化対策というか
常に同じセクタに書き込むように出来なかったっけ?
0495デフォルトの名無しさん垢版2021/03/09(火) 23:41:10.45ID:zAPDJC3N
高速ファイルコピーのフリーソフトの作者のブログか何かでこんだけWindowsのコピーは大変だよみたいな記事を読んだ覚えがある
0498デフォルトの名無しさん垢版2021/03/10(水) 09:21:13.05ID:XSc6HIdm
結構読んだと思ったらまだスクロールバーが半分で、うんざりして読むのとWindowsでファイルコピーするのをやめた
0499デフォルトの名無しさん垢版2021/03/10(水) 09:48:53.12ID:ayODL1B0
リーナスですらもNTFSが現状ベストって認めてるくらいだからその分複雑なんだろうね
0500デフォルトの名無しさん垢版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が返る要因てどんなのがありえそうですか
0503デフォルトの名無しさん垢版2021/03/26(金) 17:20:08.28ID:XmR64PQN
pTo はダブルにする必要なくて pFrom のみじゃね?

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

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

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

この環境では、0x10000:ERRORONDESTが返るんですけど、
ほかの環境でERRORONDESTが再現できないんですよね..
0505デフォルトの名無しさん垢版2021/03/26(金) 18:28:02.43ID:3gUI29td
>>499
あわしろ氏は、NTFSは欠陥品と言ってたけどな。
0506デフォルトの名無しさん垢版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 というディレクトリに問題がある
0507500垢版2021/03/26(金) 19:31:39.70ID:saZG9dHC
>>506
決め打ちでパス指定してもダメでした
というかどこからどこにコピーしても全部ERRORONDESTのエラーになります
問題あるのは特定のPCだけで、他のPCだと問題なく動作するので、
何か変なソフトに邪魔されているかもしれません

もうだいぶあきらめ気味ですが、解決したら続報のせます
回答くれた人ありがとう
0510デフォルトの名無しさん垢版2021/03/27(土) 15:56:10.46ID:VE8mC68O
特定のも含めてPCがそれぞれどんな構成か出さないとエスパー案件になりそう

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

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

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

お前が自分で探してこいよ
何言ってんだこいつ
0528デフォルトの名無しさん垢版2021/04/06(火) 01:41:26.10ID:Im/sjr+Q
書いていることが仕様であって、書いてないことは仕様ではない
CreateFileでパンが焼けないと書いていないからパンが焼けると判断するのはキチガイ以外他ない
0531デフォルトの名無しさん垢版2021/04/06(火) 12:59:56.19ID:EpJptavP
テストもしないクズなのは確定なんだが
「仕様」かどうかが主語であるべきなのに、仕様かどうか「決まっている」というところを主語にして
続けていること自体がもはや技術者ではない
0532デフォルトの名無しさん垢版2021/04/06(火) 17:02:11.12ID:BqyPmRZM
>>520
>fopen()つまりCreateFile()

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


気がする
0535デフォルトの名無しさん垢版2021/04/08(木) 14:31:52.37ID:BYjSvKlS
cout 前提に描かれてて
wcout 使うとおかしくなる
0540デフォルトの名無しさん垢版2021/04/13(火) 00:39:58.51ID:FveNCngD
IsDebuggerPresentでも使ってアタッチされてたらプログラムを終了させる
カジュアルハック相手なら十分でしょ

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

foo.bat | hoge
0548デフォルトの名無しさん垢版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 に固定されているのだろう
0549デフォルトの名無しさん垢版2021/04/16(金) 15:13:16.68ID:aOiTCYkX
>>548
情報をありがとう

foo.bat標準出力の受信先プログラムhogeでSetConsoleOutputCP()を呼び出すのを可能な限り遅らせることで対処することにします
batファイル全体が読み込まれてからバッチ処理されるのではなく一行ずつ解釈されていく副作用は以前にも経験したことがあります
バッチ実行中に、batファイルから一行を丸ごと削除したら、その行が呼ばれなかった
0551デフォルトの名無しさん垢版2021/05/07(金) 17:44:46.80ID:X6HNN+5P
WNDCLASSEX
↑明らかにセクハラ。発音するたびに気まずくなる。MSはセクハラ用語を廃止すべき。
0554デフォルトの名無しさん垢版2021/05/09(日) 13:14:58.69ID:Ad3WTS9Y
先生「続きを読みなさい、551
551「はい、えーとワンドクラス…セ、セックス…
先生「ウィンドウクラスイーエックスな
みんな「クスクス…
0555デフォルトの名無しさん垢版2021/05/09(日) 13:37:13.38ID:WMytKT+1
EX
0556デフォルトの名無しさん垢版2021/05/17(月) 13:31:21.74ID:giSQx4b2
vc2017だとkernel32.libとかuser32.libとかリンクするファイルに書いておかないといけなかったけど
vc2019だと何も書かなくても勝手にリンクされてる気がするんだけど
気のせい?オプション変わった?
0559デフォルトの名無しさん垢版2021/05/26(水) 09:06:31.66ID:VVGa10VW
白黒でしかプリントしないアプリとか影響ありそう。
サクラエディタのソースコードCImageListMgr.cppの668行付近に以下のようなコメントがある。

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

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

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

それなら普通、描画処理に出力先のDCを渡してスケーリングするだけじゃないの?
0562デフォルトの名無しさん垢版2021/05/26(水) 16:01:40.89ID:D7HypFOx
WYSIWYG: 「しらんがな」
0563デフォルトの名無しさん垢版2021/05/26(水) 18:02:46.62ID:pvBUijTc
今時プリンタにはあんま印刷しないけどpdfには出力したりするから影響はありそうだね
0565デフォルトの名無しさん垢版2021/05/27(木) 14:47:18.05ID:U0nLnJgd
pdf に出力するときに DC とか使わんやろ
0566デフォルトの名無しさん垢版2021/05/27(木) 15:07:08.38ID:IJ5CRrqh
>>565
え?
0573デフォルトの名無しさん垢版2021/05/30(日) 07:58:56.70ID:WEq4SBwj
まさか、そんなWin32api全く関係ない
やり方で実装して専用スレで自慢したりしないでしょぅ
XPS経由だってスレ違いかと。

自慢するからにはバイナリーで直接生成していると見た。
公開早よう
0574デフォルトの名無しさん垢版2021/05/30(日) 09:45:29.63ID:LN/prPAP
>>573
何を言ってるんだ?
> [名前を付けて保存]で.pdfが選択できるあのパターンか
が簡単にできるなら俺も知りたいぞw
0576デフォルトの名無しさん垢版2021/05/30(日) 16:45:35.69ID:PqG+8+2Y
>>572
印刷の出力先をプリンタでなく「Microsoft Print to PDF」とかにするって普通にやらない?
古いOSならフリーソフトの「Cute PDF Writer」とか
0579デフォルトの名無しさん垢版2021/05/31(月) 16:22:50.06ID:XbQeT4fa
ReadDirectoryChangesExWでroutine渡して非同期フォルダ監視してるんだけど、これって通知来るたびに一回一回登録し直さないといけないの?
通知 → 登録し直しの間は監視漏れが発生しうるって事だよね?
0581蟻人間 ◆T6xkBnTXz7B0 垢版2021/06/01(火) 02:10:15.60ID:Rxn2JXc8
どうやらDeleteFile関数はナイフのように危険な関数と見なされているらしい。使うのはためらうがいい。
0586デフォルトの名無しさん垢版2021/06/02(水) 11:14:04.96ID:qtmfAhQ7
登録し直しなんてやった記憶無いし
しなくても通知は来ることは来るけど
ちゃんとしてても普通に取りこぼすことはあった気がする
0587デフォルトの名無しさん垢版2021/06/03(木) 00:06:10.42ID:mgPJdS86
>>585>>586
それはSHChangeNotifyRegisterの話?
もしくはReadDirectoryChangesExWでもIO完了ポートで受け取る方式なら継続的になるとか?
完了ポートでの非同期IQはややこしそうだからとスルーしていたが
0588デフォルトの名無しさん垢版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;
}
}
0589デフォルトの名無しさん垢版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を指定すればメッセージの握り潰しや書き換えができるようなのですが、その場合どのようなウィンドウメッセージをフックすれば良いのでしょうか?
0590デフォルトの名無しさん垢版2021/06/12(土) 10:06:00.61ID:AjrJ9Ngk
このスレでいいのか判りませんが質問です。
WindowsのタブレットはUSBマウス等のポインティングデバイスを差さないとマウスカーソルが表示されないのですが、
APIか何かでマウスカーソルを表示させる方法ってありませんか?
タブレットでSendInputで自動操作させる時にマウスカーソルが表示されず、何が起こっているのか判らないので何とかしたいです。
kokomiteみたいなソフトも試しましたが、ログイン前とかでは使えないので他の方法がないか探しています。
0592デフォルトの名無しさん垢版2021/06/12(土) 14:30:19.46ID:5buAbQHn
SetProp(), GetProp() っていつごろからあるんだろう?
これらの関数の存在を最近まで知らなかった
0594デフォルトの名無しさん垢版2021/06/12(土) 15:21:40.84ID:5buAbQHn
>>593
回答ありがとう

HWNDにユーザ定義構造体を紐づけて管理できるのはかなりありがたい。
今まで20年以上知らなかったのは、我ながら恥ずかしい。
0595蟻人間 ◆T6xkBnTXz7B0 垢版2021/06/12(土) 18:39:01.20ID:bymgAWyc
SetProp/GetPropはstd::mapみたいに使えて便利だが、システムやアプリが無断で勝手に使う関係ないデータが交じる恐れがあるから注意。
0596◆QZaw55cn4c 垢版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 群が扱うオブジェクトとは違うようですが
0597デフォルトの名無しさん垢版2021/06/12(土) 20:53:52.52ID:5buAbQHn
>>596
はい。ご紹介いただいた関数は知ってましたが、
ユーザー定義データをひとつしか登録できないので、使うのを避けてました
0598590垢版2021/06/13(日) 08:15:12.76ID:qn2LXnlL
>>591
>マウスジグラー
こういう製品があるんですね。ご紹介ありがとうございます。
ただ、機能の割にお値段が結構するみたいなので、無線マウスのドングルでも繋いどけばよさそうですね。
仮想マウスドライバの作成も検討してみます。
ありがとうございました。
0600デフォルトの名無しさん垢版2021/06/14(月) 01:35:24.65ID:CyJY6/R2
>>599
SetCursor、ShowCursorを試してみましたがだめなようです。
マウスカーソルがが表示されない状態の簡単な再現方法ですが、
Windows10が入った適当なデスクトップPCにマウス等を繋がずに起動するとこの状態になるようです。
0602デフォルトの名無しさん垢版2021/06/14(月) 14:11:06.25ID:u1SE1Un5
もともとテレワークだから関係ないけど
夏期休暇中にバリバリ旅行する予定は入れてるな
ハハハ
0603デフォルトの名無しさん垢版2021/06/14(月) 20:25:26.99ID:wsn+oRmt
49.7日間で終わるのが嫌ならGetTickCount64()を使えばいい
0604デフォルトの名無しさん垢版2021/06/14(月) 21:41:37.22ID:hyIjE3NB
今さらだがGetTickCountで四十九日という考え方をしたことないけど、覚え方としてはありか
0606590垢版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
レジストリ設定の場合、一度ログアウトが必要なのが解せませんが、これで一応ソフトウェアでカーソルの表示まではできました。
0607590垢版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
とりあえずこれで大丈夫かな?
0608デフォルトの名無しさん垢版2021/06/15(火) 20:39:42.52ID:yNzX82gi
>>605
Vistaでいろいろ作り直されたせいで497日になったのが笑えた
当時2008R2動かしてたサーバが引っ掛かりまくったわ
0609デフォルトの名無しさん垢版2021/06/18(金) 04:52:47.87ID:G04bvGTj
こんにちは。
C++ でSDIウィンドウを管理するためのラッパークラスを作っているのですが、
正直、継承クラスを作成してウィンドウをカスタマイズするたびに新しい
ウィンドウクラス名を指定する作業が面倒くさいです。当初は

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

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

>>612
自分もオブジェクトのアドレスを利用できないかと考えていたのですが、インスタンスごとに
アドレスが異なると困るのではと思い、保留していました。
0616609垢版2021/06/19(土) 15:58:26.49ID:zlIXB2NK
>>614-615
ありがとうございます。
なるほど! __FILE__, __LINE__ の組み合わせは盲点でした。
これなら確かに、オブジェクトとウィンドウクラスを1対1で対応させることができますね。
少なくとも当座はこれでしのげます。
uid、guid 案もありがとうございます。
知識不足のため、勉強してから考えてみたいと思います。
0618デフォルトの名無しさん垢版2021/07/09(金) 07:17:28.46ID:Qg7nE9lI
dllmainの最初の引数のHMODULEっていうかハンドルと同じ値を取得するwin32apiある?

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

dllmainからHMODULEをライブラリに渡せ
みたいな変な規則も出来れば避けたい...
0620デフォルトの名無しさん垢版2021/07/09(金) 07:50:25.45ID:Qg7nE9lI
GetModuleHandleのNULLは大元の実行ファイルのパス。
そうじゃなくて.dllのパスが欲しい。
その際dllmainの第一引数を使わない形で欲しい。
0621デフォルトの名無しさん垢版2021/07/09(金) 08:17:41.20ID:r/5b40UG
んでリンカーでエントリーポイントを自前のにしつつ
コンパイラのスタートアップに渡す過程で hInst をくすねるしかないんじゃないの?
0622620垢版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;
}
0623デフォルトの名無しさん垢版2021/07/09(金) 11:00:40.24ID:r/5b40UG
そのライブラリを利用して
dll を記述するときは dll 自身を指して
アプリケーションを記述するときは実行ファイル自身を指すと

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

そういのだとリンカーとかの話で、APIでどーとかってのとはまた違うような
0632デフォルトの名無しさん垢版2021/07/10(土) 09:41:14.25ID:e+Cu97LZ
>>621
[補足2]
2つ以上のDLLを使用中の場合は、その内のどのDLLのどの関数が今まさに「実行中」か
どうかは、OSレベルでは管理されてないという意味で言っている。
0635デフォルトの名無しさん垢版2021/07/10(土) 11:50:04.86ID:fmB/UGP2
いや実行中のステップがどのdllかという概念はあるよ。
あるからデバッガでも今の瞬間実行中のステップがどの.dllのどのアドレスかまでわかってるわけで。
0637デフォルトの名無しさん垢版2021/07/10(土) 12:01:47.23ID:fmB/UGP2
各々dllのベースアドレスは管理してるんだから、管理してるだろ。
管理してるかはdllは解放されるんだろ?
ベースアドレスからファイル名が辿れるから何のファイルか解るようになってるんやないか。
だからぶっ飛ぶとシステムログに飛んだdll名が明記されるやないか。
0639デフォルトの名無しさん垢版2021/07/10(土) 13:41:35.94ID:fmB/UGP2
GetModuleHandleExの仕様をみればOSの管理下にあるのわかるじゃん。

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

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

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

プロセス情報を保持してないなら管理してないと言えるが。
0651デフォルトの名無しさん垢版2021/07/11(日) 03:01:15.31ID:OgOa7vqd
管理されているというより、EIPアドレスから逆算しているという感じだね。
実行中のマシン語の命令のアドレスが分かれば、リンク時のマップファイルのような
情報があれば、どの関数の中のマシン語かまで分かるから。
0652デフォルトの名無しさん垢版2021/07/11(日) 03:07:37.40ID:OgOa7vqd
どの人がどこにいるかを国は普段は追跡してないけど、科学捜査すればどこにいるか
分かることが多いと言う意味で、「管理はしてなくても見抜くことは出来る」
のと同様の事。
0653デフォルトの名無しさん垢版2021/07/11(日) 03:11:46.75ID:OgOa7vqd
>>649
各DLLがロードされている場所のアドレス範囲とEIPさえあれば、そりゃ、どのDLL
にいるかは分かるけれど、それは管理とは言わないと思うな。
マシン語で、jmp アドレス、call アドレス で、1クロックですぐに EIP = アドレス
になるが、それをOSはいちいち追跡も管理も全くしていない。だから、
現在どのDLLの関数を実行中かをOSは情報としては持ってない。
ところが、EIPの値からどのDLLの中を実行中かを「逆算」することが可能と言うだけ。
0654デフォルトの名無しさん垢版2021/07/11(日) 03:17:09.08ID:OgOa7vqd
プログラミングの世界で「管理」というのは、
struct SomeInfo {
 int curDllIndex; // 現在実行中のDLLのインデックス番号(0-)
};
のようなデータ構造があり、idx1 という番号の DLL の中の関数を呼び出すときに、
プログラムで curDllIndex = idx1 にちゃんと書き込む、ということをイメージする。
このような意味での書き込みは行われてない。
0655デフォルトの名無しさん垢版2021/07/11(日) 03:24:26.40ID:OgOa7vqd
OSに管理されているのであれば、idx1 番の DLLから、main モジュールの関数 f()が
コールバックされたような場合でも、どのDLLから呼び出されたかまで分かるはずだが、
現実にはEIPは、f()の中をポイントしているから EIP だけからは、idx1 を逆算する
ことは不可能。
デバッガが出来てしまうのは、デバッグしやすい様にコンパイラが
「スタックフレーム」という構造が出来るようなコードをわざと作っているから。
その構造によれば、スタックとEBPの値で呼び出しもとの関数の履歴を全て辿って
いける。
しかしこれは、OSが管理しているのではなく、デバッグ版ではそのようなコードを
コンパイラが生成しているからに過ぎない。
リリース版では効率向上のためスタックフレームが省略されることもあり、その
場合は呼び出しもとの関数が辿れなくなるので idx1 という番号を算出することは
原則的には出来なくなる。
0656デフォルトの名無しさん垢版2021/07/11(日) 03:33:02.64ID:OgOa7vqd
>>655
[補足]
スタックフレームは、「ユーザーランド」のアドレス空間に構成された構造で、
OSが「管理」する「システムランド」のアドレス空間にはない。
前者はプログラムに誤りが有ると壊れることがあるし、コンパイラのオプション次第
で省略されることもあるから、いつでも存在するわけでも無いし、いつでも正しい
訳でもない。
その意味で、OSの管理する構造ではない。
0665デフォルトの名無しさん垢版2021/07/11(日) 11:49:37.25ID:OgOa7vqd
本当に管理されていると言うのなら、別のlibで定義されている
HMODULE get_this_dll_module();
という関数によって、あらゆるDLLのHMODULEを取得できるようになるはずで
あるが、この関数は、スタックフレームを前提にしない限りは基本的に
作ることが出来ない。なぜなら
void get_this_dll_module() {
 // ここの EIP の値は、呼び出しもとの DLL のものとは違っている。
}
からである。
0666デフォルトの名無しさん垢版2021/07/11(日) 11:51:10.61ID:OgOa7vqd
>>665
誤: void get_this_dll_module()
正: HMODULE get_this_dll_module()

EIPのアドレスは、簡単に変わりうるものなのだ。
0667デフォルトの名無しさん垢版2021/07/13(火) 12:38:32.06ID:WUJYnH4r
だらだらしてるので
3行でまとめてくれ
0668デフォルトの名無しさん垢版2021/07/13(火) 12:47:15.46ID:oy1AsII3
>>667
現在の関数からその関数が格納されているDLLのパスまで取得できる情報があることを
OSが管理していると呼ぶかどうかで
外野がうんこの投げ合いをしている
0670デフォルトの名無しさん垢版2021/07/13(火) 13:50:43.04ID:EtxXgsUj
無駄な議論ではなく、質問者が、現在実行中の関数の所属する
DLLを正確に取得する方法があると思い込んでいた可能性があるので
大事な指摘だった可能性がある。
結論から言えば、安定してそれを取得する方法は無い。
0672デフォルトの名無しさん垢版2021/07/13(火) 16:28:34.84ID:NGIJbx4Y
get_this_dll_moduleてなんなんってぐぐったら
このスレが引っかかってわろた
脳内の関数だったか
0675デフォルトの名無しさん垢版2021/07/14(水) 21:06:59.94ID:v50kRHgT
「D:\aaaa\bbbb」などの、ファイルやフォルダのパス名から、
そこがCDやDVDなどの光学ドライブかを判定する仕組みはありますか?
0677デフォルトの名無しさん垢版2021/07/14(水) 21:13:56.34ID:DOxWmp+E
途中送信ごめん

全ドライブ文字と種類がわかるから
後は比較するオレオレ関数作る感じ
0679デフォルトの名無しさん垢版2021/07/14(水) 21:36:03.70ID:v50kRHgT
>>678
ありがとうございます。
GetDriveTypeは、"D:\"の3文字の部分しか渡せないようですが、
PathGetDriveNumberでも使えば、"D:\"の部分だけを作れそうですね。
0680デフォルトの名無しさん垢版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 ); // 表示を促す

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

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

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

>>684
リッチエディットのバージョンはv2.0(UNICODE)です。
0687デフォルトの名無しさん垢版2021/07/15(木) 15:17:12.92ID:ygp86UHP
スクロールバーの描画も同時に禁止するとか
スクロール範囲の最大値も強制的に変更してから描画再開するとか
0689680垢版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 );

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

フォーカス取得の際、スクロールバー位置が更新されるものと思われますので、
そのときのウインドウメッセージを捕えて、テキスト更新時と同様にスクロールバー位置を制御すればいけるかもです。
0690デフォルトの名無しさん垢版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);
を投げると先頭行がきっちり収まる位置にきて、スクロールバーがピコピコすることもない雰囲気
0693デフォルトの名無しさん垢版2021/07/15(木) 18:23:17.10ID:L0wYNjuD
>>680
>SendMessage( hEdit, WM_SETREDRAW, FALSE, 0 ); // 文字列更新中の状態が露呈しないよう再描画を抑制する
↑は、RichEditControl のメッセージではなく、Win32のWindow一般のものらしい。
但し、MSDNには、ListBoxで複数のアイテムを追加するときに便利だと書いてある。
質問者の実験を聞く限り、RichEditControlにのみこのメッセージを送っただけでは、
そこにくっついているスクロールバーに対しては効果が無いようだ。
0694デフォルトの名無しさん垢版2021/07/15(木) 18:45:09.69ID:L0wYNjuD
Rich Edit Control を作成する時のスタイルに
WS_VSCROLL
を付け、
ES_DISABLENOSCROLL
を付け、
ES_AUTOVSCROLL
を外すと縦スクロールバーが出るが、勝手に制御されにくくなるかも。
0696デフォルトの名無しさん垢版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 ); // 表示行を、控えておいた位置に移動する
の部分、上の行を省いて、下の行だけにするとちらつかなくなる可能性が高い。
また、上の行の役割の代わりとして、カーソルの位置はスクロールの位置とは別に制御すると良いはず。
0697680垢版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だと背景がグレーになる(審美的にはリッチエディットのような白が好ましい)
・表示矩形内に文字が収まっていてもスクロールバーの枠が表示される
・表示がたまにチラツく
といった気になる点があるのですが、不安定なスクロールバーに比べたら許容範囲です。

多数のご助言をいただき、ありがとうございました。
0698デフォルトの名無しさん垢版2021/07/16(金) 01:48:03.35ID:5FJrAAJE
どうでもいいけどWin32とかの文字列の型名わかりずらすぎて嫌がらせとしか思えない
なんだよLPCTSTRってconst wchar_t*でいいだろ
0700デフォルトの名無しさん垢版2021/07/16(金) 11:36:36.57ID:teDb7k99
スカラ値へのポインタではなく配列先頭アドレスですよという意図は一応あるのかもしれない
0706デフォルトの名無しさん垢版2021/07/16(金) 16:32:41.77ID:6/LQ7Fle
いまどき -D_UNICODE せんやつはおらんよな?よな?
0707デフォルトの名無しさん垢版2021/07/16(金) 17:34:41.64ID:AYv25WJv
>>706
>いまどき -D_UNICODE せんやつはおらんよな?よな?

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

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

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

>Vector以外に良いものは無い?
自分のHPにアップしてReadMeに振込先等書いとけば?
0718デフォルトの名無しさん垢版2021/07/27(火) 18:40:47.67ID:4Be/pZ1T
>>717
マイクロソフトストアに登録するためにMFCを変換しなくてはいけないらしくて
そのやり方がめんどうくさそう。
どうすればいいのかよく分からない。
0720デフォルトの名無しさん垢版2021/07/27(火) 18:45:21.80ID:M3obGnf2
MFCメインアプリを起動するためだけのUWPランチャアプリでも登録すればワンチャン?
0722デフォルトの名無しさん垢版2021/07/27(火) 19:06:58.56ID:4Be/pZ1T
ヤフオクでデータやパスワードを売ることも出来るらしいけど、
一回登録したら100人でも1,000人でも売れるようにすることは出来ないのかな?
そもそも、1000人分を「商品」として一度に登録できるのだろうか?
0724デフォルトの名無しさん垢版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回ほどのエラーで低確率すぎるのと対策が思い付かなくて困っています
原因と可能性について助言頂けませんでしょうか
0725蟻人間 ◆T6xkBnTXz7B0 垢版2021/08/19(木) 01:01:43.70ID:Dgde8QnE
>>724
ウィンドウズは、裏でシェルの変更通知やウィルススキャンやフックなどが動いてたりするんだよね。

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

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

【提案】
SをDに上書きコピー(CopyFile/CopyFileEx)。
Sを読み込む。
Sを削除。
0726デフォルトの名無しさん垢版2021/08/19(木) 01:26:06.58ID:EXq1UPUJ
>>725
>実際にはコピーした後で削除している。
それは異なるドライブの場合だろ?
同じドライブの場合はファイルシステムの書き換えだけのはずだろ
0727デフォルトの名無しさん垢版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の代わりになるものを自分で作ることも思い浮かびますが、
そもそも論として今回のような処理でここまでするものなのか?
という疑問と疑心暗鬼に陥っています
0728デフォルトの名無しさん垢版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);
0730デフォルトの名無しさん垢版2021/08/19(木) 21:29:03.55ID:kB3hjHkq
>>724
カーネル内でのリソース開放は即座に行われるとは限らない。
お触りしたプロセスがいなくなった後でもカーネルの中で残ることがある。
この場合は成功するまでfopen()するしかないね。
0731デフォルトの名無しさん垢版2021/08/20(金) 01:37:15.55ID:irg7D4zd
皆さんありがとうございます

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

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

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

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

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

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

根本的な思い違いをしているに一票
0739デフォルトの名無しさん垢版2021/08/21(土) 11:38:33.02ID:ssXITtrX
>>736
>>724がfcloseしていないというならそもそもfopenしただけとも言えるわけで説明のために以降は省いているってわかると思うんだが
そもそもが閉じ忘れならMoveFileも失敗するだろう
0746デフォルトの名無しさん垢版2021/08/22(日) 16:25:47.23ID:44Fq7Iy0
論理的に考えれば「カーネル」が
握るわけ無いだろう。
ゴルフか麻雀でもしているののか
0749デフォルトの名無しさん垢版2021/08/22(日) 18:03:47.50ID:3exyu3cG
>>732
環境依存なことを考えて戻り値確認するのは別にWindowsに限らないし、戻り値が正常でも外部デバイス相手だとドライバ次第なこともある
別件で、組み込みWindowsでユーザがアプリが正常終了してすぐに電源コード引っこ抜くから
キャッシュがHDDに書き込まれずに消えるって事例はあったな
0751デフォルトの名無しさん垢版2021/08/25(水) 19:50:31.67ID:s4bO6YKI
LoadLibraryとかGetProcAddressしたものは
必ずFreeLibraryしないといけませんか?
自分のプロセスが必ず終了するときにFreeLibraryせずに放置しても勝手に解放される?
0755デフォルトの名無しさん垢版2021/08/26(木) 16:28:52.50ID:WPRv8+9f
こっちくんな
0756デフォルトの名無しさん垢版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型の文字列を連結する方法がわからなからない
一日の大半がエラーとのにらめっこに費やされて辛い・・・
頼む、手伝ってくれさい
0758デフォルトの名無しさん垢版2021/08/26(木) 18:24:36.40ID:DS5buh7a
>>757
いや普通にニート
0762デフォルトの名無しさん垢版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);
0764デフォルトの名無しさん垢版2021/08/26(木) 19:21:59.37ID:ltVuiEkY
普通にwstringベースで作れ。
win32のwchar_t*型渡すところで、data()やc_str()使え。

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

最初はwin32の型に代替名つけまくりな文化は
一体なんの型だよって感じで戸惑うわな。
0765デフォルトの名無しさん垢版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;
0766デフォルトの名無しさん垢版2021/08/26(木) 19:24:55.54ID:s9ncfwmd
>>765
訂正:
1. は代入文の最後にセミコロンが抜けていたので正しくはこう :
void func(CString &str) { str = "計算結果の値"; }
0767デフォルトの名無しさん垢版2021/08/26(木) 19:30:35.44ID:s9ncfwmd
おっと、最後、MessageBoxW ではなく、MessageBoxA を使っていれば、
7や >>765 の工程は不要で、
MessageBoxA(hWnd, str2, "タイトルバー", MB_OK);
だけでいける。
0768デフォルトの名無しさん垢版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);
0769デフォルトの名無しさん垢版2021/08/26(木) 22:24:23.76ID:OnjvrKFf
連結はstrcatかsprintf("%s%s", s1, s2 )のTCHAR(wchar_t)版でいけるやろ
あとLPCWSTRはポインタなので、ちゃんと割り当てしてなくて未初期化のままとかないだろうな?
0770蟻人間 ◆T6xkBnTXz7B0 垢版2021/08/27(金) 02:18:22.79ID:PcAf749w
LPCWSTRのCはCONST(定数)という意味だから、変更できない。WはWide、つまりUTF-16.
Win32をやる前にC言語の文字列処理をマスターしてくれ。
wsprintfは時代遅れ。バッファオーバーフローを避けるため、バッファサイズ指定できる<strsafe.h>のStringCch...関数群を推奨。
0771蟻人間 ◆T6xkBnTXz7B0 垢版2021/08/27(金) 02:34:26.66ID:PcAf749w
ポインタ変数は実体を持たない。文字列扱うにはバッファが必要。動的にバッファを確保して楽したいなら、標準C++のstd::wstringか、MFC/WTLのCStringWを使う。
ただし、std::wstringを使う場合でC文字列が欲しい場合はc_str()メソッドを使う必要がある。下手な型キャストはケガのもと。
0772デフォルトの名無しさん垢版2021/08/27(金) 07:26:15.44ID:4k6BS6Dx
WindowsでC/C++を学ぼうとすると、文字列の扱いは混乱するだろうね
OSを特定しない教科書に載ってるようなやり方もできるから心配するな
一応の結果の表示をできるようになったら、とりあえずその方法だけ使って次に進んで、一通り理解したらまた文字列処理に戻ってくるといいんじゃないかな
0773デフォルトの名無しさん垢版2021/08/27(金) 07:43:07.26ID:bixNKZnz
ぎゃー
教えてくれたのに遅れてすまん
今からエディター起動する
0777デフォルトの名無しさん垢版2021/08/27(金) 11:25:56.35ID:bixNKZnz
付き合ってくれた人が多くて感謝!
上のコードで実験しながら知識の掘り下げも含めて少し調べてみる
ありがとうな
いつか立派なプログラマーになってこのスレで恩返しするわ(泣ける)

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

>>776
入門書は読んだだけで実作は先週始めた
(これ以上は理解が進まないので実作をすることにした)
まだ知識が実践で使えるように修正されてない状態
まあ知識もないんだが
0778デフォルトの名無しさん垢版2021/08/27(金) 11:59:25.59ID:Ti/YAON1
お前には完成する能力は無い
0779デフォルトの名無しさん垢版2021/08/27(金) 12:35:37.97ID:S83DaDnk
先が思いやられるな
特にWin32APIにこだわる理由が無いならC#でやることをおすすめする
0781デフォルトの名無しさん垢版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);
0789蟻人間 ◆T6xkBnTXz7B0 垢版2021/08/27(金) 20:45:13.11ID:PcAf749w
sprintf/swprintfはC標準。
wsprintfはWin32。
これはテストに出ないぞ!
0793デフォルトの名無しさん垢版2021/08/27(金) 22:53:41.84ID:ykQTaA3x
>>782
これからWin32APIを理解し始めようと考えている人には、そうゆう疑問を持てるレベルにまで頑張って到達してほしいな、という思いでマクロ表記にしてみたよ。
実用上、必要か不要か・・・で言えば場合によるんだろうけど。
現時点でWin32API が内部で ANSI と UNICODE を明確に区別しているので、作法として気にする必要はあると思われます
0795蟻人間 ◆T6xkBnTXz7B0 垢版2021/08/27(金) 23:07:19.75ID:PcAf749w
_T系の関数マクロは<tchar.h>で定義されていて、主にC実行時関数を振り分ける。これらはAnsi/Wideを振り分けるTEXT系とは別に分離された機構になっている。
0796蟻人間 ◆T6xkBnTXz7B0 垢版2021/08/27(金) 23:09:32.07ID:PcAf749w
>>794
wprintfはC標準のワイド関数。
wsprintfはWin32関数でA/W版がある。
一文字違いに注意。
0797蟻人間 ◆T6xkBnTXz7B0 垢版2021/08/27(金) 23:18:41.05ID:PcAf749w
UNICODEマクロでA/Wの振り分け。
頭に下線のついた_UNICODEマクロで_T系の振り分けができる。
これらはVisual Studioで適切にソリューション/プロジェクトの設定を行えば自動で定義される。
GCCやclangでは-municode をコンパイルオプションに追加する。

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

開発面では、将来的に UTF-16(IVS)が必要になってくると、UTF8でいいじゃん、ということになって。
Visual stduio のデフォルトが再度ANSI(UTF-8)に戻る可能性はある。
長い目でWin32APIを見るなら、ANSIアプリの構築方法も忘れないでおく必要はありそうだ
0803デフォルトの名無しさん垢版2021/08/28(土) 09:06:21.83ID:YWpKrN9v
アラビア語かなんか知らんが、サロゲートペアの問題ではなく、さらに
UTF32 では 2 文字(32BIT x 2) なのに、画面上では文字の上や下に斜線
が入るような文字がある。日本語の濁点のようなもの。サに点々を打ってザ
と書くようなのを、サ + ” みたいな二文字で表現するらしい。
そんなものまで日本人が対応しなくて良いと個人的には思ってる。
0804デフォルトの名無しさん垢版2021/08/28(土) 09:09:13.47ID:YWpKrN9v
UTF8 --> UTF16(サロゲートペア) --> UTF32 1 文字
の問題だけでなく、特殊な言語では、
UTF8 --> UTF32 2文字 --> 画面上では 1 文字
の問題が有るということ。
日本人が対応できるのは、UTF32 1文字が画面上で1文字に見えるまでが限界。
0809デフォルトの名無しさん垢版2021/08/28(土) 12:21:19.46ID:jkQHTYKd
>>803
>そんなものまで日本人が対応しなくて良いと個人的には思ってる。
欠けリンゴの世界ではそっち採用してるからファイル名の扱いとか厄介だよ
0811デフォルトの名無しさん垢版2021/08/28(土) 13:29:17.35ID:78cNf6mY
中東とアメリカは中が悪いから、わざと変な文字コードにしたのかも知れんな。
経済的な敵である日本を倒すため、オートリピートなんてそもそも不要なIMEのON/OFF
キーに普通のアルファベットキーよりも開始時間の短いオートリピート機能を付けた
上に、現在のON/OFF状態を画面の右下の分かりにくい場所に小さく表示したりとか
と同じで。
0812ハノン ◆QZaw55cn4c 垢版2021/08/28(土) 14:51:45.63
>>811
政治の世界と商売の世界は違いますよ、商売のためならなんでもするのが商売人というやつですよ
0816デフォルトの名無しさん垢版2021/08/29(日) 01:17:36.66ID:MsJ8kGio
どうでもいいけどオリパラのRPCはリモートプロシージャコールじゃなくてなんちゃってロシア
まめな
0817デフォルトの名無しさん垢版2021/09/06(月) 20:30:01.34ID:d5h9Y6Qi
フフフフフ…で埋められたWin32アプリデバッグメモリを思い出した人、どのくらいいるかな

「フフフ…」4歳娘が撮影した花火に家族で爆笑! 見ると笑顔になる“奇跡の1枚”の状況を父親に聞いた | FNNプライムオンライン
https://www.fnn.jp/articles/-/224754
0819デフォルトの名無しさん垢版2021/09/09(木) 19:55:16.63ID:VcdPV4nP
カカカ
0824デフォルトの名無しさん垢版2021/09/11(土) 23:15:17.42ID:EO9owr6G
dabadabada
0825デフォルトの名無しさん垢版2021/09/15(水) 09:50:59.74ID:5Dhe4KoF
HANDLE SetClipboardData(UINT uFormat, HANDLE hMem);
に渡すhMemは必ずGlobalAllocで確保したものでなくてはいけないのでしょうか?

mallocやnewやスタック領域のポインタを渡すとどうなるんでしょうか・・・?
0830デフォルトの名無しさん垢版2021/09/15(水) 13:39:40.30ID:5Dhe4KoF
>>826
確かにデータへのポインタであれば長さも渡す必要があるはずですし型名からしても説明からしても明らかに仰る通りでした

>>827
GlobalAllocもあくまでプロセス単位であって、GlobalAllocに書き込んだデータをOSに教える → SetClipboardDataでOS管理化のバッファに渡される(CloseClipboardするまでフラッシュはされない?)
という原理であるはずなので、hMemはスタックやmallocでも良いのでは?と思った次第です
しかしながら単純なデータへのポイントではないという事で納得しました
0831デフォルトの名無しさん垢版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になってしまいデータそのものが解放されるのを防ぐためだろう)
0832デフォルトの名無しさん垢版2021/09/15(水) 14:22:39.60ID:SFBdYzCp
訂正

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

メモリビューアで眺めた感じだと成功した後にGlobalFreeを行わなくても、
GlobalAlloc(GMEM_MOVEABLE, size)の戻り値->、GlobalLockの戻り値->共に該当アドレスへ別データ上書きは確認されたので、ちゃんと解放されているものと思われます
0842デフォルトの名無しさん垢版2021/09/15(水) 15:46:35.24ID:+suq2kti
なるほど
クリップボードがメモリオブジェクトをGlobalFreeしているので
アプリ側でGlobalFreeすると二重解放になるのは
ムーブかコピーかによらないってことか
0843デフォルトの名無しさん垢版2021/09/15(水) 15:56:39.26ID:iNVe1A73
「メモリ割り当て方法の比較」という
MicroSoftの資料を一読したら?

GlobalAlloc はHeapAllocのラッパ
0847833垢版2021/09/16(木) 07:33:53.55ID:T1nJe1PW
礼を言ってなかった
みんな、ありがとう
0857デフォルトの名無しさん垢版2021/10/01(金) 02:53:14.59ID:da71++8d
Windowsゲームプログラミング (Game developer) 単行本 – 2004/5/1
最新版 12歳からはじめる ゼロからのC言語ゲームプログラミング教室

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

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

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

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

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

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

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

漏れらは、慶応ぐらいでも、ほとんどの大学生が、Cで挫折する事を知っているから、
最初から、中学生には無理なことが分かっているから、タイトルに引っ掛からない
0872867垢版2021/10/01(金) 10:59:39.19ID:PaEGpo5A
基本的に、パソコンゲームは数十年前の話。
今は、Windows用・Linux用のゲームはない

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

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

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

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

作っても売れないから。
今、パソコンゲームを買う人は、いないでしょ
0873デフォルトの名無しさん垢版2021/10/01(金) 11:32:38.00ID:D04WTAVm
Ruby妖怪がSteam見たらひっくり返りそうやね
イヤ見なかったことにして脳停止できるから妖怪なのか
0875デフォルトの名無しさん垢版2021/10/01(金) 11:42:39.38ID:FMnIEPDs
SetWindowLong(), GetWindowLong() が変わる
引数のマクロ定数も変える必要が出てくるケースあり
0876デフォルトの名無しさん垢版2021/10/01(金) 11:57:04.75ID:alrYkh/f
C言語で32/64bit対応するのはわりと簡単。最新コンパイラのコンパイル時警告に沿ってソースを修正すればいいだけだから。
問題はWin32APIをDLL呼び出しするスクリプト言語での対応で誰も親切に警告してくれないし、アセンブラ並みに面倒。
0878デフォルトの名無しさん垢版2021/10/01(金) 16:05:45.50ID:xAAYN8E1
64bitで困るのはWin32APIの部分じゃなくて
SysWOW64の部分だったりする
0879デフォルトの名無しさん垢版2021/10/01(金) 16:15:23.19ID:alrYkh/f
アドレス空間が違っててハンドルをプロセス間で共有できなかったりするんだったか?
0880デフォルトの名無しさん垢版2021/10/01(金) 16:17:52.22ID:xAAYN8E1
regedit も system32 の部分と syswow64 の部分の両方ケアしないといけないし面倒になったよね
0881デフォルトの名無しさん垢版2021/10/01(金) 16:28:33.91ID:FMnIEPDs
32bit アプリが 64bit 環境で動いていて そいつが参照するレジストリは
syswow64 側に居て そっちを書き換えないといけないとかあったな
0883デフォルトの名無しさん垢版2021/10/02(土) 15:16:24.14ID:yFRwYWli
うちの Windows 10 のスタートメニューには
ODBC Data Sources (32-bit)
ODBC データ ソース (64 ビット)
があるが何この中途半端な日本語化ωωω
0884デフォルトの名無しさん垢版2021/10/02(土) 15:18:03.33ID:yFRwYWli
>>879
COM(OLE/ActiveX)のクライアントがサーバーにDispatch出来なかったりするんだよな
0885デフォルトの名無しさん垢版2021/10/02(土) 21:29:50.89ID:0KUEFcg9
DirectX の Filter も 32/64 両方造ったし
GraphEdit も両バージョン立ち上げて確認してるんだが
0890デフォルトの名無しさん垢版2021/10/06(水) 19:54:49.19ID:vqgOkLJq
Windows 11 出たけど
Win32API 関連はなんか変わる?
注意点とか?
「アプリ」は使わんが
0891デフォルトの名無しさん垢版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"
0893デフォルトの名無しさん垢版2021/10/12(火) 22:26:33.36ID:fXvNOJZ2
漏れは、Ruby で、/ をパス区切りに使っているけど。
Dir.glob( 'C:/Users/Owner/Documents/**/*.txt' )

特殊文字をエスケープするなら、\ は、\\ になるのかな?
0902デフォルトの名無しさん垢版2021/10/22(金) 10:33:00.16ID:/1A4Gt1O
コンボボックスのリストアイテムのフォント色を変えようと思ったんだけど、リストコントロールの親ウィンドウが他プロセスcsrss.exeなのでWM_NOTIFYを受信できない
どうすればコンボボックスのリストアイテムのフォント色を変えられるだろうか?
0903デフォルトの名無しさん垢版2021/10/22(金) 16:47:21.55ID:DsjZYzXm
ownerdraw
0904デフォルトの名無しさん垢版2021/10/22(金) 20:06:47.33ID:/1A4Gt1O
>>903
回答ありがとう
だがしかし、ownerdrawはWM_DRAWITEMが親ウィンドウに送られてくるので、コンボボックスのリストコントロールの親ウィンドウが別プロセスという問題点は同じ
0906デフォルトの名無しさん垢版2021/10/22(金) 20:24:55.00ID:/1A4Gt1O
>>905
回答ありがとう
だがしかし、customdrawはWM_NOTIFYが親ウィンドウに送られてくるので、コンボボックスのリストコントロールの親ウィンドウが別プロセスという問題点は同じ

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

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

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

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

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

CBS_OWNERDRAWFIXEDをセットし忘れていたことができない原因でした
大ポカです
0930デフォルトの名無しさん垢版2021/10/25(月) 10:56:02.77ID:SLeimCOK
コンボボックスはスタイルにCBS_NOINTEGRALHEIGHTを追加すればドロップダウンリストの自動リサイズを抑止できるんだけど、
表示後の明示的なリサイズはどうすればできますか?
0932デフォルトの名無しさん垢版2021/10/25(月) 16:29:02.07ID:SLeimCOK
>>931
CBN_DROPDOWN通知時にhwndListでSetWindowPos()を試したけど反映されなかった
どのタイミングならサイズを変更できるのだろう?
0934デフォルトの名無しさん垢版2021/10/25(月) 20:18:01.64ID:/y1ZSI8/
リサイズしようとしたら
WM _ GETMINMAXINFOが出て
それを処理しないといけない。

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

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

ダイアログ表示してから編集というのはしたことないから保証しない(というか無理なきはする)が
表示前なら編集してどうにかなる
0937930垢版2021/10/25(月) 23:20:40.84ID:SLeimCOK
コンボボックスのドロップダウンリストの縦サイズはデスクトップの縦サイズの半分より十分小さくないと、
コンボボックスが縦方向中央付近にある時にテキストボックスがドロップダウンリストに隠れやすくなる
0938デフォルトの名無しさん垢版2021/10/25(月) 23:42:53.98ID:2h62u+//
面倒なので試さないけど、もしかしてフォント変更後にコンボボックスコントロールの
ウィンドウハンドルそのままSetWindowPosに投げたらドロップダウンサイズ変わらんか?
0939デフォルトの名無しさん垢版2021/10/26(火) 19:58:48.51ID:2BgEM434
a.exe という service 用の exe があるとして
その WinMain の中で
登録済みの service (a.exe) として実行されたときと
デスクトップから起動 (a.exe) されたときと
区別する方法はありますか?
0942デフォルトの名無しさん垢版2021/10/26(火) 21:52:04.16ID:cAwQ+zjg
・実行ファイル自体は同じ場所にある
・(ダブルクリックによる)エクスプローラーからの起動
・システムのサービスに登録してての起動
実行ファイル側のコードで自分自身で区別することが出来るか? という話でいいのかな?
0943蟻人間 ◆T6xkBnTXz7B0 垢版2021/10/26(火) 21:57:13.21ID:Dp6wzto0
ショートカットファイルならコマンドラインオプションをつけることができるから、それで区別可能。
0944デフォルトの名無しさん垢版2021/10/26(火) 22:10:48.14ID:DnJtJtaA
サービス用のEXEをそのまま実行する仕組みなんて普通は作らないけど
そのプロセスを起動した親のPPIDで判別できると思うよ
0946デフォルトの名無しさん垢版2021/10/26(火) 22:22:56.91ID:DnJtJtaA
.NETにはPPID取得する方法が用意されてないのが驚きなんだよね
WMIかピンボケするしかない
0947デフォルトの名無しさん垢版2021/10/26(火) 22:50:49.81ID:WzQpbfaj
独自のコマンドラインオプションをつけたものをサービスとして登録して、
それがついているときはサービスとして動作するように作ってる
0949デフォルトの名無しさん垢版2021/10/27(水) 09:54:33.98ID:t2iD5tO8
>>941
cmd とかからのコマンド指定で起動も含みます
>>942
それです
>>944-946
ひと手間だけで取得出来る一般的な API やパラメータは無さそうですね?
>>947
それは最初に思い付いたのですが元々起動時のパラメータや API で取得する方法があるならその方が良いかなと思いました
0950デフォルトの名無しさん垢版2021/10/27(水) 11:38:38.74ID:jUeTV2mv
>>948
アプリケーションのエントリポイントは WinMain (or main) で変わらんでしょ
その中で登録だなんだを経てWinMain からは抜けるけどプロセスは生き残ったまま
別スレッドで ServiceMain をディスパッチしてるだけじゃなかろうか
0952デフォルトの名無しさん垢版2021/10/27(水) 21:34:16.61ID:rXHlGl3r
win7以前かな
0958デフォルトの名無しさん垢版2021/11/02(火) 16:25:02.03ID:yLMj4W62
IOCTL_DISK_GET_DRIVE_LAYOUT_EXで得られるパーティションの情報と
FindFirstVolume, FindNextVolumeで得られるボリュームとの
対応付けはどうやるんです?
0959デフォルトの名無しさん垢版2021/11/03(水) 12:54:39.69ID:VhVmtrn9
>>958
何をやりたいのかわからないけど、IOCTL_DISK_GET_DRIVE_LAYOUT_EXの情報からドライブ名にしたいのなら、
"\\?\Volume" + PartitionId(GUID) にすれば、ボリューム名になるのでそれを変換すればいいはず
0961デフォルトの名無しさん垢版2021/11/05(金) 13:35:11.77ID:aDspL8GE
WS_EX_TOPMOSTなウインドウが時々、
通常ウインドウごときに前に出しゃばられるんだけど
防ぐか、出しゃばられたのを自動検知してZオーダーを
奪い返すにはどうすればいい?
0962デフォルトの名無しさん垢版2021/11/05(金) 13:42:11.04ID:AxgqQTGR
他所の窓が WS_EX_TOPMOST で奪っていって前に出しゃばられてるのであれば
WM_STYLECHANGED 捕まえて奪い返す?
0964デフォルトの名無しさん垢版2021/11/06(土) 14:43:09.91ID:b1XdA94q
ランサムウェアでも造ってんのか
0966961垢版2021/11/06(土) 21:24:14.45ID:7Goy9i30
CreateWindow直後は理屈のとおりなんだけど
長時間稼働させて忘れた頃にAdobe Readerだの一太郎だのに
前に出しゃばられてるんだ
0970デフォルトの名無しさん垢版2021/11/08(月) 18:39:57.62ID:GDZdggMg
継ぎスレよろ
0971sage垢版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任せにしているアプリはあるんじゃないですかね
そういった経緯がありまして、どのタイミングでファイルのコピーなどが終了して
アプリを終了してもい状態になったかどうか、判断する手立てがなくて困ってます
何かいい方法ないですかね
0972デフォルトの名無しさん垢版2021/11/12(金) 00:10:15.19ID:4fWazNbK
迷惑な香具師だな
0974デフォルトの名無しさん垢版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
0976デフォルトの名無しさん垢版2021/11/12(金) 02:47:31.80ID:0Z8rlyMb
上のキチガイも書いてるがそういう場合は別プロセスにして放置だな
単一プロセスでうまくいかない事なんて沢山ある
0977971垢版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 が呼ばれるって書いてあるけど
実際には呼ばれないんですよねー、まぁ呼ばれることもあるんですけど、この辺がまた一貫してない
0979デフォルトの名無しさん垢版2021/12/02(木) 12:18:05.69ID:Q5DdwN4N
DialogBoxでメインウインドウを作るとタイトルバーのHeightが若干短くなるものと認識していたのですが、色々とスタイルを試しても一般的なウインドウと同じものしか出来上がりません
世に出てるダイアログベースのフリーソフトは短いものが多いと思いますが何が違うのでしょうか?
0982デフォルトの名無しさん垢版2021/12/02(木) 12:43:31.97ID:zC7DodB0
>>979
> DialogBoxでメインウインドウを作るとタイトルバーのHeightが若干短くなるものと認識していたのですが、

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

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

それが通常です

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

思い違いです

WS_EX_TOOLWINDOW を付与したウィンドウを求めてるだけじゃないのですか?
0983デフォルトの名無しさん垢版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
0984デフォルトの名無しさん垢版2021/12/02(木) 19:14:11.18ID:8y/JBuUj
この値ってファイル重複は調べられないのね
ハードリンク、シンボリックリンクだと同一の値だったが

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


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



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

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

成る程、比較にはボリューム シリアル番号も含めねばならぬ。
当時の「ファイルオープン時に変更されるかも」の文言の真意は判らないが、nFileIndexHigh/Low を長期間保存しておくのは問題有るかも知れない。
usskim.blog37.fc2.com/blog-entry-555.html
0989デフォルトの名無しさん垢版2021/12/02(木) 23:17:05.29ID:8y/JBuUj
サンクス
でもよくわからないです
0991デフォルトの名無しさん垢版2021/12/07(火) 10:03:39.54ID:m4TDhLeb
dbgviewの後継ツールってないの?
特定のプロセスだけ監視するとか
大量のゴミ撒き散らしてるプロセスだけ除外するとかしたい
0992デフォルトの名無しさん垢版2021/12/07(火) 13:11:46.58ID:VYmmPtZe
>>991
dbgviewのFilter機能じゃダメなの?
>特定のプロセスだけ監視とか
>大量のゴミ撒き散らしてるプロセスだけ除外するとかしたい
自分が作ってるアプリなら、Traceの頭に固有文字列付けとけばよいし、
そうで無いなら[プロセス番号]でフィルターすれば事足りると思うが?
0993デフォルトの名無しさん垢版2021/12/07(火) 13:35:15.66ID:KkhoCDsy
>>987
FATならディレクトリの最初のクラスタと、ファイルのバイトオフセットから生成
デフラグによってそのクラスタ位置やバイトオフセットが変われば識別子も変わる
削除して別のファイルを生成した場合に、同じファイルIDが生成される可能性がある

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

またFAT、NTFSともにファイルIDはファイルシステムごとだから、同一コンピュータ上でも論理ドライブが違えば被ることもあるので、
同じ論理ドライブか異なる論理ドライブかを判断するもの(ボリューム シリアル番号など)が必要
0994デフォルトの名無しさん垢版2021/12/07(火) 21:50:48.67ID:kG93TMWa
デフラグやファイル操作で変わるなら何の意味もないように見える
活用したい場面なんてないのでは
0995デフォルトの名無しさん垢版2021/12/09(木) 20:57:10.24ID:aTCz13pR
うめる
0996デフォルトの名無しさん垢版2021/12/09(木) 20:57:15.04ID:aTCz13pR
落とせ
0997デフォルトの名無しさん垢版2021/12/09(木) 20:57:20.79ID:aTCz13pR
捕手
0998デフォルトの名無しさん垢版2021/12/09(木) 20:57:34.68ID:aTCz13pR
外野手
0999デフォルトの名無しさん垢版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を超えています。これ以上書き込みはできません。

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