none
在一个MFC EXE项目中继承MFC扩展项目中的类 RRS feed

  • 问题

  • 在MFC扩展DLL中,CDialog1从CDialog派生,并有一个对话框资源。

    在使用该扩展DLL的MFC EXE项目中,CDialog2从CDialog1派生。

    生成时:

    Error 1 error LNK2001: unresolved external symbol "public: static struct CRuntimeClass const CDialog1::classCDialog1" (?classCDialog1@CDialog1@@2UCRuntimeClass@@B) Dialog2.obj ExtDll_2_tester

     


    代码:

    Dialog1.h:


    #pragma once

    #include "resource.h"


    // CDialog1 dialog

    class __declspec(dllexport) CDialog1 : public CDialog
    {
     DECLARE_DYNAMIC(CDialog1)

    public:
     CDialog1(CWnd* pParent = NULL);   // standard constructor
     virtual ~CDialog1();

    // Dialog Data
     enum { IDD = IDD_DIALOG1 };

    protected:
     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

     DECLARE_MESSAGE_MAP()
    };

     

     

    // Dialog1.cpp : implementation file
    //

    #include "stdafx.h"
    #include "Dialog1.h"


    // CDialog1 dialog

    IMPLEMENT_DYNAMIC(CDialog1, CDialog)

    CDialog1::CDialog1(CWnd* pParent /*=NULL*/)
     : CDialog(CDialog1::IDD, pParent)
    {

    }

    CDialog1::~CDialog1()
    {
    }

    void CDialog1::DoDataExchange(CDataExchange* pDX)
    {
     CDialog::DoDataExchange(pDX);
    }


    BEGIN_MESSAGE_MAP(CDialog1, CDialog)
    END_MESSAGE_MAP()


    // CDialog1 message handlers

     


    Dialog2.h:


    #pragma once

    #include "Dialog1.h"
    #pragma comment(lib,"ExtDll_2.lib")

    // CDialod2

    class CDialog2 : public CDialog1
    {
     DECLARE_DYNAMIC(CDialog2)

    public:
     CDialog2();
     virtual ~CDialog2();

    protected:
     DECLARE_MESSAGE_MAP()
    };

     

     

    // Dialod2.cpp : implementation file
    //

    #include "stdafx.h"
    #include "ExtDll_2_tester.h"
    #include "Dialog2.h"

    #include "Dialog1.h"
    #pragma comment(lib,"ExtDll_2.lib")

    // CDialod2

    IMPLEMENT_DYNAMIC(CDialog2, CDialog1)

    CDialog2::CDialog2()
    {

    }

    CDialog2::~CDialog2()
    {
    }


    BEGIN_MESSAGE_MAP(CDialog2, CDialog1)
    END_MESSAGE_MAP()

     

    // CDialod2 message handlers

     

     


    MFC EXE项目中引入的Dialog1.h:


    #pragma once

    #include "resource.h"

    #pragma comment(lib,"ExtDll_2.lib")

    // CDialog1 dialog

    class CDialog1 : public CDialog
    {
     DECLARE_DYNAMIC(CDialog1)

    public:
     CDialog1(CWnd* pParent = NULL);   // standard constructor
     virtual ~CDialog1();

    // Dialog Data
    // enum { IDD = IDD_DIALOG1 };

    protected:
     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

     DECLARE_MESSAGE_MAP()
    };

    2010年7月15日 4:27

答案

  • Sincos2007 你好,

    我测试过你以上代码,在我本机上通过编译。

    你可以尝试在MFC EXE项目中的Dialog1.h定义CDialog1时声明 _declspec(dllexport)。 除了以上代码,你是否有其他代码对Dialog1进行操作,比如创建一个实例等等。这个错误可能是由于执行一个没有被导出的造成的。

    请参考这个关于MFC DLL的教程:http://www.codeguru.com/cpp/cpp/cpp_mfc/tutorials/article.php/c4017

    如有任何疑问,请告知,我们非常乐意帮助您。

    Cheer

    Yi 


    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    2010年7月21日 6:45
    版主