C++/CLIって何?

よく、お使いの言語は何ですか?と尋ねると

 

『Visual C++』

 

です。
という答えが返ってくるのですが、このC++/CLIの登場によって、Visual C++が差すものが何なのか?ますます分からなくなってきました。

 

現在、Visual StudioでC++言語が扱えるのは

  • MFC(Microsoft Foundation Class)
  • SDK(Software Development Kit)
  • C++/CLI

の3つでしょうか?

 

C++/CLIはこれらの良いとこ取りをしたような言語で、GUI部分はVB6.0のようなフォームエディタで作成し、ボタンをダブルクリックする事でイベント処理を追加していきます。
また、従来のWin32 APIも使えるし、MFCのクラスも使えるし、最近主流になってきているVB.NETやC#などが使っている.NET Frameworkも使う事が可能です。

 

また、C#などでは基本的に使えないポインタもそのまま使う事が可能です。

 

もし、これまで、GUIはVB6.0で作って、処理部分はWin32APIや自作のライブラリを作って来たような人にとっては、比較的とっつき易いと思います。

 

ただ、あまりにゴチャゴチャに開発ができるようにしてしまったせいか、最新のVisual Studio 2010ではIntellisenseが使えないなど、ここ最近は、いまいちMicrosoftのやる気が感じられません。

 

という事で、これから先が不透明感のある感じなのですが、これまで作成してきたC++の資産を生かしつつ簡単なGUI周りを作成したい方にはオススメです。
ただし、多少凝ったソフトになると、フォーム間の参照や64bitの対応など、他のVB.NETやC#と比べてかなり面倒なので、評価用のサンプルを作る程度に留めておいた方が無難です。

 

もし、新規にプログラムを始めたい方にはC#の方が良いと思います。
C#もC++/CLIも.NET Frameworkを使うプログラムなので、基本的には同じような物と言いつつも、少しずつC#の方が優遇されているような気がします。

 

なので、C++/CLIで従来のC++のライブラリを使ったクラスライブラリを作成し、画面周りなどのアプリケーションよりな部分はC#で作る!というのが私なりの現在の結論なのですが、C++/CLIの情報は非常に少ないので、記事にまとめていこうと思います。

 

【追記】

結局、C++/CLIを使うのは辞めました。

フォーム間参照が面倒だし、/MT(d)が指定できないし、Any CPUがないし・・・

AnyCPUが無いと、OSが64bitであっても32bitで動いているVisual Studioでは、フォームエディタにカスタムコントロールを配置しようとすると、64bitにコントロールを対応させようとすると、AnyCPUでないと都合が悪いんですよね。

 

という事で、フォーム周りはC#で作る方がおすすめです。

フリーで使えるVisual Studio Expressの入手

2012年10月現在、最新版はVisual Studio 2012となりました。

VS2012 Expressについては、下記、記事にまとめました。

Visual Studio 2012 Expressが公開されました

 

以下は、旧版の内容です。

———————————————————

VB.NET、C#、C++/CLIをこれから始めようとしている方は、まずは無料で使えるVisual Studio Expressを試すのがオススメです。
このVisual Studio Expressは、プログラム初心者や学生向けという位置づけですが、そこそこの事ができます。

 

入手先はこちら

 

http://www.microsoft.com/japan/msdn/vstudio/express/

 

旧版のVisual Studio 2008 Express Editionもこちらから入手可能です。

 

http://www.microsoft.com/japan/msdn/vstudio/2008/product/express/

 

Visual Studio 2010のC++/CLIではIntellisense(携帯で言うところの予測入力みたいなもの)が使えないので、C++/CLIをやりたい場合は、VS2008の方がいいと思います。

 

 

このExpressでは何ができないか?というと、細かい事はVisual Studio 2005の場合ですが、

 

@IT
http://www.atmarkit.co.jp/fdotnet/special/vs2005compare/vs2005compare_01.html

 

