SDKっぽいプロジェクトの作り方。
DirectX SDKのようなSDKを作ってみましょう。(DLLは次の機会に)
プロジェクトの設定
とりあえず以下のような構成でプロジェクトとディレクトリを作成します。
(VC++2008ExpressEdition)
- app(Win32プロジェクト)
- sdk(スタティックリンクライブラリ)
- include
- lib
SDK側のプロパティ
SDKにインターフェイスと実装クラスを追加
IHoge.h
COM風の参照カウンタ方式で作ってみます。
#pragma once class IHoge { public: virtual ~IHoge(){} virtual void addref() = 0; virtual void release() = 0; virtual int func( int a, int b ) = 0; }; IHoge* CreateHoge();
Hoge.h
ctor/dtorはprivateにします。
#pragma once #include <IHoge.h> class Hoge : public IHoge { private: Hoge(void); ~Hoge(void); private: int ref_count; public: void addref(); void release(); int func( int a, int b ); friend IHoge* CreateHoge(); };
Hoge.cpp
#include "StdAfx.h" #include "Hoge.h" Hoge::Hoge(void) : ref_count( 1 ) { } Hoge::~Hoge(void) { } void Hoge::addref() { ref_count ++; } void Hoge::release() { ref_count --; if( ref_count == 0 ) delete this; } int Hoge::func( int a, int b ) { //とりあえず加算して返す return a + b; } IHoge* CreateHoge() { return new Hoge(); }
アプリケーションで使ってみる
インターフェイスと生成関数のみ公開します。
#include "stdafx.h" #include "app.h" #include <IHoge.h> int APIENTRY _tWinMain( HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, LPTSTR /*lpCmdLine*/, int /*nCmdShow*/) { IHoge* hoge = CreateHoge(); hoge->func( 1, 2 ); hoge->release(); /*...*/ }
コンパイルすると、libフォルダにsdk.libが生成されます。
依存関係を設定しているので、ライブラリのリンクは必要ありません。
三角括弧<>を使って標準ヘッダのようにインクルードするだけでOKです。
以上でSDK利用者に対して、実装を隠蔽することが可能です。
SDKを公開する場合は、include、libフォルダだけ配布します。
私は基本的に全てのソースを公開して行きます。
バグがあるかもしれませんがw