获取并编译最新的Notepad++源码

一、引言

我们在写代码的时候,最喜欢使用一些代码编辑器来编写一些轻型的代码文件,这里比较经典而且用户很多的就是Notepad++了。Notepad++是一款非常简洁轻巧功能非常强大的开源软件,那么只要有一点点开源精神的、并且想要见识下C++11代码风格的程序员,必然就会有想要拿到Notepad++的源码并进行编译的想法,这里我当然也不除外。

基于好奇心害死猫的想法,我开始了Notepad++的源码获取和编译的旅程。这一路上还是遇到了不少坑的,这里希望为那些对Notepad++源码好奇,却又不知道如何获取和编译的人指明一条至少我实践成功了的道路。

二、获取Notepad++的最新源代码

1.GitHub上拉取Notepad++源代码

当然了,需要科学上网。

作为一个程序员,最基本的技能就是科学上网了。这里附上Notepad++的官方网站Notepad++官方网站。在Notepad++的官方网站上,可以下载到最新的Notepad++,可以了解最新的Notepad++相关的资讯。这些与Notepad++源码获取和编译并没有太大关系,英语好的同学可以看看。

其中,Notepad++的源代码托管在Github上面,这里附上Notepad++的源代码地址Notepad++的Github托管地址。熟悉Github的同学当然知道如何下载了。这里为了不了解Github的同学附上源代码如何下载的讲解,当然了,这里需要科学上网,并且还需要至少vs2013的IDE环境。

下载Notepad++源代码

如上图所示,点击Download ZIP可以下载Notepad++的源代码了。

团队资源管理器

如果想直接在vs2013及其以上的IDE里使用Git管理工具下载,也可以点击Open in Visual Studio,这里就会自动打开本地的vs,并且进入团队资源管理器,如上图所示,第一个框填入Notepad++的git托管地址,这里可以写入https://github.com/notepad-plus-plus/notepad-plus-plus.git,第二个是本地的存储库地址,也就是源代码的下载地址,请根据自己的喜好写入即可。

2.不会科学上网的同学请看这里…

如果不会科学上网也没关系,这里我在CSDN上上传了2017-3-25最新的Github上面的同步Notepad++的源代码,可以点击这里进行下载2017-3-25最新Notepad++源代码

三、编译Notepad++

下载好了源代码后,可以看到这样的目录结构。

Notepad++源代码结构图

其中,PowerEditor是Notepad++的项目文件,而scintilla是Notepad++引用的一个强大的代码编辑库。我们编译的顺序呢,就是先编译scintilla项目,得到SciLexer.dll文件,然后再编译PowerEditor项目即可。

1.编译scintilla项目

如何编译scintilla项目呢?其实关于项目的编译呢,Notepad++的Github介绍主页已经说得非常清楚了。这里我选择了不使用boost库的编译方式。

编译SciLexer.dll

图里已经说得非常清楚了,这里把重点步骤翻译成中文:

  • 在windows的运行窗口中输入 Developer Command Prompt for ,然后点击进去,进入vs的命令行模式
  • 变换地址到本地的Notepad++的源代码目录中去,进入scintilla\win32\目录。(附:windows的命令行变换命令,使用cd 进入文件夹,e: 可进入e盘,dir 可查看当前目录内容,不再赘述)
  • 输入 nmake NOBOOST=1 DEBUG=1 -f scintilla.mak编译即可
  • 将生成的SciLexer.dll文件从scintilla\bin\目录中拷贝到我们将要编译的notepad++.exe文件的同一目录下

这里只翻译了部分内容,还有更详细的内容请看附图。

2.编译PowerEditor项目

打开vs项目

这里进入PowerEditor\visual.net\目录中,将图中选中项目使用vs打开。

这里生成解决方案也许会出现问题。

警告视为错误

如上图,这里是因为编码出现了一点点问题。显示错误信息..\src\MISC\Common\mutex.cpp : error C2220: 警告被视为错误 - 没有生成“object”文件。经过我查询资料,这个问题可以这么解决。项目 -> Notepad++属性 -> 配置属性 -> C/C++ -> 常规,将警告视为错误置为即可。

修改为不视为错误

重新生成解决方案,我这里生成成功了。

3.问题:

找不到SciLexer.dll

加载SciLexer.dll失败

大功就要告成啦!!!但是,显示了这么一个窗口。诶!怎么会找不到SciLexer.dll文件呢?刚才折腾了那么久,已经编译了SciLexer.dll文件,并且(如果跟随我的步骤的话)已经把SciLexer.dll文件也拷贝到了notepad++.exe文件的同一目录下了啊。那程序怎么会提示找不到SciLexer.dll文件呢?真的是好奇怪啊。

这里我仔细检查了有没有把文件放错了,但是检查了过后,发现并没有放错。那么,这就奇怪了呢?

有问题,没事,我们有源代码呀!那就打断点跟进去看看!

经过跟代码看到这个函数

TCHAR moduleFileName[1024];
HMODULE loadSciLexerDll()
{
    generic_string sciLexerPath = getSciLexerFullPathName(moduleFileName, 1024);

    if (not isCertificateValidated(sciLexerPath, TEXT("Notepad++")))
        return nullptr;

    return ::LoadLibrary(sciLexerPath.c_str());
}

可以看出,这个函数是加载SciLexer.dll文件的函数。那么肯定是isCertificateValidated(sciLexerPath, TEXT("Notepad++"))返回了FALSE,才导致了错误。那么,我们继续跟进去!

根进去,看到了这么一个函数

// Get message handle and store handle from the signed file.
result = CryptQueryObject(CERT_QUERY_OBJECT_FILE,
            fullFilePath.c_str(),
            CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED,
            CERT_QUERY_FORMAT_FLAG_BINARY,
            0,
            &dwEncoding,
            &dwContentType,
            &dwFormatType,
            &hStore,
            &hMsg,
            NULL);

就是因为result的值为空,导致了我们的返回失败,那很简单了,就把isCertificateValidated这个函数注释掉吧。相关代码修改如下:

TCHAR moduleFileName[1024];
HMODULE loadSciLexerDll()
{
    generic_string sciLexerPath = getSciLexerFullPathName(moduleFileName, 1024);

    // 注释了这个代码就可以跳过SciLexer.dll的文件数字签名证书检查
    // 进而成功调用SciLexer.dll
    /*if (not isCertificateValidated(sciLexerPath, TEXT("Notepad++")))
        return nullptr;*/

    return ::LoadLibrary(sciLexerPath.c_str());
}

那么问题来了,CryptQueryObject函数到底是干什么的呢?经过查询,这个函数是用来验证文件数字签名的。猜想也许是我们自己编译的SciLexer.dll文件的文件数字签名有问题。注释了isCertificateValidated这个函数,继续生成解决方案,果然成功编译运行了程序!!!

编译运行成功撒花

哈哈哈!终于可以欣赏C++11风格的,开源的Notepad++的源代码啦!!!

三、总结

总的来说,Notepad++的源代码还是很值得学习的,其中C++11风格代码的运用,开源库SciLexer的封装,都是很值得我们学习的。
打算最近的清明节好好研究研究Notepad++的源代码,增长下自己的见识,哈哈哈~~~

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页