エンバカデロでは、新しいWin64 C++ ツールチェーンをC++Builder 12.0 で初めて登場したプレビュー版から C++Builder 12.2 での完全版 (動的パッケージ リンク、CMake サポート、デフォルトでの並列ビルドなど) に至るまでC++Builderがバージョンアップする度に時間をかけて新しいWin64ツールチェーンを改善し、リリースしてきました。
このようなバージョンアップ毎の段階的なリリースが影響しているためか、一部のお客様から「新しいWin64ツールチェーンを使ってみたいけど、パッケージが利用できないので、旧Win64ツールチェーンから切り替えることができない」といったご意見もいただいておりました。
実際、C++Builder 12.1迄のバージョンでは、新しいWin64ツールチェーンではパッケージの動的リンクはサポートしませんでしたが、C++Builder 12.2ではその問題点も改善され、パッケージの動的リンクもサポートしています。
これによってC++Builder 12.2の新しいWin64 C++ツールチェーン(bcc64x)は、旧Win64 C++ツールチェーン(bcc64)を完全に置き換える存在となりました。
今回のブログではC++Builder 12.2でC++とパッケージに関する新しいDocWikiドキュメントが多数追加されていますので、ご紹介させていただきます。
C++Builder 12.2でのパッケージの作成
C++Builder 12.2でパッケージを作成する手順は以下の通りです。
(1) IDEメニューの[ファイル] > [新規作成] > [パッケージ – C++Builder] 、もしくは [ファイル] > [新規作成] > [その他] > [C++Builderプロジェクト] > [パッケージ ]でC++パッケージが作成できます。(下図を参照)
(2) C++パッケージでは、プロジェクトマネージャのターゲットプラットフォームのWindows 64ビット(モダン)をオンにしてください。(下図を参照)
C++Builder 12.2でパッケージを作成する準備は、たったこれだけの手順で完了です。
C++Builder 12 で Delphi コンポーネントを動作させる方法
ほとんどのコンポーネントはDelphiで書かれており、Delphiソースパッケージに組み込まれています。パッケージの作成者の場合、このセクションは主にサードパーティ コンポーネント ベンダー向けですが、新しいWin64プラットフォームを有効にする必要があります。
その方法については、「Build Delphi Packages for C++」 のdocwikiドキュメントに記載されています。(基本的には、プラットフォームを追加してリビルドします。ヘッダーは同じですが、パッケージインポートライブラリとパッケージ静的ライブラリはCOFF形式であるため、出力フォルダに注意する必要があります。。IDE 内でビルドするのではなく、ビルド スクリプトを使用する場合は、新しいコンパイラフラグがあります。詳細は、 docwikiドキュメントページを参照してください。)
ドキュメント
パッケージは、Delphi との直接的な ABI レベルの相互運用性をサポートするエンバカデロの多言語サポートの一部である機能であり、実質的には C++ に移植された Delphi の機能です。パッケージはコンポーネントやコントロールなどには非常に有用で、DLL にメタデータや追加機能で構成されています (コンポーネントの場合、例えば、コンポーネント/コントロールタイプの登録をサポートします)
しかし、パッケージは「ネイティブ」の C++ 機能ではないため、長年にわたり、使用上のさまざまな側面について多くの質問が寄せられてきました。そこで、12.2 の新しいパッケージ実装に合わせて、新しいドキュメントを作成しました。これには、パッケージの使用方法に関する具体的な推奨事項、推奨される「すべきこと」と「すべきでないこと」事項が含まれています。
エンバカデロへお客様から実際に寄せられた具体的な質問には、次のようなものがあります。
- パッケージから型がエクスポートされたり、パッケージに型がインポートされたりしたことをどうやって知るのか? (それは一体どういう意味なのか?)
- ユニットの初期化とは何か?
- パッケージを本来の目的通りに使用するにはどうすればよいのか?
これらの質問に関して新しいdocwikiドキュメントでは、具体的に解説しています。以下はその抜粋です。
- 新しい C++ ツールチェーンのパッケージ – これはトピックの一般的なインデックスページです。サブページには以下が含まれます。
- ユニット初期化と終了 – パッケージのロードまたはアンロード時にユニットがどのように初期化および終了されるかを説明し、それが何を意味するのかについても説明しています。
- パッケージのインポートとエクスポート – これは最も重要なページの1 つです。ここでは、型がパッケージにインポートされる方法とタイミング、またはパッケージからエクスポートされる方法について説明します。パッケージの使用に関するほとんどの混乱は、この仕組みや対応方法が理解されていないことが原因です。このページでは、推奨されるベストプラクティスを提示しています。
- Weak Packaging ディレクティブの使用 – パッケージ内の弱くパッケージ化されたユニットはすでに文書化されていましたが、それは上記のページの概念と関連しており、より詳細な説明を記載しました。
旧Win64 C++ツールチェーンは、移行を支援するために引き続きインストールされ、並行して利用可能ですが、将来のリリースでは削除される予定です。
そのため今後は新しいWin64 C++ツールチェーンをご利用いただくことを推奨いたします。C++Builder 12.2ではパッケージの実装が修正され、より堅牢になっただけでなく、充実したドキュメントも用意されています。