に任せるとして、私がExpressで不便に感じたのは

 

  • C++/CLIのExpressにはリソースエディタが無い
    →バージョン管理ができない、SDKのウィンドウが作れない。
  • ユーザーコントロールが作れない
  • マクロ機能が無い
  • ソリューションが多言語をまたげない
    →VB.NETやC#の混在が出来ない。

 

などなど。

 

と、言いながらもちょっとしたアプリケーションを作るだけなら、かなりの事が出来るので、まずはこのExpressから初めてみては如何でしょうか?

 

Visual Studioへ戻る

【OpenCV2.2】新規プロジェクトの作成方法(C言語版)

OpenCVのサンプルプログラムはHPを検索すればいくらでも転がっていますが、最初の頃はこれを、どのように使えば良いのか?私にはよく分かりませんでした。

 

という事で、OpenCV2.2およびVisual Studio2010 Express を使って、サンプルプログラムを作成する方法を紹介します。

 

何はともあれ、サンプルプログラムはこちらです。

opencv22sample.zip

 

新規プロジェクトの作成方法

Visual Studio を起動し、新しいプロジェクトをクリックします。

 

 

開いたウィンドウのWin32コンソールアプリケーションを選択し、任意の名前および場所を指定します。

 

 

OKボタンをクリックし、次へをクリックします。

 

 

さらに表示されたウィンドウの完了をクリックします。

 

 

すると、空の状態のソースコードが作成されます。

 

 

OpenCV.jpのサンプルとは、mainの部分がちょっと異なりますが、気にせず、そのままにしておいて下さい。

 

次にOpenCV2.2の入手、ダウンロード、インストール、環境設定の最後の部分でも紹介していますが、ヘッダファイルをプログラムから参照できるように、OpenCVのヘッダファイルのディレクトリを指定します。

 

 

プロジェクトのプロパティで構成プロパティ→C/C++→全般の追加のインクルードディレクトリ

C:\OpenCV2.2\include

を指定します。

 

あとは、作成したcppファイル(上記の例ではOpenCV2.2Sample.cpp)にプログラムをしていけばOKです。

 

以下、画像を開き、ガウシアンフィルタ処理を行い、処理前、処理後の画像を表示するだけの簡単なサンプルプログラムを示します。

// OpenCV2.2Sample.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"

//プロジェクトのプロパティ⇒C/C++⇒全般 の追加のインクルードディレクトリに
// 『C:\OpenCV2.2\include』を追加のこと
#include "opencv2\\opencv.hpp"

#ifdef _DEBUG
    //Debugモードの場合
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_core220d.lib")
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_imgproc220d.lib")
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_highgui220d.lib")
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_objdetect220d.lib")
    //以下、必要に応じて追加
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_ml220d.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_features2d220d.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_video220d.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_calib3d220d.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_flann220d.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_contrib220d.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_legacy220d.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_gpu220d.lib")
#else
    //Releaseモードの場合
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_core220.lib")
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_imgproc220.lib")
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_highgui220.lib")
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_objdetect220.lib")
    //以下、必要に応じて追加
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_ml220.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_features2d220.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_video220.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_calib3d220.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_flann220.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_contrib220.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_legacy220.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_gpu220.lib")
#endif

int _tmain(int argc, _TCHAR* argv[])
{
    //画像データの読込
    IplImage* src_img = cvLoadImage("C:\\OpenCV2.2\\samples\\c\\lena.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
    if (src_img == NULL){
        return 0;
    }

    //表示ウィンドウの作成
    cvNamedWindow("src");
    cvNamedWindow("dst");

    //処理後画像データの確保
    IplImage* dst_img = cvCreateImage(cvGetSize(src_img), src_img->depth, src_img->nChannels);

    //画像処理例(ガウシアンフィルタ)
    cvSmooth(src_img, dst_img, CV_GAUSSIAN, 9);

    //画像の表示
    cvShowImage ("src", src_img);
    cvShowImage ("dst", dst_img);

    //キー入力待ち
    cvWaitKey (0);

    //全てのウィンドウの削除
    cvDestroyAllWindows();

    //画像データの解放
    cvReleaseImage(&src_img);
    cvReleaseImage(&dst_img);

    return 0;
}

OpenCVへ戻る