ホーム ] C++ネイティブDLL ] 試作第1号 ] 試作第2号 ]

上へ
C++ネイティブDLLの開発
VBから参照
配列の引き渡し

C++ネイティブDLL

C++ネイティブDLLの開発

最終更新日:2007/04/09  追加

●概要

 市販の参考書には殆ど載っていなく、MSDNにてサンプルを見つけ、それを突破口にして開始できた。C、C++については、必要に応じて習得して行く方式とする。筆者としては、DLLができ、それをVBで使えれば、途中経過やスマートさは気にしない。

●開発環境

 Visual Studio 2005 にて開発できる。VC++ 2005 でも同じ。無料ソフトのExpress版では、PlatformSDK(無料)を導入し、ある手続きを行えば開発できるようになるらしい。

 →その後、分かったこと:無料ソフトのExpress版で、PlatformSDK(無料)を導入するのは、設定ウィザードにDLL指定を表示させるためで、標準では、DLL を指定できないようになっている。導入なしでExpress版で、C++ネイティブDLLを開発するには、

 Visual C 2005 → 新しいプロジェクト → Visual C++ Win32コンソールアプリケーション

とし、表示されたウィザードでは、取りあえず、コンソールアプリケーションと、空のプロジェクトを選ぶ。

 次に、プロジェクトのプロパティを表示すると、下図が表示される。

 ここで、構成プロパティの全般にて、構成の種類を、ダイナミックライブラリ(dll) とすれば良い。あとは、以下の説明と同じ。

●手順

○環境準備

 Visual Studio 2005 → 新しいプロジェクト → Visual C++ Win32コンソールアプリケーション

とし、ウィザード(下図)にて、DLL を選択、追加オプションで空のプロジェクトをチェックする(これをしないと余計なものが山ほど生成される)。

 この状態では、一切のファイルは生成されていない。

 以下に、二つの方法を示す。

C++Export法

 これは、オーバーロード可能なエクスポート法であるが、このため参照すべき関数名は判じ物(名前修飾される)になる。

・ヘッダーファイル生成

 プロジェクト → 新しい項目の追加 → ヘッダーファイル(h)

とし、適当な名称を指定すると、空白のファイルが準備される。

 例えば、以下のようにプロトタイブ宣言などを記述する。

namespace ImageProcessing
{
   class ImageProcess
   {
   public:
      static __declspec(dllexport) void Convert(char *bb, int w, int h, double a, double b );  /公開する関数
      ・・・・・・
      ・・・・・・
   };
}

 VC++なので、名前空間、クラス名を定義する。

 外部に公開するので、public とし、共有関数なので、static とする。

 エクスポートは、__declspec(dllexport) とする。但し、この方法は、C++形式なので、オーバーロードに対応するため、内部名称は、コンパイラが、適度な情報にて自動生成した部分が付加される(これを名前修飾と言うらしい)。

・C++ファイル生成

 プロジェクト → 新しい項目の追加 → C++ ファイル(cpp)

とし、適当な名称を指定すると、空白のファイルが準備される。

 例えば、以下のようにコードを記述する。

#include "ImageProcess.h"

#include <stdexcept>
#include <math.h>

using namespace std;

namespace ImageProcessing
   {
   void ImageProcess::Convert(char *bb, int w, int h, double a, double b )
      {
         int bc = w * h * 3;
         int i ;
         double c;
         for (i = 0 ; i <= bc - 1; i = i + 1)
         {
            c = *(bb + i) * a + b;
            if (c < 0) c = 0;
            if (c > 255) c = 255;
            *(bb + i) = (char) c;
          }
      }

}

・コンパイル

 これをコンパイルすれば、dll が生成される。これで終わり。

DEFファイル法

 この方法はDEFファイルを必要とするが、関数名はそのままでVBから参照できる。

・C++ファイル生成

 プロジェクト → 新しい項目の追加 → C++ ファイル(cpp)

とし、適当な名称を指定すると、空白のファイルが準備される。

 例えば、以下のようにコードを記述する。

#include <stdexcept>
#include <math.h>
#include <stdio.h>

using namespace std;

__declspec (dllexport) void __stdcall YYYYYYY(・・・・・・・)
{
    ・・・・・・・・
    ・・・・・・・・

・DEFファイル生成

  プロジェクト → 新しい項目の追加 → モジュール定義ファイル(def)

とし、適当な名称を指定すると、空白のファイルが準備される。

 例えば、以下のようにコードを記述する。

LIBRARY "XXXXXXXXXXXX"      //この部分は自動記述
EXPORTS
YYYYYYY

ZZZZZZZ

YYYYYYY は、関数名。以降羅列すれば良い。この部分は、自分で保守する必要がある。

・コンパイル

 これをコンパイルすれば、dll が生成される。これで終わり。ヘッダーファイルはなくとも良い。