1

エクスポートされたクラスにアクセスするための明示的なリンケージ(またはランタイムリンク)を使用して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ファイルに含まれている必要があります。)

ありがとう!

4

2 に答える 2

0

はい、可能です。クラスをエクスポートしなかった場合、ヘッダー ファイルはまったく必要ありません。ヘッダー ファイルに LoadLibrary の呼び出しを配置し​​た理由がわかりません。クラスをエクスポートしているので、コンパイラに型を知らせる必要があります。さらに、クラス全体をエクスポートする必要はありません。公開したいクラスの特定のメンバー関数のみをエクスポートできます 。dll および exe プロジェクトで使用されるdll ヘッダーには、次のものが含まれている必要があります (私は自分の名前を使用しました)。

#ifdef WIN32DLL_EXPORTS
#define WIN32DLL_API __declspec(dllexport)
#else
#define WIN32DLL_API __declspec(dllimport)
#endif

class CWin32DLL 
{
public:
    CWin32DLL();
    int WIN32DLL_API GetInt();
};

実装:

#include "stdafx.h"
#include "Win32DLL.h"

extern "C" WIN32DLL_API CWin32DLL* _getInstance() 
{ 
    return new CWin32DLL(); 
} 

// This is the constructor of a class that has been exported.
// see Win32DLL.h for the class definition
CWin32DLL::CWin32DLL()
{
}

int CWin32DLL::GetInt()
{
    return 42;

}

DLL コンシューマ:

#include "Win32DLL.h"
#include "SomeOther.h"
typedef CWin32DLL* (*getInstanceFactory)();

HINSTANCE dllHandle = LoadLibrary(_T("Win32DLL.dll")); 

getInstanceFactory factory_func = (getInstanceFactory)GetProcAddress(dllHandle, "_getInstance"); 

CWin32DLL* pWin32 = factory_func();

int iRet = pWin32->GetInt();

プロジェクト プロパティ、C++、プリプロセッサ、dll のプリプロセッサ定義で WIN32DLL_EXPORTS (または同等のもの) を定義することを忘れないでください。

于 2012-05-31T01:18:09.817 に答える
0

仮想機能付き。

class Foo
{
public:
    void virtual doSomeThing();     
};
于 2012-05-30T15:05:28.897 に答える