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:ZJ42fMZB726デフォルトの名無しさん
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系の文字数計算に楽だったんだろうけどそれだけだろ
802デフォルトの名無しさん
2021/08/28(土) 08:30:55.56ID:UNt1DdTH サロゲートペアに対応したので、その文字数計算も単純にできなくなってしまった。
文字数計算がややこしいのはUTF-8もそうなので、UTF16〜が全然ダメということではないが。
開発面では、将来的に UTF-16(IVS)が必要になってくると、UTF8でいいじゃん、ということになって。
Visual stduio のデフォルトが再度ANSI(UTF-8)に戻る可能性はある。
長い目でWin32APIを見るなら、ANSIアプリの構築方法も忘れないでおく必要はありそうだ
文字数計算がややこしいのはUTF-8もそうなので、UTF16〜が全然ダメということではないが。
開発面では、将来的に UTF-16(IVS)が必要になってくると、UTF8でいいじゃん、ということになって。
Visual stduio のデフォルトが再度ANSI(UTF-8)に戻る可能性はある。
長い目でWin32APIを見るなら、ANSIアプリの構築方法も忘れないでおく必要はありそうだ
803デフォルトの名無しさん
2021/08/28(土) 09:06:21.83ID:YWpKrN9v アラビア語かなんか知らんが、サロゲートペアの問題ではなく、さらに
UTF32 では 2 文字(32BIT x 2) なのに、画面上では文字の上や下に斜線
が入るような文字がある。日本語の濁点のようなもの。サに点々を打ってザ
と書くようなのを、サ + ” みたいな二文字で表現するらしい。
そんなものまで日本人が対応しなくて良いと個人的には思ってる。
UTF32 では 2 文字(32BIT x 2) なのに、画面上では文字の上や下に斜線
が入るような文字がある。日本語の濁点のようなもの。サに点々を打ってザ
と書くようなのを、サ + ” みたいな二文字で表現するらしい。
そんなものまで日本人が対応しなくて良いと個人的には思ってる。
804デフォルトの名無しさん
2021/08/28(土) 09:09:13.47ID:YWpKrN9v UTF8 --> UTF16(サロゲートペア) --> UTF32 1 文字
の問題だけでなく、特殊な言語では、
UTF8 --> UTF32 2文字 --> 画面上では 1 文字
の問題が有るということ。
日本人が対応できるのは、UTF32 1文字が画面上で1文字に見えるまでが限界。
の問題だけでなく、特殊な言語では、
UTF8 --> UTF32 2文字 --> 画面上では 1 文字
の問題が有るということ。
日本人が対応できるのは、UTF32 1文字が画面上で1文字に見えるまでが限界。
805デフォルトの名無しさん
2021/08/28(土) 09:33:08.48ID:nCwHwokI KPS 9566-2000にはフル対応しる
806デフォルトの名無しさん
2021/08/28(土) 09:53:59.20ID:3VTMYlES807デフォルトの名無しさん
2021/08/28(土) 10:02:21.59ID:gw2R54kI >>779
C#だっておバンバン
C#だっておバンバン
808デフォルトの名無しさん
2021/08/28(土) 10:50:07.25ID:Wn50/Mou >>794
勘違いしましたごめんなさいは?w
勘違いしましたごめんなさいは?w
809デフォルトの名無しさん
2021/08/28(土) 12:21:19.46ID:jkQHTYKd810デフォルトの名無しさん
2021/08/28(土) 13:14:56.03ID:I3iUh714811デフォルトの名無しさん
2021/08/28(土) 13:29:17.35ID:78cNf6mY 中東とアメリカは中が悪いから、わざと変な文字コードにしたのかも知れんな。
経済的な敵である日本を倒すため、オートリピートなんてそもそも不要なIMEのON/OFF
キーに普通のアルファベットキーよりも開始時間の短いオートリピート機能を付けた
上に、現在のON/OFF状態を画面の右下の分かりにくい場所に小さく表示したりとか
と同じで。
経済的な敵である日本を倒すため、オートリピートなんてそもそも不要なIMEのON/OFF
キーに普通のアルファベットキーよりも開始時間の短いオートリピート機能を付けた
上に、現在のON/OFF状態を画面の右下の分かりにくい場所に小さく表示したりとか
と同じで。
813デフォルトの名無しさん
2021/08/28(土) 15:17:42.31ID:Wn50/Mou そして悪徳へ
814デフォルトの名無しさん
2021/08/28(土) 17:32:49.86ID:nCwHwokI >>794
スレタイ3回音読してからごめんなさいは?
スレタイ3回音読してからごめんなさいは?
815ハノン ◆QZaw55cn4c
2021/08/28(土) 18:09:30.98 ワンワンワンごめんなさい
816デフォルトの名無しさん
2021/08/29(日) 01:17:36.66ID:MsJ8kGio どうでもいいけどオリパラのRPCはリモートプロシージャコールじゃなくてなんちゃってロシア
まめな
まめな
817デフォルトの名無しさん
2021/09/06(月) 20:30:01.34ID:d5h9Y6Qi フフフフフ…で埋められたWin32アプリデバッグメモリを思い出した人、どのくらいいるかな
「フフフ…」4歳娘が撮影した花火に家族で爆笑! 見ると笑顔になる“奇跡の1枚”の状況を父親に聞いた | FNNプライムオンライン
https://www.fnn.jp/articles/-/224754
「フフフ…」4歳娘が撮影した花火に家族で爆笑! 見ると笑顔になる“奇跡の1枚”の状況を父親に聞いた | FNNプライムオンライン
https://www.fnn.jp/articles/-/224754
818デフォルトの名無しさん
2021/09/06(月) 20:54:15.47ID:q0BBk2oV 0xABADBABE がwindows7のUSB
0xBAADF00D がlocal alloc
深淵に到達するとフフフじゃないのよ
0xBAADF00D がlocal alloc
深淵に到達するとフフフじゃないのよ
819デフォルトの名無しさん
2021/09/09(木) 19:55:16.63ID:VcdPV4nP カカカ
820デフォルトの名無しさん
2021/09/10(金) 06:52:10.21ID:zxx6HeQ0 六歌仙のひとり
821デフォルトの名無しさん
2021/09/10(金) 11:54:52.84ID:kc5oWHp5 Debugモードで実行すると配列の中身が「フフフノフフフ」になってワロタ
822デフォルトの名無しさん
2021/09/10(金) 11:56:22.34ID:2Fxd4w67 16進数で表示して英語で読んでみ
823デフォルトの名無しさん
2021/09/11(土) 21:33:34.97ID:x2ZLDQix INT3
824デフォルトの名無しさん
2021/09/11(土) 23:15:17.42ID:EO9owr6G dabadabada
825デフォルトの名無しさん
2021/09/15(水) 09:50:59.74ID:5Dhe4KoF HANDLE SetClipboardData(UINT uFormat, HANDLE hMem);
に渡すhMemは必ずGlobalAllocで確保したものでなくてはいけないのでしょうか?
mallocやnewやスタック領域のポインタを渡すとどうなるんでしょうか・・・?
に渡すhMemは必ずGlobalAllocで確保したものでなくてはいけないのでしょうか?
mallocやnewやスタック領域のポインタを渡すとどうなるんでしょうか・・・?
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【中国外務省】日中関係悪化は高市氏に責任と名指しで非難… ★2 [BFU★]
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか…★2 [BFU★]
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 [ぐれ★]
- 小野田紀美・経済安保担当相「何か気に入らないことがあればすぐに経済的威圧をする国への依存はリスク」 [Hitzeschleier★]
- 政府、株式の配当など金融所得を高齢者の医療保険料や窓口負担に反映する方針を固めた [バイト歴50年★]
- 【維新】吉村知事「中国人観光客だけに頼るビジネスモデル変えていかないといけない」「高市総理の発言は撤回する必要はない」 [Hitzeschleier★]
- 中国高官と話す外務省局長の表情、やばい ★2 [175344491]
- 中国外務省「日中関係の悪化は高市早苗首相が原因」と名指しで強く非難。キタ━(゚∀゚)━! [153490809]
- 【悲報】日本人「日本が中国と戦争になったら世界中の国が応援してくれるぞ!」 [616817505]
- 小野田経済安保相「すぐに経済的威圧するところへの依存はリスク」😲 [861717324]
- 日本政府「高市総理の発言は問題ないと伝え、中国総領事のSNS投稿は問題があると中国に伝えました😊」 [931948549]
- 【ほんこん悲報】吉本新喜劇の中国公演が中止に! [523957489]
