1. 程式人生 > >獲取並編譯最新的Notepad++原始碼

獲取並編譯最新的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++的原始碼,增長下自己的見識,哈哈哈~~~

相關推薦

獲取編譯最新Notepad++原始碼

一、引言 我們在寫程式碼的時候,最喜歡使用一些程式碼編輯器來編寫一些輕型的程式碼檔案,這裡比較經典而且使用者很多的就是Notepad++了。Notepad++是一款非常簡潔輕巧功能非常強大的開源軟體,那麼只要有一點點開源精神的、並且想要見識下C++11程式碼風

DOS工具: 自動從VSS獲取編譯,複製,上傳,打包的工具

@echo offrem -- =============================================rem -- DESCRIPTION: <自動_VSS管理バッチ>rem -- AUTHOR:  <>rem -- CREATE

chromium瀏覽器開發系列第二篇:如何編譯最新chromium原始碼

說一下為什麼這麼晚才發第二篇,上週和這周department的工作太多了,晚上都是十點半從公司出發,回家以後實在沒有多餘的精力去摸鍵盤了。所以請大家包涵! 上期回顧: chromium原始碼下載: 找個靠譜的vpn(我試過了,網上說的不用vpn拿程式碼的都不靠譜)

使用.NET Core優雅獲取展示最新疫情資料

前言新型冠狀病毒的出現,著實讓人緊張。我每天一大早都會去檢視今天的最新資料,可是每次的資料都挺讓人揪心的。今天突然間很想看看過去的歷史的資料,結果查了很多資料都不是很全。反正國家讓我們待在家裡做貢獻,那我們也可以多做做研究,偶然的機會發現了一個API可以查到歷史資料,於是就用.NET Core 3.1實現了一

OSG-獲取OSG的原始碼和第三方庫編譯

獲取OSG的原始碼有很多方式。 這裡說下其中的兩個地方,第一就是中國的OSG網站http://www.osgchina.org/,這個網站目前應該是由中國西安恆歌科技維護,同時,西安恆歌科技也是一家已OSG為基礎開發的一家很好的公司,其公司旗下的FreeEarth有很多方

編譯獲取微信小程式原始碼(筆記)

一、前言: 本人的該部落格僅供研究,切記用於非法途徑。如有任何非法行為,皆與本博主無關。 跟著流程走,100%獲取原始碼成功。 流程如下: (1)下載並安裝夜神模擬器。下載地址:https://download.csdn.net/download/qq_31362105/10732350

自動下載原始碼_編譯_打包_部署_重啟服務的Shell指令碼

完整版見https://jadyer.github.io/2015/06/03/linux-shell-deploy/ #!/bin/sh APP_NAME=engine APP_WARS=JadyerEngine-web/target APP_PATH=/app/

【Launcher】獲取最新Launcher原始碼,並且匯入到Android Studio

2.翻牆的可以直接通過 git clone https://android.googlesource.com/platform/packages/apps/Launcher3  下載原始碼(gi

菜鳥與 cef 的邂逅之旅(一):cef 原始碼獲取編譯

一、引言 最近工作中涉及到了有關嵌入瀏覽器控制元件的任務,並且要求支援 H5。之前使用了 wke,但是發現其對於 H5 的支援不夠好,因此只能選擇“聞名已久”的 cef。 cef 是什麼呢: CEF 全稱 Chromium Embedded Fram

最新ICE原始碼編譯安裝

發現ICE3.7版本在編譯安裝時比之前的版本省事了很多,少了很多雜七雜八的依賴庫;估計是被grpc火熱情景給逼的? Compiling [amd64-shared] src/Ice/CollocatedRequestHandler.cpp Compiling [amd64-shared] sr

通過清華大學映象下載Android原始碼編譯原始碼

    之前看原始碼都是在Windows下用SourceInsight看,雖然達到了研究原始碼的效果,但終究還是有遺憾。。。趁著週末,準備在Ubuntu虛擬機器上下載編譯原始碼。     之前下原始碼時,有了解一些Android原始碼的情況。網上的教程很多也是從谷歌官網下原始碼,但是最近藍燈不好用,FQ效率有

編譯錯誤 說明: 在編譯向該請求提供服務所需資源的過程中出現錯誤。請檢查下列特定錯誤詳細資訊適當地修改原始碼

 系統釋出後,在本地機子上一切正常,但是上傳到伺服器出現如下錯誤: “/”應用程式中的伺服器錯誤。 -------------------------------------------------------------------------------- 編譯錯誤

vs2010編譯notepad++原始碼

1 官網下載原始碼 http://notepad-plus-plus.org/download/v6.6.9.html 2 解壓 其中Notepad++是原始碼在PowerEditor資料夾裡,scintilla是一個外掛,後面要在PowerEditor裡面用到。 3

Chromium原始碼獲取編譯--附加一個簡單例子的編譯

從工作到現在,一直弄介面相關的東西,弄了好多年,包括前公司也買了一套UI,但是用下來以後發現不是這個問題就是那個問題。現在新的公司還在用MFC。MFC其實沒什麼不好,就是不能改原始碼這點比較糾結。。(誰說不能改原始碼的,改完自己編譯就是了。。orz。。你倒是給我個工程檔案?

在Ubuntu16.04上下載編譯Android原始碼

Android原始碼位於Google的Git程式碼庫中,由於Android原始碼工程過於複雜龐大,所以Google以Git為基礎用Python指令碼,寫了一個管理工具Repo。 1.安裝Repo 在安裝Repo之前,假定已經安裝好了git。 mkdir ~

docker最新程式碼原始碼編譯

前言 docker的編譯環境非常複雜,但是docker是幹嘛的?環境怎能成為問題,於是docker官方提供了docker編譯環境dockerfile。於是docker編譯就非常簡單了。 獲取原始碼 拉取最新的docker原始碼 git

C# 在編譯向該請求提供服務所需資源的過程中出現錯誤。請檢查下列特定錯誤詳細資訊適當地修改原始碼

行 1: #pragma checksum "E:\WEBSERVICE\WebClient\default.aspx" "{406ea660-64cf-4c82-b6f0-42d48172a799}" "8929E17C339CE9FDACB5A0E34138AABF" 行 2: //----

Android獲取編譯原始碼以及獲取編譯核心原始碼(整理)

$ ls -l /usr/bin/gcc* lrwxrwxrwx 1 root root 7 2011-11-01 23:56 /usr/bin/gcc -> gcc-4.6 -rwxr-xr-x 1 root root 224544 2011-10-06 05:47 /usr/bin/

chromium瀏覽器開發系列第一篇:如何獲取最新chromium原始碼

轉自:https://my.oschina.net/ghost045/blog/397663 摘要: 前面介紹了原始碼下載,編譯。接下來要介紹一下目錄結構,方便大家以後對架構的瞭解。 附上上兩篇文章地址,方便大家檢視: 下載原始碼 編譯原始碼 上兩篇介紹了下載原始碼和

chromium原始碼下載編譯

目前,chromium的原始碼已經全部遷移到了git管理,所以本文主要梳理一下下載chromium原始碼的過程。 一、概況 chromium現在分為四個大分支: canary:最前沿的版本,每天都發布,bug一堆,不適合新人 dev:每兩個星期釋出,