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/
Win32API質問箱 Build126
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2020/05/01(金) 22:16:51.96ID:ZJ42fMZB702デフォルトの名無しさん
2021/07/16(金) 11:57:18.77ID:teDb7k99 UNICODE マクロが定義されていればそれはそう
703デフォルトの名無しさん
2021/07/16(金) 11:58:40.86ID:wMimqxZO Tがつく奴はUNICODEの定義の有無でwchar_tかcharに変わるから
704デフォルトの名無しさん
2021/07/16(金) 13:31:01.23ID:rEsqDZWm705デフォルトの名無しさん
2021/07/16(金) 14:39:23.11ID:qFBlhvM+ UNICODE対応とはいわばUTF8に対応していると思っている僕がかつて居ました
706デフォルトの名無しさん
2021/07/16(金) 16:32:41.77ID:6/LQ7Fle いまどき -D_UNICODE せんやつはおらんよな?よな?
707デフォルトの名無しさん
2021/07/16(金) 17:34:41.64ID:AYv25WJv >>706
>いまどき -D_UNICODE せんやつはおらんよな?よな?
自分はここしばらくWindowsのプログラムから離れてるんで、思い違いしてるかもしれんが・・・
いまどきはWindows10のワールドワイド言語サポートを使ってアプリ内部・外部入出力ともUTF-8にするんじゃないか?
>いまどき -D_UNICODE せんやつはおらんよな?よな?
自分はここしばらくWindowsのプログラムから離れてるんで、思い違いしてるかもしれんが・・・
いまどきはWindows10のワールドワイド言語サポートを使ってアプリ内部・外部入出力ともUTF-8にするんじゃないか?
708デフォルトの名無しさん
2021/07/16(金) 17:54:02.54ID:kcNPB8fl _UNICODEはWin32APIがUTF-16版かどうかの話なんでアプリは好きにやりゃええねん
709デフォルトの名無しさん
2021/07/16(金) 17:58:18.04ID:uF0JvJPV710デフォルトの名無しさん
2021/07/16(金) 18:27:58.18ID:uF0JvJPV 失礼、積むではなく詰むだった
711デフォルトの名無しさん
2021/07/16(金) 19:08:27.97ID:tbXedaSH ビジネスが破綻する大半の原因は、 ”ビジネスを始める人の大半が、真の意味での
「起業家」ではなく、 起業したい、という熱に浮かれた「職人」として働いているに過ぎない。”
という事実にあります。
「職人」によって運営されているビジネスは、ビジネスが働くのではなく、彼ら自身が毎日働くこと
によって、成り立っています。
彼らは毎日、自分がやり方を知っている仕事を一生懸命にこなしていますが、「起業家」としての
視点が無いために、成長に限界が生まれます。
そして、生計を立てるために、彼ら自身がずっと働き続けないとならないのです。
誰もが必ず陥る罠
私が見ている限り、起業熱にうなされる人たちは、必ずと言ってもよいほど誤った
「仮定」を置いてしまうようだ。実は、のちに彼らが苦難の道を歩むことになるのは、
この、「仮定」が致命的に間違っているからなのである
致命的な仮定とは・・・「事業の中心となる専門的な能力があれば、事業を経営する能力は
十分に備わっている」ということである
私がこの仮定を致命的だと書いたのは、この仮定が間違っているからにほかならない
事業の中で専門的な仕事をこなすことと、その能力を生かして事業を経営することは
全く別の問題である。高い専門能力を持つ人にとって、独立は他人の為に働くという苦痛から
解放されるということを意味していた。それにもかかわらず、前提となる「仮定」が致命的とも
いえるほど間違えているために、彼らは自由になるどころか、自分が始めた事業に苦しめ
られるようになってしまうのである
マイケルEガーバー「はじめの一歩を踏み出そう」P28~29
「起業家」ではなく、 起業したい、という熱に浮かれた「職人」として働いているに過ぎない。”
という事実にあります。
「職人」によって運営されているビジネスは、ビジネスが働くのではなく、彼ら自身が毎日働くこと
によって、成り立っています。
彼らは毎日、自分がやり方を知っている仕事を一生懸命にこなしていますが、「起業家」としての
視点が無いために、成長に限界が生まれます。
そして、生計を立てるために、彼ら自身がずっと働き続けないとならないのです。
誰もが必ず陥る罠
私が見ている限り、起業熱にうなされる人たちは、必ずと言ってもよいほど誤った
「仮定」を置いてしまうようだ。実は、のちに彼らが苦難の道を歩むことになるのは、
この、「仮定」が致命的に間違っているからなのである
致命的な仮定とは・・・「事業の中心となる専門的な能力があれば、事業を経営する能力は
十分に備わっている」ということである
私がこの仮定を致命的だと書いたのは、この仮定が間違っているからにほかならない
事業の中で専門的な仕事をこなすことと、その能力を生かして事業を経営することは
全く別の問題である。高い専門能力を持つ人にとって、独立は他人の為に働くという苦痛から
解放されるということを意味していた。それにもかかわらず、前提となる「仮定」が致命的とも
いえるほど間違えているために、彼らは自由になるどころか、自分が始めた事業に苦しめ
られるようになってしまうのである
マイケルEガーバー「はじめの一歩を踏み出そう」P28~29
712デフォルトの名無しさん
2021/07/27(火) 13:44:15.34ID:y9fA4YVt Windows用のMFC製のアプリをシェアウェアとして公開するのに、
Vector以外に良いものは無い?
Vectorは作者登録の手順がとてもメンドクサイ。
写真を送ったりとか、作者にばかりプライバシーや個人情報を負担させる仕組み。
Vector以外に良いものは無い?
Vectorは作者登録の手順がとてもメンドクサイ。
写真を送ったりとか、作者にばかりプライバシーや個人情報を負担させる仕組み。
713デフォルトの名無しさん
2021/07/27(火) 14:41:02.45ID:sR0km73W 色々書こうかと思ったけどスレ違い
714デフォルトの名無しさん
2021/07/27(火) 16:09:06.09ID:Dog97Bpd 窓の杜
715デフォルトの名無しさん
2021/07/27(火) 16:48:35.67ID:LLIxYIVW >>712
>作者にばかりプライバシーや個人情報を負担させる仕組み。
ソフトウェア等のダウンロード販売は、
特定商取引法に基づいて住所や氏名(法人名)等の公開が必要
>Vector以外に良いものは無い?
自分のHPにアップしてReadMeに振込先等書いとけば?
>作者にばかりプライバシーや個人情報を負担させる仕組み。
ソフトウェア等のダウンロード販売は、
特定商取引法に基づいて住所や氏名(法人名)等の公開が必要
>Vector以外に良いものは無い?
自分のHPにアップしてReadMeに振込先等書いとけば?
716デフォルトの名無しさん
2021/07/27(火) 18:12:55.62ID:4Be/pZ1T717デフォルトの名無しさん
2021/07/27(火) 18:24:12.75ID:M3obGnf2 こういうのとかは?
ttps://blog.okazuki.jp/entry/2018/10/04/160349
ttps://blog.okazuki.jp/entry/2018/10/04/160349
718デフォルトの名無しさん
2021/07/27(火) 18:40:47.67ID:4Be/pZ1T719デフォルトの名無しさん
2021/07/27(火) 18:44:25.23ID:4Be/pZ1T インストーラー作りに2ヶ月くらいかかりそう。
なんのためにそんな必要が。
なんのためにそんな必要が。
720デフォルトの名無しさん
2021/07/27(火) 18:45:21.80ID:M3obGnf2 MFCメインアプリを起動するためだけのUWPランチャアプリでも登録すればワンチャン?
721デフォルトの名無しさん
2021/07/27(火) 18:55:07.32ID:klQCV9Qk 金のためちゃうの
722デフォルトの名無しさん
2021/07/27(火) 19:06:58.56ID:4Be/pZ1T ヤフオクでデータやパスワードを売ることも出来るらしいけど、
一回登録したら100人でも1,000人でも売れるようにすることは出来ないのかな?
そもそも、1000人分を「商品」として一度に登録できるのだろうか?
一回登録したら100人でも1,000人でも売れるようにすることは出来ないのかな?
そもそも、1000人分を「商品」として一度に登録できるのだろうか?
723デフォルトの名無しさん
2021/07/28(水) 15:46:01.54ID:RWVJ8OqO Windows 11のストアで配布する
あれって何でも配布できるようになるんだっけ??
あれって何でも配布できるようになるんだっけ??
724デフォルトの名無しさん
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回ほどのエラーで低確率すぎるのと対策が思い付かなくて困っています
原因と可能性について助言頂けませんでしょうか
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回ほどのエラーで低確率すぎるのと対策が思い付かなくて困っています
原因と可能性について助言頂けませんでしょうか
725蟻人間 ◆T6xkBnTXz7B0
2021/08/19(木) 01:01:43.70ID:Dgde8QnE >>724
ウィンドウズは、裏でシェルの変更通知やウィルススキャンやフックなどが動いてたりするんだよね。
それでファイルの確実な処理をしたいと言うことなら、処理を見直す必要がある。MoveFileを一つの処理と思ってるなら間違いだ。実際にはコピーした後で削除している。
【現在の処理】
Dを削除。
SをDに移動(実際はSをDにコピーしてSを削除)。
Dを読み込み。
【提案】
SをDに上書きコピー(CopyFile/CopyFileEx)。
Sを読み込む。
Sを削除。
ウィンドウズは、裏でシェルの変更通知やウィルススキャンやフックなどが動いてたりするんだよね。
それでファイルの確実な処理をしたいと言うことなら、処理を見直す必要がある。MoveFileを一つの処理と思ってるなら間違いだ。実際にはコピーした後で削除している。
【現在の処理】
Dを削除。
SをDに移動(実際はSをDにコピーしてSを削除)。
Dを読み込み。
【提案】
SをDに上書きコピー(CopyFile/CopyFileEx)。
Sを読み込む。
Sを削除。
726デフォルトの名無しさん
2021/08/19(木) 01:26:06.58ID:EXq1UPUJ727デフォルトの名無しさん
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の代わりになるものを自分で作ることも思い浮かびますが、
そもそも論として今回のような処理でここまでするものなのか?
という疑問と疑心暗鬼に陥っています
レスありがとうございます
質問が長くなったので要点を絞り込んだつもりでしたが、もう少し追記させていただきます
dst_pathはpathの拡張子のみを変更したものですので、同じドライブ・フォルダになります
また、MoveFileの仕組みは仰るような仕組みで理解しているつもりですが、renameでも解決しないのが理解に苦しむところです
(といってもrenameの実装がどうなっているのか知らないのですが)
この処理で行っていることは、テキストログ中の不要な行を削除したいということで、
【現在の処理】
Dを削除。
SをDに移動(実際はSをDにコピーしてSを削除)。
Dを読み込みながら、Sに新規書き込み(削除したい行を読み捨てながら)。
という単純なことを行っていますのでご提案そのままではだめですが
【修正案】
Sを読み込みながら、Dに新規書き込み(削除したい行を読み捨てながら)。
Sを削除。
DをSにリネーム(MoveFile/rename)。
が思い付くのですが、そうするとSを書き込んでいるところ(全く別の場所ですが)で
もしかしてエラーが出るようになるのではという不安があります
いっそのことMoveFileの代わりになるものを自分で作ることも思い浮かびますが、
そもそも論として今回のような処理でここまでするものなのか?
という疑問と疑心暗鬼に陥っています
728デフォルトの名無しさん
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);
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);
729デフォルトの名無しさん
2021/08/19(木) 18:37:22.67ID:STngTfXn >>724
fopenでのエラーを調べるならGetLastErrorじゃなくてerrnoじゃないかな?
fopenでのエラーを調べるならGetLastErrorじゃなくてerrnoじゃないかな?
730デフォルトの名無しさん
2021/08/19(木) 21:29:03.55ID:kB3hjHkq731デフォルトの名無しさん
2021/08/20(金) 01:37:15.55ID:irg7D4zd732デフォルトの名無しさん
2021/08/20(金) 01:39:08.93ID:irg7D4zd >>730
本件とは別件で新たな質問になってしまいますが、
プロセスAでファイルAをunlinkで削除
WM_APPを別プロセスBにPostMessageで通知
プロセスBでファイルAを再作成(プロセスBが起動していなくても、起動時にファイルAが無ければ再作成)
という箇所があるのですが、要するにキャッシュファイル的なものを削除して別プロセスで再作成を指示するようなことをしています
ここも稀に(?)再作成で失敗することがあるので気になっていました
Windowsプログラミングにおいて、ファイルの削除や移動についてはその後ウェイトを挟むか、
ファイルの作成でエラーが出たらリトライを入れるというのは常識的なものなのでしょうか?
本件とは別件で新たな質問になってしまいますが、
プロセスAでファイルAをunlinkで削除
WM_APPを別プロセスBにPostMessageで通知
プロセスBでファイルAを再作成(プロセスBが起動していなくても、起動時にファイルAが無ければ再作成)
という箇所があるのですが、要するにキャッシュファイル的なものを削除して別プロセスで再作成を指示するようなことをしています
ここも稀に(?)再作成で失敗することがあるので気になっていました
Windowsプログラミングにおいて、ファイルの削除や移動についてはその後ウェイトを挟むか、
ファイルの作成でエラーが出たらリトライを入れるというのは常識的なものなのでしょうか?
733デフォルトの名無しさん
2021/08/20(金) 07:19:25.62ID:BD3SOXSp 確実に作りたければ、中間ファイル作るやろ
734デフォルトの名無しさん
2021/08/20(金) 07:42:41.01ID:T1KE4JYK まーた覚え立ての言葉使いたがる子供が
735デフォルトの名無しさん
2021/08/20(金) 09:25:06.01ID:Swd1/18e >>732
常識って人それぞれだからなあ...
エラー終了して使用者に丸投げするか、どこまでリトライするか、
ウエイトするのかリトライするのかはプログラムの次第だし...
今回の件のように、直前に誰かがお触りしてるのが
確実なのであれば、リトライするかウエイト入れるのが
確実だと思うよ。
常識って人それぞれだからなあ...
エラー終了して使用者に丸投げするか、どこまでリトライするか、
ウエイトするのかリトライするのかはプログラムの次第だし...
今回の件のように、直前に誰かがお触りしてるのが
確実なのであれば、リトライするかウエイト入れるのが
確実だと思うよ。
736デフォルトの名無しさん
2021/08/21(土) 10:35:42.11ID:+K/WXdke >>724
closeしてないやん?
closeしてないやん?
737デフォルトの名無しさん
2021/08/21(土) 10:38:21.22ID:+K/WXdke >>731
CreateFile したハンドルを FILE * に変換したら fgets 使えるが
CreateFile したハンドルを FILE * に変換したら fgets 使えるが
738デフォルトの名無しさん
2021/08/21(土) 10:40:30.17ID:+K/WXdke >>732
>Windowsプログラミングにおいて、ファイルの削除や移動についてはその後ウェイトを挟むか、
>ファイルの作成でエラーが出たらリトライを入れるというのは常識的なものなのでしょうか?
根本的な思い違いをしているに一票
>Windowsプログラミングにおいて、ファイルの削除や移動についてはその後ウェイトを挟むか、
>ファイルの作成でエラーが出たらリトライを入れるというのは常識的なものなのでしょうか?
根本的な思い違いをしているに一票
739デフォルトの名無しさん
2021/08/21(土) 11:38:33.02ID:ssXITtrX740デフォルトの名無しさん
2021/08/21(土) 12:28:01.97ID:FhcAlSkM741デフォルトの名無しさん
2021/08/21(土) 12:54:10.92ID:JKiZ0yss そこまでせんでもcreatefileしたハンドルで移動してから一旦閉じてfopenでよくね?
742ハノン ◆QZaw55cn4c
2021/08/21(土) 14:27:27.29 再現できる簡単なソースは公開可能ですか?
743デフォルトの名無しさん
2021/08/21(土) 21:53:40.08ID:dwXwyCwb >>741
今回の問題は、いったん閉じてもカーネルが握ってるのでfopen()できないって話で
今回の問題は、いったん閉じてもカーネルが握ってるのでfopen()できないって話で
744デフォルトの名無しさん
2021/08/22(日) 12:32:08.06ID:fq28dqqO >>743
だからMoveFileを代替しても同じやんって話で
だからMoveFileを代替しても同じやんって話で
745デフォルトの名無しさん
2021/08/22(日) 14:46:53.71ID:HtdC9XOd MoveFileEx「あのっ」
746デフォルトの名無しさん
2021/08/22(日) 16:25:47.23ID:44Fq7Iy0 論理的に考えれば「カーネル」が
握るわけ無いだろう。
ゴルフか麻雀でもしているののか
握るわけ無いだろう。
ゴルフか麻雀でもしているののか
747デフォルトの名無しさん
2021/08/22(日) 16:40:10.74ID:oA0Vr62Q ロクに質問読まずにというか理解せずにレスしてる馬鹿は何なの
748デフォルトの名無しさん
2021/08/22(日) 17:05:53.52ID:kaETDw8p 747の同類かと
749デフォルトの名無しさん
2021/08/22(日) 18:03:47.50ID:3exyu3cG >>732
環境依存なことを考えて戻り値確認するのは別にWindowsに限らないし、戻り値が正常でも外部デバイス相手だとドライバ次第なこともある
別件で、組み込みWindowsでユーザがアプリが正常終了してすぐに電源コード引っこ抜くから
キャッシュがHDDに書き込まれずに消えるって事例はあったな
環境依存なことを考えて戻り値確認するのは別にWindowsに限らないし、戻り値が正常でも外部デバイス相手だとドライバ次第なこともある
別件で、組み込みWindowsでユーザがアプリが正常終了してすぐに電源コード引っこ抜くから
キャッシュがHDDに書き込まれずに消えるって事例はあったな
750デフォルトの名無しさん
2021/08/23(月) 07:47:18.19ID:klNpYQV6751デフォルトの名無しさん
2021/08/25(水) 19:50:31.67ID:s4bO6YKI LoadLibraryとかGetProcAddressしたものは
必ずFreeLibraryしないといけませんか?
自分のプロセスが必ず終了するときにFreeLibraryせずに放置しても勝手に解放される?
必ずFreeLibraryしないといけませんか?
自分のプロセスが必ず終了するときにFreeLibraryせずに放置しても勝手に解放される?
752デフォルトの名無しさん
2021/08/25(水) 20:26:18.34ID:TCNLfe6z753デフォルトの名無しさん
2021/08/25(水) 21:58:54.28ID:ENQvEefU >>751
プロセスごと始末してくれるから放置で構わん
プロセスごと始末してくれるから放置で構わん
754デフォルトの名無しさん
2021/08/26(木) 05:00:21.78ID:znb4Cn9C 変な日本語・・・
755デフォルトの名無しさん
2021/08/26(木) 16:28:52.50ID:WPRv8+9f こっちくんな
756デフォルトの名無しさん
2021/08/26(木) 17:50:13.63ID:DS5buh7a やって来ました
メッセージボックスで「計算結果はXX」って表示したくて
1 LPCWSTR func() {LPCWSTR a = L"//計算結果の値"; return a;} //計算結果を文字列にして返す関数
2 //以下WinMain()内
3 LPCWSTR a = L"計算結果は";
4 LPCWSTR b = func();
5 LPCWSTR c = 文字列を連結する関数(a, b); //StringCchCatW(), lstrcatW()などを試したがだめだった
6 MessageBoxW(hWnd, c, L"タイトルバー", MB_OK);
と書いたが動かなかった・・・
まず、1行目の「L"//計算結果の値"」に計算結果の変数を入れる方法がわからない
そして、5行目のLPCWSTR型の文字列を連結する方法がわからなからない
一日の大半がエラーとのにらめっこに費やされて辛い・・・
頼む、手伝ってくれさい
メッセージボックスで「計算結果は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型の文字列を連結する方法がわからなからない
一日の大半がエラーとのにらめっこに費やされて辛い・・・
頼む、手伝ってくれさい
757デフォルトの名無しさん
2021/08/26(木) 17:58:52.10ID:+hQVnBsv 宿題スレ案件ですか?
758デフォルトの名無しさん
2021/08/26(木) 18:24:36.40ID:DS5buh7a >>757
いや普通にニート
いや普通にニート
759デフォルトの名無しさん
2021/08/26(木) 18:27:20.48ID:56nPMNqk >>756
Win32APIではなくC言語の文字列とポインタの違いを勉強するところからやり直し
Win32APIではなくC言語の文字列とポインタの違いを勉強するところからやり直し
760デフォルトの名無しさん
2021/08/26(木) 18:29:12.42ID:iCFmJ4nN wsprintf
761デフォルトの名無しさん
2021/08/26(木) 19:08:13.70ID:Dr81uOON ニートならできないことは諦めればいいんじゃね?
762デフォルトの名無しさん
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);
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);
763デフォルトの名無しさん
2021/08/26(木) 19:19:53.55ID:WgbRBOxo >>756
自分がどう書いたのかソースそのまま出して
自分がどう書いたのかソースそのまま出して
764デフォルトの名無しさん
2021/08/26(木) 19:21:59.37ID:ltVuiEkY 普通にwstringベースで作れ。
win32のwchar_t*型渡すところで、data()やc_str()使え。
std::to_wstring で数値などなどメジャーな数値型はwstringになる。
最初はwin32の型に代替名つけまくりな文化は
一体なんの型だよって感じで戸惑うわな。
win32のwchar_t*型渡すところで、data()やc_str()使え。
std::to_wstring で数値などなどメジャーな数値型はwstringになる。
最初はwin32の型に代替名つけまくりな文化は
一体なんの型だよって感じで戸惑うわな。
765デフォルトの名無しさん
2021/08/26(木) 19:22:39.20ID:s9ncfwmd >>762
以下の関数を使えば、7 は、
wchar_t *wpszText = ConvertAcpMbcsToUtf16(str2);
でいける。
wchar_t *ConvertAcpMbcsToUtf16( const char *pszStr )
{
// ワイド文字列(UTF16, unicode) へ変換後の文字列長を得る
int lenUnicode = MultiByteToWideChar( CP_THREAD_ACP, 0, pszStr, -1, NULL, 0 );
// 必要な分だけ ワイド文字列(UTF16, unicode) のバッファを確保
wchar_t *pbufUnicode = new wchar_t [lenUnicode];
if ( pbufUnicode == NULL ) {
return NULL;
}
// デフォルトコードページ(ShiftJISなど) から ワイド文字列(UTF16, unicode) へ変換する :
MultiByteToWideChar( CP_THREAD_ACP, 0, pszStr, -1, pbufUnicode, lenUnicode );
return pbufUnicode;
以下の関数を使えば、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;
766デフォルトの名無しさん
2021/08/26(木) 19:24:55.54ID:s9ncfwmd767デフォルトの名無しさん
2021/08/26(木) 19:30:35.44ID:s9ncfwmd おっと、最後、MessageBoxW ではなく、MessageBoxA を使っていれば、
7や >>765 の工程は不要で、
MessageBoxA(hWnd, str2, "タイトルバー", MB_OK);
だけでいける。
7や >>765 の工程は不要で、
MessageBoxA(hWnd, str2, "タイトルバー", MB_OK);
だけでいける。
768デフォルトの名無しさん
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);
void func(CString &str) { str = "計算結果の値"; }
// 以下WinMain()内
CString strKekka;
func( strKekka ); // strKekka に計算結果の文字列が入って返って来る。
CString str2 = CString("計算結果は") + strKekka;
MessageBoxA(hWnd, str2, "タイトルバー", MB_OK);
769デフォルトの名無しさん
2021/08/26(木) 22:24:23.76ID:OnjvrKFf 連結はstrcatかsprintf("%s%s", s1, s2 )のTCHAR(wchar_t)版でいけるやろ
あとLPCWSTRはポインタなので、ちゃんと割り当てしてなくて未初期化のままとかないだろうな?
あとLPCWSTRはポインタなので、ちゃんと割り当てしてなくて未初期化のままとかないだろうな?
770蟻人間 ◆T6xkBnTXz7B0
2021/08/27(金) 02:18:22.79ID:PcAf749w LPCWSTRのCはCONST(定数)という意味だから、変更できない。WはWide、つまりUTF-16.
Win32をやる前にC言語の文字列処理をマスターしてくれ。
wsprintfは時代遅れ。バッファオーバーフローを避けるため、バッファサイズ指定できる<strsafe.h>のStringCch...関数群を推奨。
Win32をやる前にC言語の文字列処理をマスターしてくれ。
wsprintfは時代遅れ。バッファオーバーフローを避けるため、バッファサイズ指定できる<strsafe.h>のStringCch...関数群を推奨。
771蟻人間 ◆T6xkBnTXz7B0
2021/08/27(金) 02:34:26.66ID:PcAf749w ポインタ変数は実体を持たない。文字列扱うにはバッファが必要。動的にバッファを確保して楽したいなら、標準C++のstd::wstringか、MFC/WTLのCStringWを使う。
ただし、std::wstringを使う場合でC文字列が欲しい場合はc_str()メソッドを使う必要がある。下手な型キャストはケガのもと。
ただし、std::wstringを使う場合でC文字列が欲しい場合はc_str()メソッドを使う必要がある。下手な型キャストはケガのもと。
772デフォルトの名無しさん
2021/08/27(金) 07:26:15.44ID:4k6BS6Dx WindowsでC/C++を学ぼうとすると、文字列の扱いは混乱するだろうね
OSを特定しない教科書に載ってるようなやり方もできるから心配するな
一応の結果の表示をできるようになったら、とりあえずその方法だけ使って次に進んで、一通り理解したらまた文字列処理に戻ってくるといいんじゃないかな
OSを特定しない教科書に載ってるようなやり方もできるから心配するな
一応の結果の表示をできるようになったら、とりあえずその方法だけ使って次に進んで、一通り理解したらまた文字列処理に戻ってくるといいんじゃないかな
773デフォルトの名無しさん
2021/08/27(金) 07:43:07.26ID:bixNKZnz ぎゃー
教えてくれたのに遅れてすまん
今からエディター起動する
教えてくれたのに遅れてすまん
今からエディター起動する
774デフォルトの名無しさん
2021/08/27(金) 08:37:51.16ID:lOnGsJ7M スレタイ読もうな?
775デフォルトの名無しさん
2021/08/27(金) 10:35:04.22ID:Zo8CY4eq >>770-771
この段階の人には情報過多
この段階の人には情報過多
776デフォルトの名無しさん
2021/08/27(金) 10:43:55.91ID:BFKMFKNN C言語の基礎からやり直せ、と助言するのが正しい
777デフォルトの名無しさん
2021/08/27(金) 11:25:56.35ID:bixNKZnz778デフォルトの名無しさん
2021/08/27(金) 11:59:25.59ID:Ti/YAON1 お前には完成する能力は無い
779デフォルトの名無しさん
2021/08/27(金) 12:35:37.97ID:S83DaDnk 先が思いやられるな
特にWin32APIにこだわる理由が無いならC#でやることをおすすめする
特にWin32APIにこだわる理由が無いならC#でやることをおすすめする
780デフォルトの名無しさん
2021/08/27(金) 18:42:32.62ID:v1ag2e+a 特殊な理由でもない限りネイティブc/c++なんて使わんでいいよ
781デフォルトの名無しさん
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);
- - - - - - - - - - - - - - - -
LPCTSTR a;
int b;
TCHAR c[20];
a = TEXT("計算結果は");
b = 2;
wsprintf(c, TEXT("%s%d"), a,b);
MessageBox(NULL, c, TEXT("タイトルバー"), MB_OK);
782デフォルトの名無しさん
2021/08/27(金) 20:04:56.02ID:v1ag2e+a 今でもTEXT()って要るの?
783デフォルトの名無しさん
2021/08/27(金) 20:22:50.96ID:S83DaDnk なんでせっかくTCHAR使っててwsprintfやねん
784デフォルトの名無しさん
2021/08/27(金) 20:24:35.54ID:EK7jPK8d MBCSかUNICODE決め打ちならいらない
LPCTSTR,TCHARも同じ
LPCTSTR,TCHARも同じ
785デフォルトの名無しさん
2021/08/27(金) 20:35:07.25ID:Zo8CY4eq786デフォルトの名無しさん
2021/08/27(金) 20:36:31.85ID:oI5nTqpL >>783
wsprintfはTCHARでは
wsprintfはTCHARでは
787デフォルトの名無しさん
2021/08/27(金) 20:36:59.87ID:olVwmysy788デフォルトの名無しさん
2021/08/27(金) 20:42:31.64ID:Zo8CY4eq ?
789蟻人間 ◆T6xkBnTXz7B0
2021/08/27(金) 20:45:13.11ID:PcAf749w sprintf/swprintfはC標準。
wsprintfはWin32。
これはテストに出ないぞ!
wsprintfはWin32。
これはテストに出ないぞ!
790デフォルトの名無しさん
2021/08/27(金) 20:48:57.74ID:olVwmysy791デフォルトの名無しさん
2021/08/27(金) 22:20:01.88ID:5zZ7szBm >>786
TCHARはワイドとマルチバイトの両方なんだからwprintf決め打ちじゃなくて_tprintf
TCHARはワイドとマルチバイトの両方なんだからwprintf決め打ちじゃなくて_tprintf
792デフォルトの名無しさん
2021/08/27(金) 22:35:10.18ID:oI5nTqpL >>791
wsprintfはTCHARでは
wsprintfはTCHARでは
793デフォルトの名無しさん
2021/08/27(金) 22:53:41.84ID:ykQTaA3x >>782
これからWin32APIを理解し始めようと考えている人には、そうゆう疑問を持てるレベルにまで頑張って到達してほしいな、という思いでマクロ表記にしてみたよ。
実用上、必要か不要か・・・で言えば場合によるんだろうけど。
現時点でWin32API が内部で ANSI と UNICODE を明確に区別しているので、作法として気にする必要はあると思われます
これからWin32APIを理解し始めようと考えている人には、そうゆう疑問を持てるレベルにまで頑張って到達してほしいな、という思いでマクロ表記にしてみたよ。
実用上、必要か不要か・・・で言えば場合によるんだろうけど。
現時点でWin32API が内部で ANSI と UNICODE を明確に区別しているので、作法として気にする必要はあると思われます
794デフォルトの名無しさん
2021/08/27(金) 23:06:30.48ID:5zZ7szBm795蟻人間 ◆T6xkBnTXz7B0
2021/08/27(金) 23:07:19.75ID:PcAf749w _T系の関数マクロは<tchar.h>で定義されていて、主にC実行時関数を振り分ける。これらはAnsi/Wideを振り分けるTEXT系とは別に分離された機構になっている。
796蟻人間 ◆T6xkBnTXz7B0
2021/08/27(金) 23:09:32.07ID:PcAf749w797蟻人間 ◆T6xkBnTXz7B0
2021/08/27(金) 23:18:41.05ID:PcAf749w UNICODEマクロでA/Wの振り分け。
頭に下線のついた_UNICODEマクロで_T系の振り分けができる。
これらはVisual Studioで適切にソリューション/プロジェクトの設定を行えば自動で定義される。
GCCやclangでは-municode をコンパイルオプションに追加する。
ただし、ユニコードプロジェクトではWinMainはwWinMainに切り替わるので注意しよう。
頭に下線のついた_UNICODEマクロで_T系の振り分けができる。
これらはVisual Studioで適切にソリューション/プロジェクトの設定を行えば自動で定義される。
GCCやclangでは-municode をコンパイルオプションに追加する。
ただし、ユニコードプロジェクトではWinMainはwWinMainに切り替わるので注意しよう。
798蟻人間 ◆T6xkBnTXz7B0
2021/08/27(金) 23:22:46.33ID:PcAf749w ユニコードプロジェクトにせず、代わりにUNCODEマクロと_UNCODEマクロを定義済みにするというやり方もある。こちらはCMakeでよく使う。
799蟻人間 ◆T6xkBnTXz7B0
2021/08/27(金) 23:25:34.94ID:PcAf749w ユニコードプロジェクトではないときにUnicode のコマンドラインを取得したい場合は、GetCommandLineWと
CommandLineToArgvWと
LocalFree を使う。
CommandLineToArgvWと
LocalFree を使う。
800蟻人間 ◆T6xkBnTXz7B0
2021/08/27(金) 23:32:23.92ID:PcAf749w ミッキマウスミッキマウスミッキミッキマウス
天安門事件
旭日旗☀
天安門事件
旭日旗☀
801デフォルトの名無しさん
2021/08/28(土) 06:56:04.31ID:zdnaC7QB ,>>798
まぁ今となってはWindowsのUTF16LEはUNCO(ウンコ)なコードだったな
2バイト固定で1文字ってのは、簡易な多言語対応とstrlen系の文字数計算に楽だったんだろうけどそれだけだろ
まぁ今となってはWindowsのUTF16LEはUNCO(ウンコ)なコードだったな
2バイト固定で1文字ってのは、簡易な多言語対応とstrlen系の文字数計算に楽だったんだろうけどそれだけだろ
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【速報】中国、水産物輸入停止と通達 日本政府に [おっさん友の会★]
- 中国側が首相答弁の撤回要求、日本側拒否★6 [夜のけいちゃん★]
- 「厚かましい挑発的発言だ」中国国連大使が高市首相発言に強く反発 日本の常任理事国入りに明確に反対 [ぐれ★]
- 自民、経済対策で子ども1人に2万円給付へ 児童手当に上乗せ 所要額は約4000億円 [ぐれ★]
- 債券・円・株「トリプル安」に…長期金利1.755%まで上昇、円は対ユーロで史上最安値 ★3 [蚤の市★]
- 【漫画】『週刊少年サンデー』連載中の漫画家、前編集者に怒り! 入稿遅れ、無断のセリフ変更など暴露 「心の糸が切れて」 [冬月記者★]
- 【悲報】安倍晋三と高市早苗、どちらがより日本を破壊したのか🤔 [616817505]
- 【速報】中国、水産物輸入停止 [527893826]
- 高市総理はもっと暴れて自民党を分裂、もしくは解体して欲しい [633746646]
- 【緊急】高市早苗 月内辞任か [695089791]
- 高い国産米はいらない😤主食用輸入米(無関税)が最速で完売※1kg556円 [993451824]
- 【悲報】高市早苗さん、たった一人で日本を崩壊へ導く [714769305]
