[C++] 217 Visual C++ : 非IDE開発環境 その1 Makefile作成準備

[Windows11, Visual C++2017, FLTK 1.3.8, NO IDE]

これまで我慢してVisual Studioを使ってきましたが、製作中アプリのプロジェクトディレクトリのサイズが1.5GB越えと知り(MinGWはたった6MB)、脱Visual Studio(GUI)の決意を固めました。

動作が重いなどパフォーマンスは低いのにストレージをドカ食いはあり得ないです。

Makefileでコンソール開発環境の構築を図ります。とりあえずFLTKを使ったプログラムをコンソールでビルドしました。

このコマンドを元にMakefileを作成します。

#include<FL/Fl.h>
#include<FL/Fl_Box.h>
#include<FL/Fl_Window.h>

Fl_Window* window;
Fl_Box* box;

int main()
{
	window = new Fl_Window(200, 200, 200, 200, "Window title");
	box = new Fl_Box(0, 0, 200, 200, "Hey, I mean, Hello, World!");

	window->show();
	return Fl::run();
}
cl /std:c++17 ^
/GS /W3 /Zc:wchar_t /ZI /Gm- /Od /sdl  /Zc:inline /fp:precise /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" ^
/errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /MDd /FC /diagnostics:column ^
/I"C:\packages\fltk-1.3.8\include" ^
/DYNAMICBASE "fltkd.lib" "wsock32.lib" "comctl32.lib" "fltk_jpegd.lib" "fltk_imagesd.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" ^
"D:\code\VC++\Projects\test_fltk\test.cpp" /link /LIBPATH:"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.30.30705\ATLMFC\lib\x64" /LIBPATH:"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.30.30705\lib\x64" /LIBPATH:"C:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\lib\um\x64" /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\lib\10.0.22000.0\ucrt\x64" /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\\lib\10.0.22000.0\\um\x64" /LIBPATH:"C:\packages\fltk-1.3.8\lib\Debug" 

オブジェクトファイル作成、実行ファイル作成に分ける場合は

cl /std:c++17 ^
/GS /W3 /Zc:wchar_t /ZI /Gm- /Od /sdl  /Zc:inline /fp:precise /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" ^
/errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /MDd /FC /c /diagnostics:column ^
/I"C:\packages\fltk-1.3.8\include" ^
"D:\code\VC++\Projects\test_fltk\test.cpp"
link ^
/DYNAMICBASE "fltkd.lib" "wsock32.lib" "comctl32.lib" "fltk_jpegd.lib" "fltk_imagesd.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" ^
/LIBPATH:"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.30.30705\ATLMFC\lib\x64" ^
/LIBPATH:"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.30.30705\lib\x64" ^
/LIBPATH:"C:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\lib\um\x64" ^
/LIBPATH:"C:\Program Files (x86)\Windows Kits\10\lib\10.0.22000.0\ucrt\x64" ^
/LIBPATH:"C:\Program Files (x86)\Windows Kits\10\\lib\10.0.22000.0\\um\x64" ^
/LIBPATH:"C:\packages\fltk-1.3.8\lib\Debug" ^
"D:\code\VC++\Projects\test_fltk\test.obj"

[C++] 215 Visual C++ : アドオン作成 その2 公式ドキュメント

[Windows11, Visual C++2017, FLTK 1.3.8, Visual Studio 2022]

カラーアプリのアドオン実装に際し、その仕組を理解するため公式ドキュメントを調べています。

Microsoftの公式ドキュメントは日本語の体を成していながら何故か頭に入ってこないので理解するまで何度も読むようにします。

アプリ内購入の実装
Windows.Services.Store 名前空間を使用して、アプリでアプリ内購入をユーザーに提供するには:
1.ユーザーが購入できるアドオンをアプリで提供する場合、パートナー センターで、アプリに関するアドオンの申請を作成します。
2.アプリで提供されるアプリやアドオンの製品情報を取得してから、ライセンスがアクティブになっているかどうかを判断する (つまり、アプリやアドオンを使用するためのライセンスをユーザーが所有しているかどうかを判断する) ようにアプリのコードを記述します。 ライセンスがアクティブになっていない場合、ユーザーに販売するためのアプリやアドオンをアプリ内購入として提供する UI を表示します。
3.ユーザーがアプリやアドオンの購入を選んだ場合、製品を購入するための適切なメソッドを使用します。
・ユーザーがアプリや永続的なアドオンを購入する場合は、「アプリとアドオンのアプリ内購入の有効化」の指示に従ってください。
・ユーザーがコンシューマブルなアドオンを購入する場合は、「コンシューマブルなアドオン購入の有効化」指示に従ってください。
・ユーザーがサブスクリプション アドオンを購入する場合は、「アプリのサブスクリプション アドオンの有効化」の指示に従ってください。
4.この記事に記載されているテスト ガイダンスに従って、実装をテストします。

