首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当与使用MFC的常规DLL链接时,MFC应用程序断言失败。

当与使用MFC的常规DLL链接时,MFC应用程序断言失败。
EN

Stack Overflow用户
提问于 2013-06-23 14:24:05
回答 2查看 683关注 0票数 0

我正在将一个旧的OWL应用程序迁移到MFC。有一个具有主对话框和控件的主库,我开始为老的OWL编写一个MFC的替代类,比如TDialoginherits,CDialogEx,TEdit……我从OWL中添加了所有需要的类,现在我的库构建成功了。

我创建了一个新的MFC应用程序来测试库,我从应用程序中使用的dll导出了一个函数SowDialogue,我将dll的.lib添加到MFC应用程序中,我调用该函数来显示一个简单的对话框,构建成功,但是在第一次启动时,应用程序失败了

我点击了“重试”和“中断”,得到了导致断言的那一行。

所以问题在于资源。当我链接到库时,MFC无法获得正确的资源模块。

我认为这是因为如果必须使用MFC扩展库,则使用使用MFC和共享MFC对象的常规dll。如何将常规库转换为MFC扩展库。

或者经过长时间的工作后解决这场灾难的任何方法

编辑

这是调用堆栈,其中没有导出函数,其全部在应用程序中--在从dll调用任何内容之前出现错误。

溶液

当我将dll转换成MFC扩展库时,这个问题得到了解决,实际上我创建了一个新的mfc扩展dll,并欺骗了它的属性、dll主、stafx包括和预处理程序定义

代码语言:javascript
复制
static AFX_EXTENSION_MODULE MFCExtensionDLL = { NULL, NULL };

extern "C" int APIENTRY DllMain( HINSTANCE hInst, DWORD fdwReason, LPVOID)
{
    if (fdwReason == DLL_PROCESS_ATTACH)
    {
        TRACE0("MFCExtension.DLL Initializing!\n");

        // Extension DLL one-time initialization
        if (!AfxInitExtensionModule(MFCExtensionDLL, hInst))
            return 0;


        new CDynLinkLibrary(MFCExtensionDLL);

        //My initialization code

        return 1;
    }
    else if (fdwReason == DLL_PROCESS_DETACH)
    {
        // Terminate the library before destructors are called
        AfxTermExtensionModule(MFCExtensionDLL);
        // my finalization code
        return 1;
    }
}

性质

代码语言:javascript
复制
in the properties of project->configuration properties->general Use of MFC = Use MFC in a Shared DLL

代码语言:javascript
复制
in the properties of project->configuration properties->C/C++->Preprocessor->Preprocessor Definitions->add _AFXEXT , make sure to delete _USERDLL if it exists
EN

回答 2

Stack Overflow用户

发布于 2013-06-24 00:57:51

在.dll中使用MFC时,必须确保.dll能够为.rc文件中的字符串和位图之类的内容找到资源句柄。MFC为每个指向该.dll的资源的.dll维护内部状态。当从应用程序(或其他.dll)调用该MFC时,必须“帮助”MFC获得正确的内部状态,否则它将无法找到您的资源并进行断言。

在您的示例中,我无法在调用堆栈的下面看到函数,但是如果它是导出的函数,则MFC状态问题很可能是正在发生的。

确保您已经将AFX_MANAGE_STATE宏放在从外部访问的所有函数(导出函数)的顶部。这对解决你的问题有很大的帮助。

微软参考资料:http://msdn.microsoft.com/en-us/library/ba9d5yh5(v=vs.80).aspx

票数 1
EN

Stack Overflow用户

发布于 2018-11-29 13:11:44

如果使用dll文件中的资源或窗口,则可以尝试这种方法。此代码可以在dll本身中。每当创建资源时,主进程的当前资源句柄将被设置为dll的资源句柄并使用句柄。

在任何窗口创建或资源更改之后,将其还原为旧值。

代码语言:javascript
复制
hdllresource = ::LoadLibrary(<dllfile containing the resource>);
hcurrentInst = AfxGetResourceHandle();
AfxSetResourceHandle(hdllresource );

//do your window creation or resource loading stuff 

AfxSetResourceHandle(hdllresource);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17261686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档