gpt4 book ai didi

visual-c++ - 从 DLL 导出 MFC 对话框

转载 作者:行者123 更新时间:2023-12-03 00:56:36 26 4
gpt4 key购买 nike

7 月 21 日:更新,见底部

在 VC++ 2005 中我有 2 个项目。首先,一个 MFC DLL 项目(不是扩展 DLL),它有一个简单的对话框:

TestDlg.h

#pragma once
#include "afxwin.h"
#include "resource.h"
// CTestDlg dialog
namespace Dialogs
{
class __declspec(dllexport) CTestDlg : public CDialog
{
DECLARE_DYNAMIC(CTestDlg )

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

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

然后我有一个带有 MFC 库的 Win32 控制台应用程序,它可以:

TestApp.cpp

#include "stdafx.h"
#include "TestApp.h"
#include <TestDlg.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


CWinApp theApp;

using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;

// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
_tprintf(_T("Fatal Error: MFC initialization failed\n"));
nRetCode = 1;
}
else
{

Dialogs::CTestDlg dlg;
dlg.DoModal();
}
return nRetCode;
}

它构建并运行,但没有出现对话框。进入 DoModal()...

dlgcore.cpp

INT_PTR CDialog::DoModal()
{
// can be constructed with a resource template or InitModalIndirect
ASSERT(m_lpszTemplateName != NULL || m_hDialogTemplate != NULL ||
m_lpDialogTemplate != NULL);

// load resource as necessary
LPCDLGTEMPLATE lpDialogTemplate = m_lpDialogTemplate;
HGLOBAL hDialogTemplate = m_hDialogTemplate;
HINSTANCE hInst = AfxGetResourceHandle();
if (m_lpszTemplateName != NULL)
{
hInst = AfxFindResourceHandle(m_lpszTemplateName, RT_DIALOG);
HRSRC hResource = ::FindResource(hInst, m_lpszTemplateName, RT_DIALOG);
hDialogTemplate = LoadResource(hInst, hResource);
}
if (hDialogTemplate != NULL)
lpDialogTemplate = (LPCDLGTEMPLATE)LockResource(hDialogTemplate);

// return -1 in case of failure to load the dialog template resource
if (lpDialogTemplate == NULL)
return -1;

... more stuff

无论出于何种原因,它似乎无法加载资源,在复制部分的末尾返回 -1。我看过 CodeGuru 等上的一些文章,但没有看到任何明显的内容。我的类(class)没有被导出/导入吗?还是资源问题?或者是我尝试从控制台(MFC)应用程序显示它的问题?

7 月 21 日更新我创建了一个重写的 DoModal,如下所示:

INT_PTR CTestDlg::DoModal()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
return CDialog::DoModal();
}

这似乎有效,尽管我应该重写不同的方法以使功能更通用吗?

最佳答案

正如您所注意到的,问题是 MFC 找不到资源,因为模块上下文设置为主 EXE,而不是包含对话框资源的 DLL。

手动调用 AFX_MANAGE_STATE 以确保建立 DLL 上下文是实现此目的的一种方法,但它并不透明。理想的方法是将 DLL 编译为扩展 DLL,以便 MFC 可以负责从扩展 DLL 列表中加载资源并管理 DLL 之间的内存。

您可以快捷地创建扩展 DLL,只需创建您自己的 CDynLinkLibrary 实例,这会将您的 DLL 添加到主资源列表中。我还没有尝试过这个,更喜欢采用扩展 dll _AFXDLL 路线,所以这可能会也可能不会。

关于 Extension DLLs 的 MSDN 文章可以帮助您确定它们是否适合您的情况,以及它们带来哪些优点/缺点。

关于visual-c++ - 从 DLL 导出 MFC 对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3265451/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com