エクスポートされたクラスにアクセスするための明示的なリンケージ(またはランタイムリンク)を使用してDLLlibを呼び出すアプリケーションコードがあります。
DLL.h
#ifdef DLL_EXPORT
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
FooDLL.h
#include "DLL.h"
class DLL_API Foo
{
public:
void doSomeThing();
};
extern "C" DLL_API Foo* _getInstance() {
return new Foo();
}
typedef Foo* (*getInstanceFactory)();
Foo* getInstance() {
HINSTANCE dllHandle = LoadLibraryA("Foo.dll");
getInstanceFactory factory_func = (getInstanceFactory)GetProcAddress(dllHandle, "_getInstance");
return factory_func();
}
FooDLL.cpp
#include "FooDLL.h"
Foo::doSomething() {
// .......
}
Application.cpp(DLLを呼び出す)
#include "FooDLL.h"
Foo* obj = getInstance();
obj->doSomething(); // XXX this line can be compiled and linked only when DLL is already in path
上記のコードは、DLLファイルがlibパスに含まれている場合にのみビルド(コンパイルおよびリンクなど)できます。そうしないと、未解決の外部シンボルエラーが発生しました。
error LNK2001: unresolved external symbol "__declspec(dllimport) public: void __thiscall Foo::doSomething()" .....
DLLヘッダーファイル(つまりFooDLL.h)のみを使用し、ビルド時にDLL / LIBファイルを使用せずにアプリケーションコードをビルドすることは可能ですか?(psクラスの実装はcppファイルに含まれている必要があります。)
ありがとう!