Microsoft アプリ内購入と試用版

Windows.Services.Store 名前空間

クラス

StoreAcquireLicenseResult現在のアプリのダウンロード コンテンツ (DLC) アドオン パッケージのライセンスを取得する要求の応答データを提供します。
StoreAppLicenseアプリによって提供される製品のライセンスなど、現在のアプリのライセンス情報を提供します。
StoreAvailability購入できる製品 SKU の特定のインスタンスを表します。
StoreCanAcquireLicenseResultダウンロードコンテンツ (DLC) アドオン パッケージのライセンスを取得できるかどうかを判断する要求の応答データを提供します。
StoreCollectionDataユーザーが使用する権利を持つ製品 SKU の追加データを提供します。
StoreConsumableResult現在のアプリの消耗品アドオンを含む要求の応答データを提供します。
StoreContext現在のアプリの Microsoft Store 関連データにアクセスして管理するために使用できるメンバーを提供します。 たとえば、このクラスのメンバーを使用して、現在のアプリの Microsoft Store 登録情報とライセンス情報を取得したり、アプリによって提供されている現在のアプリまたは製品を購入したり、アプリのパッケージ更新プログラムをダウンロードしてインストールしたりできます。デスクトップ アプリでは、UI を表示する方法でこのクラスのインスタンスを使用する前に、オブジェクトをその所有者のウィンドウ ハンドルに関連付ける必要があります。 詳細およびコード例については、「 CoreWindow に依存する WinRT UI オブジェクトの表示」を参照してください。
StoreImageWindows ストアの製品一覧に関連付けられているイメージを表します。
StoreLicense現在のアプリに関連付けられている永続的なアドオンのライセンス情報を提供します。
StorePackageInstallOptionsRequestDownloadAndInstallStorePackagesAsync メソッドを使用して、現在のアプリのダウンロード可能なコンテンツ (DLC) パッケージをダウンロードしてインストールするときに指定できるオプションを表します。
StorePackageLicense現在のアプリのダウンロードコンテンツ (DLC) パッケージのライセンス情報を提供します。
StorePackageUpdateMicrosoft Store からダウンロードできる更新プログラムがある現在のアプリのパッケージに関する情報を提供します。
StorePackageUpdateResult現在のアプリのパッケージをダウンロードしてインストールする要求の応答データを提供します。
StorePriceMicrosoft Store の製品登録情報の価格情報が含まれています。
StoreProductMicrosoft Store で利用可能な製品を表します。
StoreProductOptionsGetStoreProductsAsync メソッドと共に使用して、現在のアプリに関連付けられている指定された製品の情報を取得できるフィルター文字列のコレクションが含まれています。
StoreProductPagedQueryResult現在のアプリ内から購入できる製品に関する詳細を取得する、ページングされた要求の応答データを提供します。
StoreProductQueryResult現在のアプリ内から購入できる製品に関する詳細を取得する要求の応答データを提供します。
StoreProductResult現在のアプリに関する詳細を取得する要求の応答データを提供します。
StorePurchaseProperties購入時にユーザーに表示する製品名など、製品の購入要求に渡すことができる追加の詳細が含まれます。
StorePurchaseResultアプリによって提供されるアプリまたは製品を購入する要求の応答データを提供します。
StoreQueueItem現在のアプリのダウンロードおよびインストール キューにある新規または更新されたパッケージに関する情報を表します。
StoreQueueItemCompletedEventArgsStoreQueueItem クラスの Completed イベントのデータを提供します。
StoreQueueItemStatus現在のアプリのダウンロードおよびインストール キューにある新しいパッケージまたは更新されたパッケージの状態情報を提供します。
StoreRateAndReviewResult製品の評価とレビューを行う要求の応答データを提供します。
StoreRequestHelperWindows SDK で対応する API をまだ使用できない操作のために Microsoft Store に要求を送信するために使用できるヘルパー メソッドを提供します。
StoreSendRequestResultMicrosoft Store に送信される要求の応答データを提供します。
StoreSkuMicrosoft Store の製品の在庫保管単位 (SKU) に関する情報を提供します。
StoreSubscriptionInfo定期請求があるサブスクリプションを表す製品 SKU のサブスクリプション情報を提供します。
StoreUninstallStorePackageResult現在のアプリのパッケージをアンインストールする要求の応答データを提供します。
StoreVideoMicrosoft Store の製品登録情報に関連付けられているビデオを表します。

