プロが教える店舗&オフィスのセキュリティ対策術

DLLを作るプログラムをしているのですが、どうしてもコンパイル時にLIBファイルが作成されません。

1>warning C4091: '__declspec(dllexport)' : 変数が何も宣言されていないときは、'DDDClass' の左辺を無視します。

と警告が出てしまいます。

私が書いたソースは以下の通りで、クラスとそのメンバをEXPORTしたいのです。ここで、最後のコメントを外して有効にするとLIBファイルが作成されることはわかっています。また、クラスのメンバにEXPORTをつけてもオーバーライトだと怒られてしまいます。

どのようにしたらLIBファイルが作成されるようになるのでしょうか?

■■■stub.h■■■

#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif

typedef int (*HOGEHOGE)(int i);

EXPORT class DDDClass{
private:
int num;
HOGEHOGE c;
public:
DDDClass();
int CALLBACK counter();
int CALLBACK touroku(int (*b)(int i));
};

■■■stub.cpp■■■

#include <windows.h>
#include "Stub1.h"

int WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved){
return true;
}

EXPORT class DDDClass;

DDDClass::DDDClass(){
num =0;
c = NULL;
}

int CALLBACK DDDClass::touroku(int (*b)(int i)){
c = b;
return 0;
}


int CALLBACK DDDClass::counter(){

//c = b;
c(num);
num++;
return 0;
}

/*
EXPORT bool CALLBACK aaaaa(){
return true;

}
*/

A 回答 (1件)

__declspecの挿入位置が悪いのだと思います



class __declspec(dllexport) クラス名 {
// クラス定義の内容
};

といった具合に classとクラス名の間に __declspecが無いといけません
リンケージ指定の extern "C"は classより前にある必要があります

ですから EXPORTのみで両方をマクロ定義するのはちょっと無理がありそうです

それとstub.cppの
> EXPORT class DDDClass;
これは どんな意図でしょう クラスのインスタンスをエクスポートしたいのならオブジェクト名が必要だと思います

この回答への補足

回答ありがとうございます。

class __declspec(dllexport) DDDClass{
でLIBファイルが作成されることまで確認できました。
ありがとうございます。

一方、
class extern "C" __declspec(dllexport) DDDClass{
ですと、エラーが大量にでてしまいます。
こちらの書き方はなにがまずいのでしょうか?

補足日時:2008/01/27 23:58
    • good
    • 1
この回答へのお礼

すみません。

先ほどの補足では
extern "C" class __declspec(dllexport) DDDClass{
であることを見落としていました。
この書き方で解決しました。

また、
EXPORT class DDDClass;
はどうしてもLIBができないので試しに書いてみたのですが、おっしゃるとおりオブジェクトが必要ですね。

ありがとうございました。

お礼日時:2008/01/28 00:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています