【DLL作成】クラスのExport/Importをするには?


豆地蔵  2004-03-24 04:11:52  No: 53380

こんばんわ。

過去ログやサイト上では様々なDLL作成方法として挙げられていましたが
通常のC言語によるDLL系が多かったもので、ここに投稿させて頂きました。

クラス全体ではなく、一部(PUBLICエリアのみなど)のメソッドだけを
指定するには、どのような記述にすればよいのでしょうか。
また、定義ファイル内にはクラス関係ないしにメソッド名のみ記述すれば
よいのでしょうか。

import先では、どのような記述にすればよいえしょうか。
ご指摘、アドバイス宜しくお願い致します。

<開発環境>
WindowsXP(Pro), VisualC++6.0の環境です。

アプリ、DLLの作りは以下のようにしています。
DLL側のAxxx.Hは、独立させ外部からincludeするやり方にしています。

【DLL側】
--- Axxx.H ---
class ABC {
  private:
    ・・・・・
    ・・・・・

  public:
    int Connect(string id, string pw); // アプリとのI/F用関数
    <略>
};

--- Axxx.CPP---
int ABC::Connect(string id, string pw)
{
  <略>
  return _SUCCESS;
}

【アプリ側】
#include <Axxx.H>
???


YuO  2004-03-24 06:46:04  No: 53381

とりあえず,基本的なところを。
http://www.microsoft.com/japan/developer/library/vccore/_core_export_from_a_dll_using___declspec.28.dllexport.29.htm

> クラス全体ではなく、一部(PUBLICエリアのみなど)のメソッドだけを
> 指定するには、どのような記述にすればよいのでしょうか。

基本的には,クラス全体を記述しておく必要があります。
プロトコルクラスを使うような方法を採れば,できないことはないですが……。

このあたりのことをするには,まずDLLとは関係に無しにそれを行うだけの知識が必要です。
ref) Effective C++(改訂2版) / 34項 コンパイルするファイル間の依存性はできるだけ減らそう

次に,DLLへのエクスポートは,
class __declspec(dllexport) identifier { /* ... */ };
という形になります。

> また、定義ファイル内にはクラス関係ないしにメソッド名のみ記述すれば
> よいのでしょうか。

クラスのインポートに定義ファイルを使うのは骨が折れるのではないかと思います。
やったことはないですが,別名を付けるかNONAMEを付けて,
マングルされた名前を記述することになると思います。

> import先では、どのような記述にすればよいえしょうか。

class __declspec(dllimport) identifier { /* ... */ };
という形になります。


豆地蔵  2004-03-24 22:05:24  No: 53382

YuOさん、アドバイスありがとうございます。

本来は、class(DLL側)にするつもりではなく、通常のCによる記述に
しようと考えていたのですが、どうしてもクラスオブジェクトを返したいと
思っていました。
DLL側で処理したデータを構造体で持ち、それを返す方法でもよいかとも
考えたのですが、アプリケーション側で扱うデータにアクセス制限をつけたいが
ため、また明確なメソッドを定義したいがためにCLASS化した方が
見かけも扱いもベターなのではと結論づいたわけです。

>基本的には,クラス全体を記述しておく必要があります。
-- Axxx.H(DLL) --
class __declspec(dllexport) Axxx {
  // データ定義
  private:
    string sdata1;
    string sdata2;

  public:
    string sdata3;
    int    idata;

  private:
    void func1();
    
  public:
    Axxx(){}
    ~Axxx(){}
    int Connect(string, string, string);
};

-- Axxx.CPP(DLL) --
int Connect(string u, string p, string s)
{
  <処理>
  return SUCCESS;
}

>> import先では、どのような記述にすればよいえしょうか。
>class __declspec(dllimport) identifier { /* ... */ };
>という形になります。

-- test.cpp(Application) ---
class __declspec(dllimport) Axxx;
int main()
{
  Axxx  *obj = new Axxx;
  int   ret=0;

  ret = obj->Connect("scott","tiger","");

  delete obj;
}

というようなことでしょうか。


YuO  2004-03-26 04:27:05  No: 53383

> 本来は、class(DLL側)にするつもりではなく、通常のCによる記述に
> しようと考えていたのですが、どうしてもクラスオブジェクトを返したいと
> 思っていました。
> DLL側で処理したデータを構造体で持ち、それを返す方法でもよいかとも
> 考えたのですが、アプリケーション側で扱うデータにアクセス制限をつけたいが
> ため、また明確なメソッドを定義したいがためにCLASS化した方が
> 見かけも扱いもベターなのではと結論づいたわけです。

データの隠蔽だけであれば,構造体で十分です。
不完全型のポインタを使えばよいわけで……。

> >> import先では、どのような記述にすればよいえしょうか。
> >class __declspec(dllimport) identifier { /* ... */ };
> >という形になります。
> -- test.cpp(Application) ---
> class __declspec(dllimport) Axxx;
> int main()
> {
>   Axxx  *obj = new Axxx;
>   int   ret=0;

>   ret = obj->Connect("scott","tiger","");

>   delete obj;
> }
> というようなことでしょうか。

importする側でも,クラスを定義する必要があります。
先に挙げたURLからリンクされているページをちゃんと読んでみてください。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加