Windows (Win32/Win64) の DLL において変数をインポートする場合、__declspec(dllimport) を正しく書く必要があります。関数の場合はインポートする側でも __declspec(dllexport) と書いても正しく動いてしまいます(不適切ではありますが)。

エクスポートする側 (DLL)

int __declspec(dllexport) int1 = 0;
int __declspec(dllexport) int2 = 0;

int __declspec(dllexport) func1() { return int1; }
int __declspec(dllexport) func2() { return int2; }

インポートする側 (EXE)

extern int __declspec(dllexport) int1; // リンクエラー
extern int __declspec(dllimport) int2; // OK

int __declspec(dllexport) func1(); // リンクエラーにはならないし正しく動く
int __declspec(dllimport) func2(); // OK

int main(void)
{
    int1 = 10;
    int2 = 10;

    printf("%d %d\n", func1(), func2());

    return 0;
}

なんで2015年にもなって今更こんな記事書いてるかというと、Win32 で今まで変数をエクスポートしようとしたことが無いんですよええ。

Trackback

no comment untill now

Add your comment now