Windows Runtime Cpp 文字列操作のソースを表示
新しいページはコチラ
移動:
案内
,
検索
[[Windows Runtime Cpp]]へ戻る == '''概要''' == 文字列操作関数として'''HSTRING'''型というのが提供されていて、WindowsRuntime関数では、この文字列型を利用するので、この文字列型を一通り覚える必要があるようです。 == '''生成 WindowsCreateString(関数)''' == wchar_t型なんかの、c++言語の文字列操作で使われたような文字列型が生成関数の引数として使われます。例えば以下のようなプログラムで、生成することができます。文字列操作に関する説明は[[C 文字列操作]]とか、そのあたりで連携している項目を参考にして下さい。基礎知識がない人にとっては膨大な基礎の知識が必要になります。L""って何?とか、selocaleって何?という疑問については、ここでは記述しません。37,39行目についてのHSTRING文字列操作関数でまだ説明していない関数なので、後述します。 <syntaxhighlight lang="cpp" line start="1"> #include <locale.h> #include <wchar.h> #include <stdio.h> #include <crtdbg.h> #include <roapi.h> #include <winstring.h> int main() { HRESULT hr; setlocale(LC_ALL, ""); hr = RoInitialize(RO_INIT_TYPE::RO_INIT_MULTITHREADED); if (FAILED(hr)) { wprintf_s(L"初期化に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"初期化に成功しました。\n"); } HSTRING hStr; wchar_t cStr[] = L"ワイド文字列"; size_t length = wcslen(cStr); hr = WindowsCreateString(cStr, length, &hStr); if (FAILED(hr)) { wprintf_s(L"HSTRING文字列の生成に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"HSTRING文字列の生成に成功しました。\n"); } wprintf_s(L"\n★%s\n\n", WindowsGetStringRawBuffer(hStr, nullptr)); hr = WindowsDeleteString(hStr); if (FAILED(hr)) { wprintf_s(L"hStr文字列の削除に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"hStr文字列の削除に成功しました。\n"); } RoUninitialize(); _wsystem(L"pause"); return 0; } </syntaxhighlight> 実行結果の出力結果 初期化に成功しました。 HSTRING文字列の生成に成功しました。 ★ワイド文字列 hStr文字列の削除に成功しました。 という長いサンプルになってしまいましたが、こういう感じですね。使われているのは、27行目です。 *'''WindowsCreateString(文字列配列先頭アドレス, 文字列調, HSTRING型変数のアドレス);''' 引数: :'''第1引数''':文字列配列先頭アドレス サンプルプログラムでは wchar_t の配列cStrという変数で初期化文字列を与えて生成したものの先頭アドレスを引数にしています。cStr[]配列の先頭アドレスはcStrになります。管理人の場合はpcStrという変数名を使うのが流儀です。配列での初期化をするとポインタ変数としてcStrを宣言した意識が薄れる感じはありますが、そこまで神経質なプログラマはあまりみかけませんね。自分で覚えとけってことっすかね。 :'''第2引数''':文字列の長さをwcslen(cStr)で取得したものをsize_t型の変数lengthに取得していますので、サンプルではlengthを引数にしています。 :'''第3引数''':HSTRING型変数のアドレスを引数にします。 サンプルでは実体化されて宣言されたHSTRING型のhStrのアドレスを受け取るため&hStrとしています。 戻り値:HRESULT型の列挙子です。S_OKが返ってくることになっています。数字が返ってくるだけの構造なので、適当な整数型の変数でも受け取れると思います。 == '''削除 WindowsDeleteString(関数)''' == [[Windows Runtime Cpp 文字列操作#生成 WindowsCreateString(関数)|生成]]のところのサンプルで示しましたが、HSTRING文字列をWindowsCreateStringで生成された文字列変数は削除を宣言するまでメモリが消費されたままになりますので、使い終わったら、削除する関数を使って解放するのが普通です。 *'''WindowsCreateString(HSTRING型変数);''' 引数: :'''第1引数''':削除・メモリ解放したいHSTRING文字列変数を付与する。サンプルでは39行目で使われていて、引数はhStrとなっています。 == '''文字列値格納配列先頭アドレス取得 WindowsGetStringRawBuffer(関数)''' == [[Windows Runtime Cpp 文字列操作#生成 WindowsCreateString(関数)|生成]]のところのサンプルで示しましたが、C++の文字列操作関数なんかで必要な文字列型の先頭アドレスを必要とする関数のために、HSTRING型文字列で格納された文字列を格納している文字列配列の先頭アドレスを取得する関数です。 *'''WindowsGetStringRawBuffer(HSTRING型変数,取得文字数);''' 引数: :'''第1引数''':削除・文字列値を取得したいHSTRING文字列変数を付与する。サンプルでは37行目で使われていて、引数はhStrとなっています。 :'''(第2引数)オプション''':取得した文字列配列格納の先頭アドレスから何文字取得するかを指定する。指定しない場合はnullptrと指定するとよいです。 == '''文字列のネイティブ変数参照連動 WindowsCreateReference(関数)''' == 文字列を複製する関数です。コピーとは少し違う動作をします。まずは使い方に関する説明とサンプルと動作結果を示します。 *'''WindowsCreateReference(PCWSTR型配列変数先頭アドレス,文字列長さ,実体のあるSTRING_HEADER型アドレス変数,実体のあるHSTRING型アドレス変数);''' 引数: :'''第1引数''':文字列値を参照したいPCWSTR変数(ワイド文字列の配列変数の先頭アドレス)を付与する。サンプルでは38行目で使われていて、引数はcStrとなっています。 :'''第2引数''':第1引数で指定したPCWSTR変数の参照したい文字数を指定する。サンプルでは38行目で使われていて、引数はlengthとなっています。 :'''第3引数''':第1引数で指定した文字列値からあたらしく参照したいHSTRING変数のためのSTRING_HEADER型ポインタ変数です。サンプルでは38行目で使われていて、引数は&headerとなっています。 :'''第4引数''':文字列値を参照したいPCWSTR変数(ワイド文字列の配列変数の先頭アドレス)を付与する。サンプルでは38行目で使われていて、引数はcStrとなっています。 <syntaxhighlight lang="cpp" line start="1"> #include <locale.h> #include <wchar.h> #include <stdio.h> #include <crtdbg.h> #include <roapi.h> #include <winstring.h> int main() { HRESULT hr; setlocale(LC_ALL, ""); hr = RoInitialize(RO_INIT_TYPE::RO_INIT_MULTITHREADED); if (FAILED(hr)) { wprintf_s(L"初期化に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"初期化に成功しました。\n"); } HSTRING hStr, hRefStr; HSTRING_HEADER header; wchar_t cStr[] = L"ワイド文字列 "; size_t length = wcslen(cStr); hr = WindowsCreateString(cStr, length, &hStr); if (FAILED(hr)) { wprintf_s(L"hString文字列の生成に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"hString文字列の生成に成功しました。\n"); } hr = WindowsCreateStringReference(cStr, length, &header, &hRefStr); if (FAILED(hr)) { wprintf_s(L"hString文字列参照の生成に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"hString文字列参照の生成に成功しました。\n"); } PCWSTR hStrBuffer = WindowsGetStringRawBuffer(hStr, nullptr); wprintf_s(L"%s\n", hStrBuffer); wprintf_s(L"Address=%p\n\n", hStrBuffer); PCWSTR hRefStrBuffer = WindowsGetStringRawBuffer(hRefStr, nullptr); wprintf_s(L"%s\n", hRefStrBuffer); wprintf_s(L"Address=%p\n\n", hRefStrBuffer); wprintf_s(L"%s\n", cStr); wprintf_s(L"Address=%p\n\n", cStr); swprintf_s(cStr, L"ワイド文字列の再設定をswprintf_s関数で実施。"); wprintf_s(L"%s\n", hRefStrBuffer); wprintf_s(L"Address=%p\n\n", hRefStrBuffer); hr = WindowsDeleteString(hStr); if (FAILED(hr)) { wprintf_s(L"hStr文字列の削除に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"hStr文字列の削除に成功しました。\n"); } hr = WindowsDeleteString(hRefStr); if (FAILED(hr)) { wprintf_s(L"hRefStr文字列の削除に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"hRefStr文字列の削除に成功しました。\n"); } RoUninitialize(); _wsystem(L"pause"); return 0; } </syntaxhighlight> 実行結果の出力結果 初期化に成功しました。 hString文字列の生成に成功しました。 hString文字列参照の生成に成功しました。 ワイド文字列 Address=00105018 ワイド文字列 Address=007FF9C4 ワイド文字列 Address=007FF9C4 ワイド文字列の再設定をswprintf_s関数で実施。 Address=007FF9C4 hStr文字列の削除に成功しました。 hRefStr文字列の削除に成功しました。 続行するには何かキーを押してください . . . == '''文字列結合 WindowsConcatString(関数)''' == 2つのHSTRING型文字列を結合し、3つ目のHSTRING変数に新しく結合後の変数を設定する関数です。まずは使い方に関する説明とサンプルと動作結果を示します。 *'''WindowsConcatString(HSTRING変数_結合の前半部分,HSTRING変数_結合の後半部分,実体のあるHSTRING型アドレス変数_結合させた文字列);''' 引数: :'''第1引数''':結合したい文字列の前半部分を保持したHSTRING変数。サンプルでは49行目で使われていて、引数はhStr1となっています。 :'''第2引数''':結合したい文字列の後半部分を保持したHSTRING変数。サンプルでは49行目で使われていて、引数はhStr2となっています。 :'''第3引数''':結合した文字列を格納させるHSTRINGのアドレス変数。サンプルでは49行目で使われていて、引数はhStr3となっています。 <syntaxhighlight lang="cpp" line start="1"> #include <locale.h> #include <wchar.h> #include <stdio.h> #include <crtdbg.h> #include <roapi.h> #include <winstring.h> int main() { HRESULT hr; setlocale(LC_ALL, ""); hr = RoInitialize(RO_INIT_TYPE::RO_INIT_MULTITHREADED); if (FAILED(hr)) { wprintf_s(L"初期化に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"初期化に成功しました。\n"); } HSTRING hStr1, hStr2, hStr3, hRefStr; HSTRING_HEADER header; wchar_t cStr1[] = L"ワイド文字列:前半 "; wchar_t cStr2[] = L"ワイド文字列:後半 "; size_t length = wcslen(cStr1); hr = WindowsCreateString(cStr1, length, &hStr1); if (FAILED(hr)) { wprintf_s(L"hString文字列の生成に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"hString文字列の生成に成功しました。\n"); } hr = WindowsCreateString(cStr2, length, &hStr2); if (FAILED(hr)) { wprintf_s(L"hString文字列の生成に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"hString文字列の生成に成功しました。\n"); } hr = WindowsConcatString(hStr1, hStr2, &hStr3); if (FAILED(hr)) { wprintf_s(L"hString文字列結合の生成に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"hString文字列結合の生成に成功しました。\n"); } wprintf_s(L"%s\n", WindowsGetStringRawBuffer(hStr3, nullptr)); wprintf_s(L"Address=%p\n\n", hStr3); hr = WindowsCreateStringReference(cStr1, length, &header, &hRefStr); if (FAILED(hr)) { wprintf_s(L"hString文字列参照の生成に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"hString文字列参照の生成に成功しました。\n"); } PCWSTR hStrBuffer = WindowsGetStringRawBuffer(hStr1, nullptr); wprintf_s(L"%s\n", hStrBuffer); wprintf_s(L"Address=%p\n\n", hStrBuffer); PCWSTR hRefStrBuffer = WindowsGetStringRawBuffer(hRefStr, nullptr); wprintf_s(L"%s\n", hRefStrBuffer); wprintf_s(L"Address=%p\n\n", hRefStrBuffer); wprintf_s(L"%s\n", cStr1); wprintf_s(L"Address=%p\n\n", cStr1); swprintf_s(cStr1, L"ワイド文字列の再設定をswprintf_s関数で実施。"); wprintf_s(L"%s\n", hRefStrBuffer); wprintf_s(L"Address=%p\n\n", hRefStrBuffer); hr = WindowsDeleteString(hStr3); if (FAILED(hr)) { wprintf_s(L"hStr3文字列の削除に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"hStr3文字列の削除に成功しました。\n"); } hr = WindowsDeleteString(hStr2); if (FAILED(hr)) { wprintf_s(L"hStr2文字列の削除に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"hStr2文字列の削除に成功しました。\n"); } hr = WindowsDeleteString(hStr1); if (FAILED(hr)) { wprintf_s(L"hStr1文字列の削除に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"hStr1文字列の削除に成功しました。\n"); } hr = WindowsDeleteString(hRefStr); if (FAILED(hr)) { wprintf_s(L"hRefStr文字列の削除に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"hRefStr文字列の削除に成功しました。\n"); } RoUninitialize(); _wsystem(L"pause"); return 0; } </syntaxhighlight> 実行結果の出力結果 初期化に成功しました。 hString文字列の生成に成功しました。 hString文字列の生成に成功しました。 hString文字列結合の生成に成功しました。 ワイド文字列:前半 ワイド文字列:後半 Address=00DE9788 hString文字列参照の生成に成功しました。 ワイド文字列:前半 Address=00DE4810 ワイド文字列:前半 Address=00AFFCA4 ワイド文字列:前半 Address=00AFFCA4 ワイド文字列の再設定をswprintf_s関数で実施。 Address=00AFFCA4 hStr3文字列の削除に成功しました。 hStr2文字列の削除に成功しました。 hStr1文字列の削除に成功しました。 hRefStr文字列の削除に成功しました。 続行するには何かキーを押してください . . . == '''文字列の抽出_指定始点~終端 WindowsSubstring(関数)''' == HSTRING型文字列の特定の位置から終端までを抽出するための関数です。右側抽出ですね。まずは使い方に関する説明とサンプルと動作結果を示します。 *'''WindowsSubstring(HSTRING変数,抽出開始位置_始点位置0~カウント,実体のあるHSTRING型アドレス変数);''' 引数: :'''第1引数''':抽出対象のHSTRING変数。サンプルでは37行目で使われていて、引数はhStr1となっています。 :'''第2引数''':抽出対象の文字列の先頭文字位置を0として、抽出開始の位置を数値で指定する。サンプルでは37行目で使われていて、引数は10となっています。 :'''第3引数''':抽出した文字列を格納させるHSTRINGのアドレス変数。サンプルでは37行目で使われていて、引数は&hStr2となっています。 <syntaxhighlight lang="cpp" line start="1"> #include <locale.h> #include <wchar.h> #include <stdio.h> #include <crtdbg.h> #include <roapi.h> #include <winstring.h> int main() { HRESULT hr; setlocale(LC_ALL, ""); hr = RoInitialize(RO_INIT_TYPE::RO_INIT_MULTITHREADED); if (FAILED(hr)) { wprintf_s(L"初期化に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"初期化に成功しました。\n"); } HSTRING hStr1, hStr2; wchar_t cStr1[] = L"ワイド文字列変数890サンプル567"; size_t length = wcslen(cStr1); hr = WindowsCreateString(cStr1, length, &hStr1); if (FAILED(hr)) { wprintf_s(L"hString文字列の生成に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"hString文字列の生成に成功しました。\n"); } hr = WindowsSubstring(hStr1, 10, &hStr2); if (FAILED(hr)) { wprintf_s(L"部分文字列の生成に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"部分文字列の生成に成功しました。\n"); } wprintf_s(L"部分文字列=%s\n", WindowsGetStringRawBuffer(hStr2, nullptr)); hr = WindowsDeleteString(hStr2); if (FAILED(hr)) { wprintf_s(L"hStr2文字列の削除に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"hStr2文字列の削除に成功しました。\n"); } hr = WindowsDeleteString(hStr1); if (FAILED(hr)) { wprintf_s(L"hStr1文字列の削除に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"hStr1文字列の削除に成功しました。\n"); } RoUninitialize(); _wsystem(L"pause"); return 0; } </syntaxhighlight> 実行結果の出力結果 初期化に成功しました。 hString文字列の生成に成功しました。 部分文字列の生成に成功しました。 部分文字列=0サンプル567 hStr2文字列の削除に成功しました。 hStr1文字列の削除に成功しました。 続行するには何かキーを押してください . . . == '''文字列の抽出_指定始点~指定文字数 WindowsSubstringWithSpecifiedLength(関数)''' == HSTRING型文字列の特定の位置から指定の文字数を抽出するための関数です。中間抽出の始点+距離型ですね。まずは使い方に関する説明とサンプルと動作結果を示します。 *'''WindowsSubstringWithSpecifiedLength(HSTRING変数,抽出開始位置_始点位置0~カウント,抽出終了位置_始点位置からの文字数,実体のあるHSTRING型アドレス変数);''' 引数: :'''第1引数''':抽出対象のHSTRING変数。サンプルでは37行目で使われていて、引数はhStr1となっています。 :'''第2引数''':抽出対象の文字列の先頭文字位置を0として、抽出開始の位置を数値で指定する。サンプルでは37行目で使われていて、引数は10となっています。 :'''第3引数''':抽出対象の文字列の終端位置を開始位置からの文字数で指定する。サンプルでは37行目で使われていて、引数は5となっています。 :'''第4引数''':抽出した文字列を格納させるHSTRINGのアドレス変数。サンプルでは37行目で使われていて、引数は&hStr2となっています。 <syntaxhighlight lang="cpp" line start="1"> #include <locale.h> #include <wchar.h> #include <stdio.h> #include <crtdbg.h> #include <roapi.h> #include <winstring.h> int main() { HRESULT hr; setlocale(LC_ALL, ""); hr = RoInitialize(RO_INIT_TYPE::RO_INIT_MULTITHREADED); if (FAILED(hr)) { wprintf_s(L"初期化に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"初期化に成功しました。\n"); } HSTRING hStr1, hStr2; wchar_t cStr1[] = L"ワイド文字列変数890サンプル567"; size_t length = wcslen(cStr1); hr = WindowsCreateString(cStr1, length, &hStr1); if (FAILED(hr)) { wprintf_s(L"hString文字列の生成に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"hString文字列の生成に成功しました。\n"); } hr = WindowsSubstringWithSpecifiedLength(hStr1, 10, 5, &hStr2); if (FAILED(hr)) { wprintf_s(L"部分文字列の生成に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"部分文字列の生成に成功しました。\n"); } wprintf_s(L"部分文字列=%s\n", WindowsGetStringRawBuffer(hStr2, nullptr)); hr = WindowsDeleteString(hStr2); if (FAILED(hr)) { wprintf_s(L"hStr2文字列の削除に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"hStr2文字列の削除に成功しました。\n"); } hr = WindowsDeleteString(hStr1); if (FAILED(hr)) { wprintf_s(L"hStr1文字列の削除に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"hStr1文字列の削除に成功しました。\n"); } RoUninitialize(); _wsystem(L"pause"); return 0; } </syntaxhighlight> 実行結果の出力結果 初期化に成功しました。 hString文字列の生成に成功しました。 部分文字列の生成に成功しました。 部分文字列=0サンプル hStr2文字列の削除に成功しました。 hStr1文字列の削除に成功しました。 続行するには何かキーを押してください . . . == '''文字列の置換_置換検索文字と置換後文字変数個別指定 WindowsReplaceString(関数)''' == 置換対象のHSTRING型文字列に対して、置換対象の検索文字を指定し、指定された置換後文字に置き換えるための関数です。まずは使い方に関する説明とサンプルと動作結果を示します。 *'''WindowsReplaceString(HSTRING変数,HSTRING変数_検索文字列,HSTRING変数_置換文字列,実体のあるHSTRING型アドレス変数);''' 引数: :'''第1引数''':置換対象のHSTRING変数。サンプルでは62行目で使われていて、引数はhStr1となっています。 :'''第2引数''':HSTRING変数で指定する検索文字列。サンプルでは62行目で使われていて、引数はhStr2となっています。 :'''第3引数''':HSTRING変数で指定する置換文字列。サンプルでは62行目で使われていて、引数はhStr3となっています。 :'''第4引数''':置換後の文字列を格納させるHSTRINGのアドレス変数。サンプルでは62行目で使われていて、引数は&hStr4となっています。 <syntaxhighlight lang="cpp" line start="1"> #include <locale.h> #include <wchar.h> #include <stdio.h> #include <crtdbg.h> #include <roapi.h> #include <winstring.h> int main() { HRESULT hr; setlocale(LC_ALL, ""); hr = RoInitialize(RO_INIT_TYPE::RO_INIT_MULTITHREADED); if (FAILED(hr)) { wprintf_s(L"初期化に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"初期化に成功しました。\n"); } HSTRING hStr1, hStr2, hStr3, hStr4; const wchar_t *cStr1 = L"1234567890"; const wchar_t *cStr2 = L"34"; const wchar_t *cStr3 = L"43"; size_t length = wcslen(cStr1); length = wcslen(cStr1); hr = WindowsCreateString(cStr1, length, &hStr1); if (FAILED(hr)) { wprintf_s(L"hStr1文字列の生成に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"hStr1文字列の生成に成功しました。\n"); } length = wcslen(cStr2); hr = WindowsCreateString(cStr2, length, &hStr2); if (FAILED(hr)) { wprintf_s(L"hStr2文字列の生成に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"hStr2文字列の生成に成功しました。\n"); } length = wcslen(cStr3); hr = WindowsCreateString(cStr3, length, &hStr3); if (FAILED(hr)) { wprintf_s(L"hStr3文字列の生成に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"hStr3文字列の生成に成功しました。\n"); } hr = WindowsReplaceString(hStr1, hStr2, hStr3, &hStr4); if (FAILED(hr)) { wprintf_s(L"部分文字列の生成に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"置換文字列の生成に成功しました。\n"); } wprintf_s(L"元文字列 =%s 検索文字列=%s 置換文字列=%s\n", WindowsGetStringRawBuffer(hStr1, nullptr), WindowsGetStringRawBuffer(hStr2, nullptr), WindowsGetStringRawBuffer(hStr3, nullptr)); wprintf_s(L"置換後文字列=%s\n", WindowsGetStringRawBuffer(hStr4, nullptr)); wprintf_s(L"hStr1_Address=%p, hStr2_Address=%p, hStr3_Address=%p, hStr4_Address=%p\n", hStr1, hStr2, hStr3, hStr4); hr = WindowsDeleteString(hStr4); if (FAILED(hr)) { wprintf_s(L"hStr4文字列の削除に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"hStr4文字列の削除に成功しました。\n"); } hr = WindowsDeleteString(hStr3); if (FAILED(hr)) { wprintf_s(L"hStr3文字列の削除に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"hStr3文字列の削除に成功しました。\n"); } hr = WindowsDeleteString(hStr2); if (FAILED(hr)) { wprintf_s(L"hStr2文字列の削除に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"hStr2文字列の削除に成功しました。\n"); } hr = WindowsDeleteString(hStr1); if (FAILED(hr)) { wprintf_s(L"hStr1文字列の削除に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"hStr1文字列の削除に成功しました。\n"); } RoUninitialize(); _wsystem(L"pause"); return 0; } </syntaxhighlight> 実行結果の出力結果 初期化に成功しました。 hStr1文字列の生成に成功しました。 hStr2文字列の生成に成功しました。 hStr3文字列の生成に成功しました。 置換文字列の生成に成功しました。 元文字列 =1234567890 検索文字列=34 置換文字列=43 置換後文字列=1243567890 hStr1_Address=010E5A90, hStr2_Address=010D5AB0, hStr3_Address=010D54D0, hStr4_Address=010E6190 hStr4文字列の削除に成功しました。 hStr3文字列の削除に成功しました。 hStr2文字列の削除に成功しました。 hStr1文字列の削除に成功しました。 続行するには何かキーを押してください . . . == '''文字列の複製 WindowsDuplicateString(関数)''' == 文字列を複製する関数です。コピーとは少し違う動作をします。まずは使い方に関する説明とサンプルと動作結果を示します。 *'''WindowsDuplicateString(HSTRING型変数,HSTRING型ポインタ変数);''' 引数: :'''第1引数''':文字列値を複製したいHSTRING文字列変数を付与する。サンプルではxx行目で使われていて、引数はhStrとなっています。 :'''第2引数''':第1引数で指定した文字列変数を複製して、新たに文字列値を保持したいHSTRINGポインタ変数を付与する。サンプルではxx行目で使われていて、引数はphStrとなっています。 <syntaxhighlight lang="cpp" line start="1"> #include <locale.h> #include <wchar.h> #include <stdio.h> #include <crtdbg.h> #include <roapi.h> #include <winstring.h> int main() { HRESULT hr; setlocale(LC_ALL, ""); hr = RoInitialize(RO_INIT_TYPE::RO_INIT_MULTITHREADED); if (FAILED(hr)) { wprintf_s(L"初期化に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"初期化に成功しました。\n"); } HSTRING hStr1, hStr2; const wchar_t *cStr1 = L"ワイド文字1"; size_t length = wcslen(cStr1); length = wcslen(cStr1); hr = WindowsCreateString(cStr1, length, &hStr1); if (FAILED(hr)) { wprintf_s(L"hStr1文字列の生成に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"hStr1文字列の生成に成功しました。\n"); } wprintf_s(L"元文字列 =%s\n", WindowsGetStringRawBuffer(hStr1, nullptr)); wprintf_s(L"hStr1_Address=%p, hStr2_Address=%p\n", hStr1, &hStr2); hr = WindowsDuplicateString(hStr1, &hStr2); if (FAILED(hr)) { wprintf_s(L"文字列の複製に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"文字列の複製に成功しました。\n"); } wprintf_s(L"参照文字列 =%s\n", WindowsGetStringRawBuffer(hStr2, nullptr)); wprintf_s(L"hStr1_Address=%p, hStr2_Address=%p\n", hStr1, hStr2); hr = WindowsDeleteString(hStr2); if (FAILED(hr)) { wprintf_s(L"hStr2文字列の削除に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"hStr2文字列の削除に成功しました。\n"); } hr = WindowsDeleteString(hStr1); if (FAILED(hr)) { wprintf_s(L"hStr1文字列の削除に失敗しました。\n"); _CrtDbgBreak(); return 0; } else { wprintf_s(L"hStr1文字列の削除に成功しました。\n"); } RoUninitialize(); _wsystem(L"pause"); return 0; } </syntaxhighlight> 実行結果の出力結果 初期化に成功しました。 hStr1文字列の生成に成功しました。 元文字列 =ワイド文字1 hStr1_Address=004DA5A0, hStr2_Address=001DF73C 文字列の複製に成功しました。 参照文字列 =ワイド文字1 hStr1_Address=004DA5A0, hStr2_Address=004DA5A0 hStr2文字列の削除に成功しました。 hStr1文字列の削除に成功しました。 続行するには何かキーを押してください . . . [[Windows Runtime Cpp]]へ戻る
Windows Runtime Cpp 文字列操作
に戻る。
個人用ツール
ログイン
名前空間
ページ
議論
変種
表示
閲覧
ソースを表示
履歴表示
操作
検索
案内
メインページ
コミュニティ・ポータル
最近の出来事
最近の更新
おまかせ表示
ヘルプ
ツールボックス
リンク元
関連ページの更新状況
特別ページ