Win32API質問箱 Build126

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2020/05/01(金) 22:16:51.96ID:ZJ42fMZB
Win32APIについての質問はこちらへどうぞ。

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

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

■関連スレ
Visual Studio 2019 Part4 https://mevius.5ch.net/test/read.cgi/tech/1585715794/
Visual Studio 2017 Part7 https://mevius.5ch.net/test/read.cgi/tech/1558179898/
【C++】 DirectX初心者質問スレ Part41 【C】 https://mevius.5ch.net/test/read.cgi/tech/1521786252/
2020/08/23(日) 16:00:25.99ID:SVuEjc7r
>>282
>あと64bitで作っておけば32bitのフックもわざわざしなくていい
これはもしかすると、32BITアプリの場合、64BITのDLLのフック関数を OS
が呼び出してくれると言うことでしょうか?
2020/08/23(日) 18:50:47.56ID:t0NmBsz5
32bitで実験やったんなら移植もすぐだからやってみればいい
dll使わずにする場合も専用APIとか無いし
2020/08/24(月) 10:55:52.42ID:IztyfRL4
>>272
成功して欲しいOSだけど、日本語入力で行き詰まってるんなら先は長そうだね

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

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

*SetCurrentDirectory

The SetCurrentDirectory function changes the current directory for the current process.

BOOL SetCurrentDirectory(
LPCTSTR lpPathName // new directory name
);

*Remarks

Each process has a single current directory made up of two parts:

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

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

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

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

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

アクセス権のない他のユーザーのドキュメントディレクトリを指定したのなら
このような動作は理解できるのですが、パブリックディレクトリでこのように
なってしまうのは仕様でしょうか?
368デフォルトの名無しさん
垢版 |
2020/10/28(水) 11:43:37.22ID:Mf8tEr2f
SHGetSpecialFolderPath
2020/10/28(水) 17:45:50.04ID:DoZwgPmf
パブリックディレクトリの取得方法を聞いているわけではないのですが
"C:\Users\Public\Documents" は存在する有効なパスです
370デフォルトの名無しさん
垢版 |
2020/10/28(水) 18:30:52.56ID:Mf8tEr2f
再現した
C:\Users\Public
ならちゃんと public が開くが
C:\Users\Public\Documents
にすると自分のアカウントに行ってしまう
371デフォルトの名無しさん
垢版 |
2020/10/28(水) 18:36:57.63ID:Mf8tEr2f
あと存在しないディレクトリを与えると
C:\Users\自分のアカウント\Documents
が開いた
372デフォルトの名無しさん
垢版 |
2020/10/28(水) 18:41:30.63ID:Mf8tEr2f
lpstrInitialDir
The initial directory. The algorithm for selecting the initial directory varies on different platforms.
Windows 7:
If lpstrInitialDir has the same value as was passed the first time the application used an Open or Save As dialog box, the path most recently selected by the user is used as the initial directory.
Otherwise, if lpstrFile contains a path, that path is the initial directory.
Otherwise, if lpstrInitialDir is not NULL, it specifies the initial directory.
If lpstrInitialDir is NULL and the current directory contains any files of the specified filter types, the initial directory is the current directory.
Otherwise, the initial directory is the personal files directory of the current user.
Otherwise, the initial directory is the Desktop folder.
Windows 2000/XP/Vista:
If lpstrFile contains a path, that path is the initial directory.
Otherwise, lpstrInitialDir specifies the initial directory.
Otherwise, if the application has used an Open or Save As dialog box in the past, the path most recently used is selected as the initial directory. However, if an application is not run for a long time, its saved selected path is discarded.
If lpstrInitialDir is NULL and the current directory contains any files of the specified filter types, the initial directory is the current directory.
Otherwise, the initial directory is the personal files directory of the current user.
Otherwise, the initial directory is the Desktop folder.
2020/10/28(水) 19:43:23.12ID:RpzUgl/d
comdlg32.dllのコモンダイアログ関係は >>367 のような想定外の動きをしたり
右クリックのコンテキストメニューで存在しない32bitフォルダを探しに行ったりと色々不具合を抱えてる
明らかにメンテされてない
ダイアログ内のListViewで開発者の想定外の事ができたりするから許されるなら使わない方が良い
2020/10/28(水) 20:10:50.98ID:xBovneds
コモンコントロール使ってるアプリに使うなと言ってしまうと、開発プラットフォームから見直さないとダメ案件では
2020/10/29(木) 10:55:01.44ID:XU4TLDfA
>>372
> Otherwise, the initial directory is the personal files directory of the current user.

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

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

秀丸ファイラーのdllって無かったかな
2020/10/29(木) 13:09:04.28ID:rgNs+gPO
IFileDialog使えって話でもないのん?
379デフォルトの名無しさん
垢版 |
2020/11/12(木) 11:33:46.92ID:Twa29Hwt
こんにちは、お世話になります。DLLファイルの削除について質問です。
プログラム終了時にロードしたDLLファイルを削除したいのですが、
場合により削除できたりできなかったりします。

実際にはもう少し複雑ですが、大まかな処理の手順を示します。
1:  inst=LoadLibrary("tmp.dll")
2:  hook=SetWindowsHookEx(...)
3:  ...あれやこれやの処理...
4:  ret1=UnhookWindowsHookEx(hook)
5:  ret2=FreeLibrary(inst)
6:  ret3=DeleteFile("tmp.dll")

 処理部[3:]は、所望の通り動作していて、inst,hook共に正常値のよ
うです。アプリケーション終了時に[4:]以降の処理を行います。ret1,
ret2は成功値を返すのですが、ret3は失敗し、GetLastErrorの値は5で
ERROR_ACCESS_DENIED「アクセス拒否」を返してきます。アプリ
ケーション終了後はプロンプトからのDELコマンドに成功します。

 処理部[3:]をスキップすると、ret3は成功値を返しファイルもただ
しく削除されています。

FreeLibraryだけでは、DLLを開放してくれないのかと思っていますが、
少し手つまりになっています。当方、日曜プログラマレベルの知識で
す。質問などに不備等ございましたらご指摘ください。

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

ただ、[5:]と[6:]の間にSleep(10000)を挟んでみた。OSが手放してくれる時
間?が必要かと思って・・・でも、そういう事じゃないみたい。
ボタンの配置はすぐには難しいですが(汗)。でも、とりあえず、物は試しで
ユーザの入力待ちを挟んでみます。getch()あたりで・・・。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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