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 个无法解析的外部命令

解决方案 »

  1.   

    导出类的方式要用lib方式直接link。然后包含h文件就可以使用类了
      

  2.   

    要GetProcAdress 如;
    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 文件
      

  3.   

    DLL中类导出不能使用显式连接
      

  4.   

    http://www.codeguru.com/cpp/w-p/dll/importexportissues/article.php/c123/Explicitly-Linking-to-Classes-in-DLLs.htm
      

  5.   

    库文件包含的是cpp文件编译后的文件,添加这个库文件的头文件,直接调用就行了