構造体

StorePackageUpdateStatusダウンロードまたはインストール要求に関連付けられているパッケージの状態情報を提供します。

列挙型

StoreCanLicenseStatusダウンロード コンテンツ (DLC) アドオン パッケージのライセンス状態を表す値を定義します。
StoreConsumableStatusコンシューマブル アドオンに関連する要求の状態を表す値を定義します。
StoreDurationUnitサブスクリプションの試用期間または請求期間の単位を表す値を定義します。
StorePackageUpdateStateパッケージのダウンロードまたはインストール要求の状態を表す値を定義します。
StorePurchaseStatusアプリまたはアドオンを購入する要求の状態を表す値を定義します。
StoreQueueItemExtendedState現在のアプリのダウンロードおよびインストール キューにある新規または更新されたパッケージの拡張状態情報を表す値を定義します。
StoreQueueItemKindダウンロードおよびインストール キューで現在のパッケージに対して実行される操作を記述する値を定義します。
StoreQueueItemState現在のアプリのダウンロードおよびインストール キューにある新しいパッケージまたは更新されたパッケージの状態を指定する値を定義します。
StoreRateAndReviewStatus製品のレートとレビュー要求の結果の状態を取得します。
StoreUninstallStorePackageStatusパッケージアンインストール要求の状態を表す値を定義します。

[C++] 214 Visual C++ : アドオン作成 その1

[Windows11, Visual C++2017, FLTK 1.3.8, Visual Studio 2022]

カラーアプリのアドオンを作成します。

まず前回記事で一度断念したWindows Application パッケージプロジェクトを作成しました。

図を見てもわかるようにアプリのプロジェクトとソリューション内で共存する形になります。

パッケージプロジェクトを右クリックしビルドを選択すると、プロジェクトとパッケージプロジェクトの両方でビルドします。

パッケージプロジェクト内のPackage.appxmanifestをダブルクリックし、マニフェストデザイナーでパッケージの構成を設定します。

次にUWPのAPIを使うため、パッケージマネージャーコンソールから以下コマンドでMicrosoft.Windows.CppWinRT NuGet パッケージをインストールします。

NuGet\Install-Package Microsoft.Windows.CppWinRT -Version 2.0.221121.5

あとはWindows.Services.Store APIを呼び出して、アドオンを作成します。

  • Windows.Services.Store.StoreAcquireLicenseResult
  • Windows.Services.Store.StoreAppLicense
  • Windows.Services.Store.StoreAvailability
  • Windows.Services.Store.StoreCollectionData
  • Windows.Services.Store.StoreConsumableResult
  • Windows.Services.Store.StoreContext
  • Windows.Services.Store.StoreImage
  • Windows.Services.Store.StoreLicense
  • Windows.Services.Store.StorePackageLicense
  • Windows.Services.Store.StorePackageUpdate
  • Windows.Services.Store.StorePackageUpdateResult
  • Windows.Services.Store.StorePrice
  • Windows.Services.Store.StoreProduct
  • Windows.Services.Store.StoreProductPagedQueryResult
  • Windows.Services.Store.StoreProductQueryResult
  • Windows.Services.Store.StoreProductResult
  • Windows.Services.Store.StorePurchaseProperties
  • Windows.Services.Store.StorePurchaseResult
  • Windows.Services.Store.StoreRequestHelper
  • Windows.Services.Store.StoreSendRequestResult
  • Windows.Services.Store.StoreSku
  • Windows.Services.Store.StoreVideo

[C++] 213 FLTK : Visual C++への移植 その11 ストア登録完了 

[Windows11, MinGW g++ 9.2.0, Visual C++17, FLTK 1.3.8, Visual Studio 2022]

カラーアプリのVC++版への移植が完了し、Microsoftストアに登録しました。今日は祝日ですが、米国は平日ですから申請は数時間でパスしました。

Visual Studioを使用したのはexeファイル作成までで、あとはコンソールにてappxファイルを作成しました。appxファイル作成はJava版、MinGW版で経験済みのため慣れたものです。

DLLファイルの扱いにとまどいましたが、UWP用ディレクトリにexeファイルと共に入れておくと自動的に埋め込まれました。

最初はVisual Studioでappxファイルを作成しようとしたものの、公式ドキュメントが分かりにくすぎてあっさり断念しました。Microsoftの公式ドキュメントは読みにくいことこの上ないです。

移植着手から結局10日掛かりました。予想以上の手ごわさでしたね。これでようやくアドオンの作成に取り掛かれます。

[C++] 212 coutデバッグのマクロ化

