static AFX_EXTENSION_MODULE testDLL = { NULL, NULL };
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
UNREFERENCED_PARAMETER(lpReserved); if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE("test.DLL 正在初始化!\n");

if (!AfxInitExtensionModule(testDLL, hInstance))
return 0;
new CDynLinkLibrary(testDLL); }
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE("test.DLL 正在终止!\n"); AfxTermExtensionModule(testDLL);
}
return 1;   // 确定
}extern "C" BOOL AFX_EXT_API GetProperty(CTestSheet ** dialog)
{
*dialog = new CTestSheet (_T("Test"));
return TRUE;
}//
class AFX_EXT_CLASS CTestSheet : public CPropertySheet
{
DECLARE_DYNAMIC(CTestDialog)
private:
CPropertyPage* m_pTestPage ;public:
CTestDialog(UINT nIDCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0)
        { 
           m_pTestPage = new CMyPage;
   AddPage(m_pTestPage );
        }
CTestDialog(LPCTSTR pszCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0)
        {  
           m_pTestPage = new CMyPage;
   AddPage(m_pTestPage ); 
        }
virtual ~CTestDialog();protected:
DECLARE_MESSAGE_MAP()
};#include "stdafx.h"
// CMyPage 对话框,
class CMyPage : public CPropertyPage
{
DECLARE_DYNAMIC(CMyPage)public:
CMyPage();
virtual ~CMyPage();// 对话框数据
enum { IDD = IDD_PROP_TEST };
protected:
virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
};主程序调用
typedef BOOL (*PFN)(CTestSheet** dialog);
CTestSheet *pDialog = NULL;
HINSTANCE hIns = ::AfxLoadLibrary(_T("test.dll"));
PFN pfn = (PFN)GetProcAddress(hIns,_T("GetProperty"));
if (pfn != NULL)
{
    (pfn)(&pDialog);
    pDialog->DoModal();
}
一执行到m_pPage = new CMyPage;
就出现
Debug Assertion Failed!
file: f:\sp\vctools\vc7libs\ship\atlmfc\include\afxwin1.inl
Line:24

解决方案 »

  1.   

    extern "C" BOOL AFX_EXT_API GetProperty(CTestSheet ** dialog)
    {
        AFX_MANAGE_STATE(AfxGetStaticModuleState());
        *dialog = new CTestSheet (_T("Test"));
        return TRUE;
    }
      

  2.   

    加上 AFX_MANAGE_STATE(AfxGetStaticModuleState()); 出现。
    1 error LNK2005: _DllMain@12 already defined in test.obj mfcs80ud.lib
    2 fatal error LNK1169: one or more multiply defined symbols found C:\Documents and Settings\tyi\My Documents\Visual Studio 2005\Projects\Solution1\Debug\test.dll 1
      

  3.   

    只有MFC规则DLL并且使用共享DLL中的MFC时才需要AFX_MANAGE_STATE,扩展DLL不要加。
    刚刚按你的代码试了一下,没有发现问题,检查一下你的对话框资源是否有问题。再看一下具体错误是什么。
      

  4.   

    谢谢cnzdgs,是资源模板的问题。不过调试的时候提示下面这段代码有内存泄漏。这该怎么解决?
    *dialog = new CTestSheet (_T("Test"));
      

  5.   

    再定义一个导出函数来delete。
    其实你这样分配也是多余的,直接在EXE项目中构造对象就可以了。