Win32API質問箱 Build125
■ このスレッドは過去ログ倉庫に格納されています
ダメだぁ... WriteProcessMemory がどうしても失敗する(´・ω・`) デスクトップのsyslistview32やexplorerのDirectUIHWNDでは成功(返り値1)するんだけど、 メモ帳やIEのプリンター選択のsyslistview32や、メモ帳のEditに対しては失敗(返り値0)する なんでー? Err.LastDllError の番号は998で、 メモリ ロケーションへのアクセスが無効です。 >>205 64bit版でコンパイルしたら、32bit版のプロセスに介入することできないから難しいという感じでしょうか(´;Д;`) 64bit版のIEでも返り値は0でした... Long型を、LongPtrにしてもダメでした... 32bit,x64の実行ファイル2つ作って用途に合わせて切り替えたら? プログラム板にキチガイ降臨中!botに一晩も反応する異常さ 一般人(学校恩師)に殺害予告をしているのでスレ建て通報してください。 https://mevius.5ch.net/test/read.cgi/tech/1559872586/ 142 名前:a4 ◆700L1Efzuv 投稿日:2019/06/18(火) 05:29:55 ID://qVkzO >>141 名古屋の人な 俺ね、君の問題を大橋先生と混ぜないことにする。つまりね、 片桐孝洋のことをボコろうと思う。普通に顎の骨を折る。これくらいで警察来るか? 一般市民とかさ、普通にさ、俺らの秘密なんだけどさ、日本人なんて復活ねーから。 >>206 自分は一旦それで絶望して 32bitアプリ用のラッパー作って呼んでる 32bit資産使ってる人はみんなこうじゃないかな 既存の Console に代わる Windows Terminal のプレビュー版が公開されたけど 今後コンソールアプリはどういう作りになるんだろう 既存の ConsoleAPI またはその拡張API になるのか それともConsoleAPI は廃止されて Unix なんかと同様のエスケープシーケンスを制御する curses ライブラリみたいのが提供されるのか まぁオープンソースみたいだからソース見ればいいんだろうけど 初歩的な質問ですが、64bitのプロセスにもWin32APIって使えますか? 使える ただし、例えばGetWindowLongのようにポインタのビット数を決め打ちしている箇所に注意が必要 >>215 Win64APIではWoW64というシステムがWin32からWin64への互換性レイヤーになる。 32bit OS の場合 System32 = 32bit 用 DLL (Win32API) 64bit OS の場合 System32 = 64bit 用 DLL (64bitWin32API) SysWOW64 = 32bit 用 DLL (32bitWin32API) ありがとうございます これで気にせず昔の情報あされます SysListView32のリストビューで、縦スクロールバーが表示されている状態で、 アイテムをクリックして選択し、すぐにホイールを回してそのアイテムを画面外に出すと、 一定時間後にそのアイテムが表示される位置まで飛んでしまいます。 選択されていないアイテムよりも、すでに選択されているアイテムをクリックした方が、 ホイールを回すまでの時間が多少長くてもその現象が起きます。 これWindows自体のバグでしょうか。 内部のタイマー処理でも絡んでいるのでしょうか。 君が発見出来るような程度のバグなら 既に誰かが発見して治してるよ ホイールは3rdパーティーのマウスドライバや常駐もので 余計にメッセージ飛ばしたりすることあるから厄介 Win10の一年位前のビルドでSysListView32がスクロールバーを出してる状態でドラッグすると 画面右端にカーソルがすっ飛ぶバグがあったな SysListView32使ってるアプリは多いからこれは一般ユーザーもすぐに気付い >>222 ホイールでなくスクロールバーのドラッグでも起きました。 操作が難しくなりますが、アイテムをクリックして選択し、 すぐにスクロールバーをドラッグしてそのアイテムを画面外に出すと、やはり同じ現象が起きます。 全然関係なくて申し訳ないが シングルクリックとダブルクリックの判定って結構難しいよな クリックのメッセージが飛んできても シングルクリックのつもりなのか ダブルクリックの一回目のクリックのつもりなのか その時点では判断が付かない なのでダブルクリックの二回目のクリックが飛んで来るかどうか 少し時間をおいてみるしかない この間にユーザーが何か操作すると >>226 WM_LBUTTONDBLCLKが飛んで来たらダブルクリック でも飛んでこないかもしれない(つまりシングルクリック)という事だよ 飛んでくるかどうかは少し待ってみないとわからない エクスプローラでファイルの名前の変更するとき 少し待たされるあの動作 タイマー使ってWM_LBUTTONDBLCLKが来るか少し待ってみるっていう でもこの魔の時間にユーザーが操作することがあって 例えばホイール回したりスクロールバー触ったり >>229 コンパネでダブルクリックの間隔を調節できるから そのへんはユーザーに責任転嫁できる ダブルクリックはシングルボタンのAppleから持ち込まれた悪臭 飛んでくるまでいつまで待てばいいですか 少しっていつですか あれ?シングルクリックってダブルクリックになったら、マージされてダブルクリックで処理されると思っていた。 >>234 マージされるのは二回目のクリック 今言ってるのは一回目のクリックをどう扱うかという話 この一回目のクリックは シングルクリックのつもりなのか ダブルクリックの一回目なのか コンピュータには知る由もない なんでここまで説明しないと分からんのだろ 特にハイコンテクストって訳でもないのに 誰が誰に対して? 1回目の誰が2回目の誰に対してマージされて処理されるのか? おやすみ GetCursorPosでポインターの場所、GetKeyStateでマウスボタンが押されてるか離されてるか 取得できるから、あとは時間測って適当にクリックとダブルクリック、ドラッグを判別する SwapMouseButtonで右利き左利きとか、GetDoubleClickTimeでダブルクリック判定する時間とか そんなのを設定できるようにしとけば完璧 これがおまえらが一番納得する方法だろwww クリック動作はダブルクリックの直前に発生しても致命的にならないものであればいんでない? クリック 選択 ダブルクリック 実行 これを逆にするようなら難しくなるだけかと QueryPerformanceFrequencyが10000000を返してくるようになってた 将来はQPCは常に100ナノ秒単位で表しますよってなっていくんだろうか 今回たまたま自分の環境がそうなってしまっただけなんだろうか 現在、AddFontResourceとRemoveFontResourceを使って プログラムからフォントを登録して使っています。 でもこの方法だと、RemoveFontResourceを呼んでも システムを再起動しないと登録されたままになってしまいます。 その間はフォントファイルも削除できないです。 どうにかプログラム使用時だけフォントを有効にする方法はないでしょうか? プログラム終了すれば登録されたフォントも登録解除されるような方法がいいです。 >>245 ドキュメントを読むとWM_FONTCHANGEをブロードキャストする必要があるらしいけどやってる? もしくはAddFontResourceExでFR_PRIVATEを指定すると > When the process terminates, the system will remove all fonts installed by the process with the AddFontResourceEx function とあるからそれに頼るのもありかも >>246 AddFontResourceExでFR_PRIVATE指定でもしかするといけるかもしれませんね! 試してみます。ありがとうございます。 質問させてください。 日本語の Windows10 で、Windows Explorer のアドレスバーに 日本語で「デスクトップ」とだけ入力してエンターキーを押すとデスクトップに移動できます。 他にも、「ドキュメント」「ピクチャ」「ダウンロード」「3D オブジェクト」「OneDrive」など いくつかの単語が特定のフォルダーと関連付けられていますが、 この対応をプログラムで調べる方法はありますでしょうか。 例えば SHGetFileInfo を使えばデスクトップのフルパスから 「デスクトップ」という日本語の display name を得ることはできますが、 SHGetFileInfo では上記のような関連付けの有無は判定できませんし、 そもそもフルパスから日本語名を得るのではなくその逆をしたいので、 SHGetFileInfo はあまり役に立たなそうです。 何かお分かりのことがありましたら教えていただけないでしょうか。 どうぞよろしくお願いします。 SHGetLocalizedNameという関数が日本語パス名を返すみたいだが、逆はない。 SHGetSpecialFolderLocation/SHGetSpecialFolderPathで特殊フォルダのパス名を取得し、 SHGetLocalizedNameで日本語パス名を取得する。 それで対応表を作るといいだろう。 それは対応表作るにしても結構苦労するよ 例えば俺のWin10のユーザフォルダの中を見ると 同じフォルダ内にドキュメント、と、ピクチャ、が二つずつあったりする ディスプレイネームが同じでITEMIDLISTが違うアイテムが 同一フォルダに複数存在してたりする環境もあるって事 俺の場合は片方はOneDriveでもう一つはローカル用 同じ名前で同じフォルダ だから単にドキュメントといってもどっちの事か分からんwwwという事態に 苦労するよ、それ てか、同じ名前のアイテムを同一フォルダに突っ込むWindowsが糞仕様なんだけど 普通に使う分にもどっちがどっちか分からんでムカつく OneDriveの方は「ドキュメント(OneDrive)」とか区別付く名前にしとけよ それかOneDriveっていうフォルダ掘ってその下に配置しろよ 同じ名前のアイテムが同じフォルダにあると混乱することぐらい分かるだろ糞 アクセス履歴見ながら対応表を順次変更すりゃいい そういうのはアイデア次第でどうとでもなる >>249 レスどうもありがとうございます。 他の方のレスを拝見してみても、やっぱりなかなか難しそうですね。 >>250 大変有用な情報どうもありがとうございます。この方針が一番現実的そうですね。 SHGetSpecialFolderLocation/SHGetSpecialFolderPath は CSIDL しか受け付けなくて、「3D オブジェクト」のように CSIDL がないフォルダもあるので、 CSIDL の代わりに GUID が使える SHGetKnownFolderIDList を使おうと思います。 ただいずれにしても、どのフォルダの CSIDL/GUID を指定するかは プログラムの段階で決めないという認識で正しいでしょうか? その部分を自動で決められれば最高なのですが難しそうですね。 あと、日本語名を取得するのに SHGetLocalizedName を紹介していただきましたが、 SHGetFileInfo を使うのとどちらがいいでしょうか? SHGetFileInfo なら直接日本語名が得られるのに対して、SHGetLocalizedName だと 'the ID of the localized file name in the resource file' が返ってきますが、 こちらのほうがパフォーマンス的に有利だったりするのでしょうか? >>251 貴重なご意見どうもありがとうございます。確かになかなか問題の根は深そうです。 エクスプローラーのアドレスバーはそのあたりをいい感じに解決しているようなので その仕組みをそのまま拝借できたら楽なのですが、そう簡単には行かなさそうですね。 >>252 >>254 レスどうもありがとうございます。 確かに Windows のフォルダ階層の仕組みは少し分かりにくいところがありますが、 今回の件についてはその問題はあまり関係なくて、 ちょっと誤解を与えてしまっている気がするので改めてやりたいことを説明させていただきます。 エクスプローラでは、今どのフォルダを開いているかにかかわらず、 アドレスバーに単に「デスクトップ」とだけ入力してエンターキーを押せばデスクトップに移動できます。 つまり、エクスプローラーの中では「デスクトップ」という単一の単語とデスクトップのフルパスとが 対応付けられているということになります。そして私は、この対応表を取得したいと考えております。 質問です。 ファイルに関連付けされている実行ファイルパスを取得するのに FindExecutable()やAssocQueryString()を使っているのですが、 一部関連付けが取得できません。 どうやら関連付け先の実行ファイルの種類がWindowsパッケージ(デスクトップ)版と ストアアプリ版とでは動作が異なるらしく、パッケージ版は上記APIで取得できる ようですがストアアプリ版は取得できないようです。 仕方がないのでレジストリを直接たどる方法を模索しているのですが、 パッケージ版は分かるのですがストアアプリ版がよく分りません。 自分で調べた限りでは、HKCR\{拡張子}\OpenWithProgidsのREG_NONE型の{名前} を元に、HKCR\{名前}\ApplicationのApplicationNameまでたどればいいと いう情報を見つけて実践してみました。が、 (つづき) 実際に.pdfがedgeに関連付けられていて上記APIでは取得できない環境 においてレジストリをたどると \HKCR\.pdf\OpenWithProgids のREG_NONE型の名前「AppXd4nrz8ff68srnhf9t5a8sbjyar1cr723」を元に \HKCR\AppXd4nrz8ff68srnhf9t5a8sbjyar1cr723\Application のApplicationNameまではたどり着きました。 しかしこれに設定されている文字列が @{Microsoft.MicrosoftEdge_44.18362.329.0_neutral__8wekyb3d8bbwe?ms-resource://Microsoft.MicrosoftEdge/Resources/AppName} となっています。 どう見ても実行パスではないというか、これをさらにどうにかするのか たどる方法が間違っているのか分からなくなりました。 正しい方法をよろしくお願いします。 >>256 試しにmspaintと入力してエンター押したらペイントが起動しない? と言う事は入力が日本語ならC:\Users\<ユーザー名>\この中の対応するフォルダを開く とか内部でやってるんじゃないかな 英語の場合はLoadLibraryと同じように Explorer.exeと同じディレクトリ Explorer.exeのカレントディレクトリ システムディレクトリ Windowsディレクトリ 環境変数のPATHに指定されてるディレクトリ の順で検索されてmspaintが起動とか >>259 レスありがとうございます。お返事が遅くなってしまい申し訳ないです。 > 試しにmspaintと入力してエンター押したらペイントが起動しない? 本当ですね! しかし一方で、C:\Users\<ユーザ名>\AppData というフォルダはあるのに アドレスバーに AppData と入力してエンターを押しても期待通りの動作はせず、 なかなかルールは複雑みたいです。 また、日本語環境ではアドレスバーに「Desktop」と入力してエンターを押しても 期待される動作にはならず、「デスクトップ」でなければならないようなので、 やはりシステムの言語設定は関係あるように思われます。 SHGetFileInfo で取得できる displayName を調べれば 日本語環境ならデスクトップフォルダから「デスクトップ」という文字列が得られるので その逆ができればいいかと思ったのですが、実際はそれほど簡単な問題ではないようです。 例えば私の環境では C:\Users\<ユーザ名> の displayName は ウィンドウズの GUI から設定できる「ユーザ名(アカウント名)」になっていますが、 エクスプローラーのアドレスバーで期待通りの動作になる文字列は 「ユーザ名(アカウント名)」ではなく「フルネーム」でした。 エクスプローラーのアドレスバーの動作を完全に模倣するのは難しそうですが、 ここでいただいたアドバイスを元に、現実的な方法を考えていきたいと思います。 >>261 いくつか気付いた事を報告 その1/2 ・ユーザーフォルダ内のフォルダで移動できたもの アドレス帳 お気に入り デスクトップ ドキュメント ピクチャ ビデオ ミュージック 仮説1 〜\<ユーザー名>\(日本語名で表示される一部のフォルダ)って条件なのかもしれない 仮説2 仮説1の一部のフォルダで法則があるとしたらレジストリで保存場所を変更できるフォルダではないか? 試しに「プログラム」「スタートアップ」と入力しても移動できた レジストリの「HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders」 ここに列挙されてるやつがヒントになるかもしれない ・レジストリをヒントに入力して移動できたもの プログラム recent sendto スタート メニュー スタートアップ ・その他で移動できたもの (ツリービューで日本語表記をヒントにした) パブリック コンピュータ ネットワーク コントロール パネル ごみ箱 いくつか気付いた事を報告 その2/2 ・ここまでの間に気付いた事 アドレスバーに「コ」と入力すると コントロール パネル コンピュータ コンピュータの簡単操作センター この3つの入力候補が現れたけど 入力候補が表示されるのとされないのもあった あと日本語・英語混在(sendto recent)でさらに混乱させる事になってしまったかもしれないw ドキュメントがDocumentsの表示になった時の直し方で LocalizedResourceNameが出てくるからそれをヒントにするのもいいかもしれない >>262 コメントどうもありがとうございます。 色々とレジストリにもヒントが隠れてそうなので調べてみたいと思います。 >>263-265 大変有用な情報どうもありがとうございます。 書いていただいた内容を見ながら実験してみて分かったこととして、 問題のアドレスバーの挙動は環境によって相当にブレがあるようです。 私の環境(Windows 10 Pro)では、 >>263 に書いていただいた文字列のうち 「recent」「コンピュータ(ちなみにコンピュータ『ー』もダメ)」は 期待通りの動作にならず、代わりにブラウザ(私の環境では Firefox)で 入力した文字列が検索されてしまいました。 私の環境ではアドレスバーに「Creative Cloud Files」と入力すると 対応する Adobe のソフトが作ったフォルダが開かれるので ある程度外部ソフト等の影響があるだろうとは思っていたのですが、 「コンピュータ」ですら環境によって結果が異なるとは予想外でした。 ちなみに外部ソフトの影響に関しては、レジストリの HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace に登録されているものが該当しているような気がするのですが、 確かなことは分かっていません。 ともあれ、非常に興味深い実験結果と考察を読ませていただき 大変勉強になりました。どうもありがとうございます。 また何かお気づきのことがあれば教えていただけると嬉しく思います。 >>266 10の場合はコンピュータがPCに変わったんだと思う デフォルトで用意されている日本語のフォルダ名を英語に戻す https://laboradian.com/use-en-folder-name/ 11個の日本語名になっているフォルダ 日本語名のフォルダには、desktop.ini という隠しファイルがある Win32アプリのバージョンリソースについての質問です。 自作アプリの1.0.0をリリースした後、1.1.0を作成中にベータ版を出す場合、 リソースのFILEVERSIONやPRODUCTVERSIONはどのように記述するのがよいのでしょうか。 1,1,0,0は、1.1.0の正式版に使いたいのですが、これより大きい値を付けるのも変だし、 数字以外の文字は入力できないようなので。 好きにしろよww 自作アプリなんて俺は1.0も1.1も2.0もみんなβだから1.00から0.01刻みで増やしてる 昔はカスタムビルドステップでビルド番号もつけてたけど今はやってない ちょろめとかふぃれふぉxはメジャーの数字上げ過ぎてひどいことになってるな ばかなんですかね 1.0.0.01 1.0.0.011 1.0.0.0111 1.0.0.01111 >>271 > 1.0.0.1とかはあかんの? やっぱりこれが妥当なんですかね。 他のアプリのベータ版も見てみたいとは思うのですが。 秀丸エディタは、ベータ版は4桁目を増やし続けて、リリース版には99を入れてました。 1.1.0.99が1.1.0のリリース版という法則でした。 > 1.1.0.α > 1.0.0.01 FILEVERSIONやPRODUCTVERSIONには、αや01は入力できないです。 必ず4つの数字を入れないと、勝手に0が入ってしまいますし。 昔、同僚にクラス設計やコメントの書式にやたら拘る奴がいたの思い出した 綺麗なソースコード書いてたけど、まったく動かないゴミですぐ職場から消えたわw そういう人って恋人も見た目重視にしてそう ソースコード(見た目)って意味で >>276 所詮決め事なんで>>272 の言うとおり好きにしてくださいって話だけど 良くありがちなのは メジャーバージョン.マイナーバージョン.ビルドバージョン みたいな メジャーバージョンはアーキテクチャとかUIの大きな変更とかユーザから見ても 変更されたことが分かるような場合 マイナーバージョンは単機能追加とかバグ修正などユーザから一見分からない ような軽微な変更の場合 ビルドバージョンは作業途中の状態を管理するための連番や単一作業の区切りを 管理するための連番とか みたいな感じで自分で目的を決めて使うしかないよ 他には作業の効率管理のためにさらにビルド回数を最後に付けてコンパイルする たびに番号加算していくとか 後はOSのバージョンごとにパッキングを変える場合はPRODUCTOVERSIONと FILEVERSIONを関連性は持たせるけど個別に管理するとか >>273 あれは企業的に仕事をしてますよアピールなので残念なのは経営層か 投資家かな バグ修正はマイナーバージョン、それ以外はすべてメジャーバージョンの修正に することですごくたくさん仕事してますよがアピールできるので >>273 さんはそんなこと言われなくても判ってて書いてるだろ INVALID_HANDLE_VALUEってマジで糞だよな うっかりしてると失敗したときNULLが返ってくるって勘違いするというか ボーッとしてるとそういうコード書いちまうことがある 大概のAPIでは失敗したときNULLが返ってくるってのもある 混在いやん あと、なんでINVALID_HANDLE_VALUEが必要になったのか技術的な背景が気になる 普通に0を返しとけばいいじゃん、って思うよね 他のAPIがそうなってるんだから 謎 >>281 どんなAPIでも最低限の仕様確認してから使えよ しかしそれらを超越した次元で総合的に判断してやっぱりINVALID_HANDLE_VALUEは糞 必要ないからな >>284 それは論点が違う マジで糞かどうかだろうが 285はちゃんと自分なりの見解を言っているし 286は情報提供している お前だけとかくだらんことしか言わんボーガスとは次元が違う 16bit時代は低コストに拘るあまり 色々とアホなことをしていた その名残を糞って言えないやつも糞だ ComboBoxはCB_ERRがある ListBoxはLB_ERRがある ListViewはただの-1で定義無し LV_ERRじゃないのはなんで? >>286 読んで思い出したが そうそうHANDLEのスマポ作るときにウザいんだよな 既定の初期値を何にしておくかって問題があるからな! ああ糞だ 後HANDLEのスマポのデストラクタでCloseHandleするとき 失敗したり何も入ってなかったり 無効なハンドルの場合はCloseHandleしないようにする場合も嫌らしい 無効なハンドルを表す値が二つ有るからな!! if( handle && handle != INVALID_HANDLE_VALUE ){ ::CloseHandle( handle ); } と書いてしまいたいところだが、本当にこれでよいのか? それかCloseHandleに無効なハンドルを渡したときは何もしないことを期待して if文なしで単に::CloseHandle( handle );とだけ書くか しかしCloseHandleに無効なハンドルを渡したときの動作はMSDNには書かれてないんだよな まぁ何もしないと思うが ああ今調べたら、CloseHandleに無効なハンドル渡したら GetLastErrorが汚染されるらしいな 初期化と開放とかのインターフェース作って、そのインターフェース派生でAPIアクセスしてるな その手のはAPI直接叩くソース書くと後からコーディングミスに気付いても修正困難になるしバグの元 >>288 前者2つはOS基本機能、後者はコモンコントロールというオプション という違いから歴史と立ち位置が違う ついでに言えば設計から全然違うんで、定義がないのは不思議ではない どれもコモンコントロールだよ 歴史的には昔はリストビューがコモンコントロールじゃなかったかもしれないが分からない 昔のWindowsAPIはHANDLEとポインタが別物だったのを知らん人がいるのか >>288 ポインタが奇数になるはずはない(キリっ だから奇数の空間を全て別のオブジェクトに おれ天才じゃね?って糞言語が日本にはある フリーのリソースエディタとAPIでGUIプログラムを作っているけど、 もう時代遅れなのかな。 みなさんは、GUIプログラムはどうやって作っていますか。 リソースエディタなんぞ使わず全部apiからテキストエディタ上で 数値指定で作ってるんでそんな自分よりかは進んでるぞ まあ今の時代ならvisual studio使うのが普通だろうね >>297 cygwin/mingw64 でコンパイル・リンクできるよう、リソースは手書きですね… ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.4 2024/05/19 Walang Kapalit ★ | Donguri System Team 5ちゃんねる