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
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
*dialog = new CTestSheet (_T("Test"));
return TRUE;
}
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
刚刚按你的代码试了一下,没有发现问题,检查一下你的对话框资源是否有问题。再看一下具体错误是什么。
*dialog = new CTestSheet (_T("Test"));
其实你这样分配也是多余的,直接在EXE项目中构造对象就可以了。