gpt4 book ai didi

windows - 在 x64 中第二次 RichEdit 初始化后崩溃

转载 作者:行者123 更新时间:2023-12-02 08:43:27 25 4
gpt4 key购买 nike

根据Using Rich Edit Controls我是这样使用RichEdit的:

MyControl::OnCreate()
{
handle = LoadLibrary(_T("Riched20.dll"));
}

MyControl::OnDestroy()
{
FreeLibrary(handle);
}

它在 win32 上运行良好,但最近我构建了 x64 配置,现在我的控件在页面重新加载后失败。

alt text

我注意到如果这样做:

MyControl::OnCreate()
{
handle = LoadLibrary(_T("Riched20.dll"));
FreeLibrary(handle);
handle = LoadLibrary(_T("Riched20.dll"));
}

一切正常。

我不想将此代码投入生产,那么有什么关于更好的解决方案/解决方法的建议吗?

最佳答案

由于报告的故障模块是 Richedit20.dll_unloaded,这意味着您正在卸载 DLL,而其中的代码仍在使用中。

例如,如果在(完全)释放 DLL 时仍然打开着一个 richedit 窗口,那么只要有任何事情触发了对该控件的 window-proc 的调用,您就会看到类似的崩溃。这是因为控件的 window-proc 位于卸载的 DLL 代码内。

多次调用 LoadLibrary 和 FreeLibrary 应该是安全的(只要调用平衡),所以我怀疑这就是问题所在。它可能只是触发问题。此外,这个问题也存在于 32 位版本中;你只是运气好,从未触发过它。

OnDestroy 是调用 FreeLibrary 的错误位置。有多个窗口消息会在 WM_DESTROY 之后发送到窗口(例如 WM_NCDESTROY)。

当调用 OnDestroy 时,子窗口仍然存在。如果 Richedits 是您的控件的子级(而不是控件本身),那么将 FreeLibrary 移至 OnNcDestroy 可能会拯救您。 (子窗口在调用 WM_NCDESTROY 时被销毁。)但是,我仍然会说这不是释放库的好地方。

所以您肯定想移动您的 FreeLibrary 调用。我会将它和 LoadLibrary 完全移出控制本身。在创建库实例时控制加载/释放库是不正常的。相反,在某处放置一些静态 init/uninit 代码,这些代码可以一劳永逸地加载您需要的库,并在应用程序关闭时释放它们。

(如果您的应用程序很少使用该控件,那么仅当使用该控件的窗口处于事件状态时加载/释放库可能才有意义。不过,这种情况很少见。通常您最好只保留加载的 DLL .)

关于windows - 在 x64 中第二次 RichEdit 初始化后崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4242829/

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