SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

C++/CLI: とある文字列の相互変換(コンバージョン)

マーシャル・ライブラリ、Encoder/Decoder、ICUによる文字列変換


おまけ: CLRフォームアプリケーションのフォーム名変更

 Visual Studioで「CLR Windows Forms アプリケーション」を生成すると、トップ・フォームには"Form1"という味もそっけもない名前が付けられます。C#/VB.NETだとクラス名の変更に連動してあちこちの名前が自動的に書き換えられてつじつまを合わせてくれるのですが、C++/CLIではひとつひとつ書き換えなくてはなりません。生成されたフォームのヘッダ「Form1.h」にはご丁寧にもビギナをビビらせる脅し文句が大書されています。

 加えて生成されたファイル群にはヘッダ「Form1.h」と対になるはずの「Form1.cpp」が見当たりません。

 C/C++の流儀「宣言は.hに、実装は.cppに書くべし」に真っ向から刃向うファイル構成です。ビギナに優しくありませんよね。

 僕の解決法は「Form1なんか捨てちまえ!」です。吐かれた雛型が気に入らないなら新たに起こしたほうがよっぽど楽。メニューの[プロジェクト]-[新しい項目の追加]から[UI]-[Windowsフォーム]を選択し、好みのフォーム名(ここでは「MainForm」)を指定します。

 するとプロジェクトにはMainForm.hとMainForm.cppが追加されます。追加されたMainFormをアプリケーションのメイン・フォームとするため、mainを修正しましょう。#include "Form1.h"#include "MainForm.h"に、gcnew Form1()gcnew MainForm()に変更します。

#include "stdafx.h"
#include "MainForm.h" // ※変更※

using namespace CLR_FormApplication;

[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
    // コントロールが作成される前に、Windows XP ビジュアル効果を有効にします
    Application::EnableVisualStyles();
    Application::SetCompatibleTextRenderingDefault(false); 

    // メイン ウィンドウを作成して、実行します
    Application::Run(gcnew MainForm()); // ※変更※
    return 0;
}

 ここでいったんビルド/実行し、MainFormが表示されれば切り替え完了。

 お払い箱となったForm1.h、Form1.resxはプロジェクトから削除できます。ついでに中身からっぽのMainForm.cppに下ごしらえをしておきましょう。

#include "StdAfx.h"
#include "MainForm.h"

// ※追加:ここから※
namespace CLR_FormApplication {

  // ここにMainFormの実装を書く。

}
// ※追加:ここまで※

まとめ

 そんなわけで、C++/CLIでの文字列に絡んだ厄介ごとの対処法(+ちょっとしたおまけ)を紹介しました。managedとnativeとの橋渡し役ですから厄介ごとを引き受けるのがお役目ですからね。

 ところで、managedなアプリケーションは実行環境に応じて32bit/64bitを実行時に自動切り替え可能です。が、C++/CLIは(native部分を含んでいるので)どちらかに固定されます。なのでC++/CLIによる仲介アセンブリは32bitあるいは64bit専用となってしまいます。nativeなライブラリが32bit、managedなアプリケーションが64bit動作となると(その逆でも)、C++/CLIは仲介できなくなってしまいます。ライブラリのソースがあり、実行環境に合わせて再ビルドすればなんとかなるでしょうが……。

 エレガントな解決策がありましたら、ぜひともご一報くださいませ。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
特集記事連載記事一覧

もっと読む

この記事の著者

επιστημη(エピステーメー)

C++に首まで浸かったプログラマ。Microsoft MVP, Visual C++ (2004.01~2018.06) "だった"りわんくま同盟でたまにセッションスピーカやったり中国茶淹れてにわか茶...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4774 2010/01/27 11:01

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー