使用RichEdit程序无法启动

摘要:
在MFC或WTL项目中,如果使用RichEdit控件,您会发现程序无法启动,但编译器不会给出任何警告或错误。我在互联网上找到了一些信息,发现支持RichEdit的动态库没有加载。在MFC下添加AfxInitRichEdit();在WTL下添加HMODULEhRichDll=LoadLibrary;在程序结束时:如果{FreeLibrary;hRichDll=NULL;}---------------------------------------------我是一个除法器--------------------------------------------我对AfxInitRichEdit()很好奇;LoadLibrary是否相同?或者其他值=NULL;}看到AfxCtxLoadLibraryW主要被调用;RICHED32.DLL和riched20.DLL只是不同的版本,所以我们不讨论它们。继续到F12,意外地来到AFX_ ISOLATIONAWARE_ STATICLINK_FUNC的这一行是一个宏。MFC的常用实践中也有两个级别的宏定义。最终翻译结果如下:1lineHMODULEAfxCtxLoadLibraryW2{3ULONG_PTRUlActCtxCookie=0;4BOOLfActCtxSucceeded=ActivateActCtx;5HMODULEEresult=;6if(!

在MFC或者WTL工程里,如果使用了RichEdit控件,会发现程序无法启动,编译器却没给出任何警告或错误。

在网上找了下资料,原来是没有加载支持RichEdit的动态库。

在MFC下面添加:

AfxInitRichEdit();

在WTL下面添加:

HMODULE hRichDll = LoadLibrary(_T("riched20.dll"));

程序结束时:

if(hRichDll)
{
    FreeLibrary(hRichDll);
    hRichDll= NULL;
}

-------------------------------------------我是分割线----------------------------------------------------

很好奇AfxInitRichEdit();是不是也同样LoadLibrary呢?还是有其他什么做法?

BOOL PASCAL AfxInitRichEdit()
{
    _AFX_RICHEDIT_STATE* pState = _afxRichEditState;
    if (pState->m_hInstRichEdit == NULL)
        pState->m_hInstRichEdit = AfxCtxLoadLibraryW(L"RICHED32.DLL");
    return pState->m_hInstRichEdit != NULL;
}

看到主要是调用了AfxCtxLoadLibraryW(L"RICHED32.DLL");

RICHED32.DLL和riched20.dll只是不同的版本而已,先不做深究。

继续F12竟然到这一行

AFX_ISOLATIONAWARE_STATICLINK_FUNC(HMODULE,LoadLibraryW,(LPCWSTR lpLibFileName),(lpLibFileName),NULL)

是一个宏,MFC的惯用手法

里面还有两层的宏定义,最后翻译过来结果如下:

 1 inline HMODULE AfxCtxLoadLibraryW(LPCWSTR lpLibFileName)
 2 { 
 3     ULONG_PTR ulActCtxCookie = 0;
 4     BOOL fActCtxSucceeded = ActivateActCtx(AfxGetModuleState()->m_hActCtx, &ulActCtxCookie);
 5     HMODULE result=(NULL);
 6     if (!fActCtxSucceeded)
 7     {
 8         return result;
 9     }
10     __try {
11     result=LoadLibraryW(lpLibFileName); 
12     }
13     __finally
14     {
15         const BOOL fPreserveLastError = (result == (NULL) );
16         const DWORD dwLastError = fPreserveLastError ? GetLastError() : NO_ERROR;
17         DeactivateActCtx(0,ulActCtxCookie);
18         if (fPreserveLastError)
19         {
20             SetLastError(dwLastError);
21         }
22     }
23     return result;
24 }

主要工作还是调用LoadLibrary,不过多了一对函数的调用,具体参考MSDN:

ActivateActCtx

DeactivateActCtx

免责声明:文章转载自《使用RichEdit程序无法启动》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇FlashBuilder 4.6 安装方法及步骤Unity调用安卓Android的Toast下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MFC--响应鼠标和键盘操作

一个程序最重要的部分之一是对鼠标和键盘操作的响应. 一. 理解鼠标事件.之前对鼠标事件的认识仅仅局限于处理控件的单击与双击事件.但实际鼠标的操作包含很多.这里将以一个画图的小程序讲解对鼠标的响应. 首先新建一个MFC程序,选择对话框类型,将Mouse设为程序标题.建立程序框架后将对话窗口中所有的控件删除.这样整个对话框都可以用来作图. 然后选中对话框窗口在...

MFC用PostMessage传递消息

1.自定义消息ID。 #define WM_MY_MESSAGE (WM_USER+100)         WM_USER为windows系统为非系统消息保留的ID,这里至少要用100,因为其它控件的消息会占用一部分。 2. 定义消息处理函数。 消息处理函数为消息目标类的成员函数。首先应该在.h 文件中声明。这里以主窗口类为例,主窗口类名 C...

MFC学习之Radio---MFC Radio按钮组的使用例子

首先我们要完成一个功能,在一个添加新用户的场景里,通过Radio按钮来判断用户选择的是管理员还是普通用户。 要使用Radio组的功能首先我们必须作如下设置: 1、2个Radio按钮的ID号不同,但是他们的tab顺序必须是按顺序排列的,这些都可以在Resource.h文件里面查看到。 如:Radio1 ID:IDC_RADIO_ADMIN Radio2 ID...

自定义MFC对话窗口的类名

默认情况下,MFC对话框的窗口类名为“#32770”,如果想自定义窗口类名呢,需要两步: 1.修改rc文件 这一步需要直接编辑rc文件,使用任意记事本工具即可,找到窗口的相关定义,原来是这样子的: IDD_TESTMYWNDCLASS_DIALOG DIALOGEX 0, 0, 320, 200 STYLE DS_MODALFRAME | WS_POPUP...

windows程序调试

调试策略 第一章 调试的过程 1. 成功而高效的调试的关键是找到准确的错误信息 2. 一旦找到一个错误,就可能找到更多。类似的代码可能还有类似的错误 3. 从错误中学习如何预防将来会产生的错误 4. 对于新代码,根本不需要执行测试来判断它是否有错误 第二章 编写便于调试的C++代码 C++语言和编程风格 1. 在需要的时候使用语言的高级特性 2. 要写出能...

【转】MFC 字体LOGFONT

Windows的字体LOGFONT   LOGFONT是Windows内部字体的逻辑结构,主要用于设置字体格式,其定义如下:typedef struct tagLOGFONTA{    LONG      lfHeight;    LONG      lfWidth;    LONG      lfEscapement;    LONG      lf...