[M1 Mac, Big Sur 11.6.8, clang 13.0.0]

デバッグの際によく使用するcoutデバッグを簡素化するマクロがネットに公開されていたので早速アレンジしてみました。

以下のヘッダファイルを仕込むことで、DEBUG_MACRO関数により変数を簡単に出力できます。vectorや2次元vectorにも対応しています。変数名に接頭語・接尾語を付けることも可能です。

vector系はPythonにおけるprint関数のように変数名で一括出力できないので、このマクロは重宝しそうです。

#pragma once
#include <iostream>
#include <vector>

#define DEBUG_MACRO(var)  do{std::cout << #var << " : "; view(var);}while(0)
template<typename T> void view(T e){std::cout << e << std::endl;}
template<typename T> void view(const std::vector<T>& v){for(const auto& e : v){ std::cout << e << " "; } std::cout << std::endl;}
template<typename T> void view(const std::vector<std::vector<T> >& vv){ for(const auto& v : vv){ view(v); } }
#include <DEBUG_MACRO.h>

int main(){
    int test1 = 100;
    vector<string> test2 = {"a","b","c"};
    vector<vector<string>> test3 = {{"x1","x2"},{"y1","y2"}};

    DEBUG_MACRO(test1);
    DEBUG_MACRO(test2);
    DEBUG_MACRO(test3);
}
test1 : 100
test2 : a b c 
test3 : x1 x2 
y1 y2 
#pragma once
#include <iostream>
#include <vector>

#define DEBUG_MACRO(var, prefixx, suffixx)  do{std::cout << #prefixx << #var << #suffixx << " : "; view(var);}while(0)
template<typename T> void view(T e) { std::cout << e << std::endl; }
template<typename T> void view(const std::vector<T>& v) { for (const auto& e : v) { std::cout << e << " "; } std::cout << std::endl; }
template<typename T> void view(const std::vector<std::vector<T> >& vv) { for (const auto& v : vv) { view(v); } }

参考サイト

[Python] 339 nkfによる文字コード一括変換

[Windows11, Python 3.10.8]

過去記事の更新です。

import glob,subprocess

dir = "対象ディレクトリ"
paths_cpp = glob.glob(dir + "/**/*.cpp", recursive=True)
paths_h = glob.glob(dir + "/**/*.h", recursive=True)

# リストを結合
paths_cpp.extend(paths_h)

print(paths_cpp)
print(len(paths_cpp))

for path in paths_cpp:
    cmd = "nkf -s --overwrite %s" %path
    subprocess.call(cmd, shell=True)
    print("%s 変換完了" %path)

# -s : Shift-JISへ変換
# -w : UTF-8へ変換(BOMなし)
# -w8, -W : UTF-8へ変換(BOM付き)

# 別ファイルに変換の場合
# nkf -w a.cpp > b.cpp

[C++] 209 FLTK : Visual C++への移植 その8 vector要素文字化け

[Windows11, MinGW g++ 9.2.0, Visual C++17, FLTK 1.3.8, Visual Studio 2022]

GUIのタブ内ボタンを押すとアプリが落ちてしまう不具合に対策を施しました。

原因はまたしても文字化けです。要素が日本語のvectorについて文字列比較でインデックス番号を取得しようとしても、文字化けのためできませんでした。

文字化けを解決するとなると泥沼に陥りそうなので、インデックス番号の取得方法自体を変えました。元々が外部関数に頼るという筋の良くない方法ですし、FLTKで適切な関数を見つけるいいタイミングでした。

void getColor(Fl_Widget*, long num) {
    cout << "num " << num << endl;

    Fl_Widget* tab = tabs->value();
    int tab_num = tabs->find(tab);
    cout << "tab_num " << tab_num << endl;

    // 修正前
    // const char* lbl = tab->label();
    // cout << "lbl " << lbl << endl;
    // string lbl_str = (string)lbl;

    // int tab_num = fcs.getIndex(tab_names, lbl_str); // 文字列比較する外部関数
    // cout << "tab_num " << tab_num << endl;

    <以下略>
}

[C++] 208 FLTK : Visual C++への移植 その7 文字化け解決

[Windows11, MinGW g++ 9.2.0, Visual C++17, FLTK 1.3.8, Visual Studio 2022]

GUIの文字化けはプロジェクトの設定で直りました。WindowsプログラミングはまだShift-JISが優勢なのでしょうか。ここまでUTF-8が冷遇されるとは思いませんでした。

一難去って、今度はタブ内のボタンを押すと落ちてしまいます。

Visual Studioのデバッガとしての出番がやってきたようです。