c++ dll 除了可以到处函数,还可以导出类,以及变量。LoadLibrary之后如何使用这些类和变量。比如下面的代码,是vs自动生成的dll头文件。如何使用CConsoleApplication8和nConsoleApplication8 // 下列 ifdef 块是创建使从 DLL 导出更简单的
// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 CONSOLEAPPLICATION8_EXPORTS
// 符号编译的。在使用此 DLL 的
// 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
// CONSOLEAPPLICATION8_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
// 符号视为是被导出的。
#ifdef CONSOLEAPPLICATION8_EXPORTS
#define CONSOLEAPPLICATION8_API __declspec(dllexport)
#else
#define CONSOLEAPPLICATION8_API __declspec(dllimport)
#endif// 此类是从 ConsoleApplication8.dll 导出的
class CONSOLEAPPLICATION8_API CConsoleApplication8 {
public:
CConsoleApplication8(void);
// TODO: 在此添加您的方法。
};extern CONSOLEAPPLICATION8_API int nConsoleApplication8;CONSOLEAPPLICATION8_API int fnConsoleApplication8(void);使用:int main()
{
auto pMod = LoadLibrary(L"ConsoleApplication8.dll");
std::cout << nConsoleApplication8 << std::endl;
CConsoleApplication8 *pddddd = new CConsoleApplication8(); getchar();
return 0;
}1>ConsoleApplication6.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall CConsoleApplication8::CConsoleApplication8(void)" (__imp_??0CConsoleApplication8@@QAE@XZ),该符号在函数 _main 中被引用
1>ConsoleApplication6.obj : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) int nConsoleApplication8" (__imp_?nConsoleApplication8@@3HA)
1>C:\Users\tydq\documents\visual studio 2015\Projects\ConsoleApplication6\Debug\ConsoleApplication6.exe : fatal error LNK1120: 2 个无法解析的外部命令
// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 CONSOLEAPPLICATION8_EXPORTS
// 符号编译的。在使用此 DLL 的
// 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
// CONSOLEAPPLICATION8_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
// 符号视为是被导出的。
#ifdef CONSOLEAPPLICATION8_EXPORTS
#define CONSOLEAPPLICATION8_API __declspec(dllexport)
#else
#define CONSOLEAPPLICATION8_API __declspec(dllimport)
#endif// 此类是从 ConsoleApplication8.dll 导出的
class CONSOLEAPPLICATION8_API CConsoleApplication8 {
public:
CConsoleApplication8(void);
// TODO: 在此添加您的方法。
};extern CONSOLEAPPLICATION8_API int nConsoleApplication8;CONSOLEAPPLICATION8_API int fnConsoleApplication8(void);使用:int main()
{
auto pMod = LoadLibrary(L"ConsoleApplication8.dll");
std::cout << nConsoleApplication8 << std::endl;
CConsoleApplication8 *pddddd = new CConsoleApplication8(); getchar();
return 0;
}1>ConsoleApplication6.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall CConsoleApplication8::CConsoleApplication8(void)" (__imp_??0CConsoleApplication8@@QAE@XZ),该符号在函数 _main 中被引用
1>ConsoleApplication6.obj : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) int nConsoleApplication8" (__imp_?nConsoleApplication8@@3HA)
1>C:\Users\tydq\documents\visual studio 2015\Projects\ConsoleApplication6\Debug\ConsoleApplication6.exe : fatal error LNK1120: 2 个无法解析的外部命令
typedef BOOL (__stdcall *pGetCount)(HIMAGELIST himglst);
DWORD WINAPI rtGetImageCount(LPVOID lpParam)
{
HINSTANCE hInst = ::LoadLibrary("comctl32.dll");
if (!hInst)
{
AfxMessageBox("can't load comctl32.dll" );
return -1;
}
// get adress of 'ImageList_GetImageCount'
pGetCount pfunCall = (pGetCount)GetProcAddress(hInst, "ImageList_GetImageCount");
FreeLibrary(hInst);
*(((pPARAMETER)(lpParam))->pretCount) = pfunCall((HIMAGELIST)lpParam);
return 0;
}隐式连接使用 。lib 文件