我有一个应用程序代码,它调用带有显式链接(或运行时链接)的DLL库来访问导出的类。
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文件? (p.s.类实现必须在cpp文件中。)
谢谢!
答案 0 :(得分:0)
虚拟功能。
class Foo
{
public:
void virtual doSomeThing();
};
答案 1 :(得分: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();
不要忘记在dll的项目属性,C ++,预处理器,预处理器定义中定义WIN32DLL_EXPORTS(或等效项)。