none
DLL 中类的使用 RRS feed

  • 问题

  • 我创建了一个dll 里面自己添加了一个对话框的类Cmain怎样显示调用它 
    我自己用了一种方法就是在原来的类的成员函数aa()中用创建它 

    int CSecretApp::aa()
    {
     Cmain *main = new Cmain();
     main->Create(IDD_DIALOG1);
     main->ShowWindow(SW_SHOW);

    return 0;
    }

    不过在另一个程序中调用 aa()函数的使用 出现了错误

     unresolved external symbol "public: __thiscall Cmain::Cmain(class CWnd *)" (??0Cmain@@QAE@PAVCWnd@@@Z)

    这个要怎么解决   最好提供直接使用dll中类的方法

     


    C++
    2010年4月7日 8:16

答案

  • 1 对于其他app调用这个函数,需要添加

    declspec(dllexport) int CSecretApp::aa()
    {
     Cmain *main = new Cmain();
     main->Create(IDD_DIALOG1);
     main->ShowWindow(SW_SHOW);

    return 0;
    }

    2 由于DLL拥有自己的资源,所以其他app调用的时候需要在使用DLL资源前进行资源切换。

    declspec(dllexport) int CSecretApp::aa()
    {


    AFX_MANAGE_STATE(AfxGetStaticModuleState()); 

    Cmain *main = new Cmain();
     main->Create(IDD_DIALOG1);
     main->ShowWindow(SW_SHOW);

    return 0;
    }

     


    麻烦把正确答案设为解答。
    • 已建议为答案 ja_jerry 2010年4月8日 7:13
    • 已标记为答案 新手。 2010年4月9日 12:05
    2010年4月8日 1:38
    版主

全部回复

  • 对话框类,不能用普通的引出出

    必须使用mfc扩展动态库才可以导出对话框类

    2010年4月7日 8:18
  • 那mfc扩展dll要怎么掉用啊 


    C++
    2010年4月7日 9:27
  • 1 对于其他app调用这个函数,需要添加

    declspec(dllexport) int CSecretApp::aa()
    {
     Cmain *main = new Cmain();
     main->Create(IDD_DIALOG1);
     main->ShowWindow(SW_SHOW);

    return 0;
    }

    2 由于DLL拥有自己的资源,所以其他app调用的时候需要在使用DLL资源前进行资源切换。

    declspec(dllexport) int CSecretApp::aa()
    {


    AFX_MANAGE_STATE(AfxGetStaticModuleState()); 

    Cmain *main = new Cmain();
     main->Create(IDD_DIALOG1);
     main->ShowWindow(SW_SHOW);

    return 0;
    }

     


    麻烦把正确答案设为解答。
    • 已建议为答案 ja_jerry 2010年4月8日 7:13
    • 已标记为答案 新手。 2010年4月9日 12:05
    2010年4月8日 1:38
    版主
  • 写个接口(interface)引出,不建议在DLL里面直接引出C++的函数

    比如class A{void a1();....};

    写一个接口void* CreateClassA(){return (void*)(new A);}

    然后直接调用DLL中的CreateClassA获取一个void*类型的指针在你的需要调用的地方强制转换成A*使用即可.

     


    0xBAADF00D
    2010年4月8日 7:06
    版主
  • 调用动态库中的函数,如果该导出函数调用了动态库模块中的资源,那么该导出函数的函数体中第一句必须是

    AFX_MANAGE_STATE(AfxGetStaticModuleState()); 

    详细的介绍在MSDN中搜索AFX_MANAGE_STATE可以找到

    2010年4月8日 7:16
  • 在dll工程中声明的类的头文件中添加导出声明declspec(dllexport),并在调用dll的客户程序中声明导入declspec(dllimport) 。
    2010年4月8日 13:29