以前要作一個Windows平臺上的一個安裝包,要求能接受自定義參數,而參數可能會通過編碼加密,因此要求安裝包可以對參數進行decode。可是NSIS腳本並無這方面線程的庫,而NSIS腳本進行大量的字符操做太繁瑣且難以調試,因而決定用c++寫一個NSIS的插件,來擴展NSIS的編解碼加解密的功能。(本文首發與微信公衆號「將來CTO」,歡迎你們關注)c++
NSIS Plugin說到底其實就是一個遵循特定規則進行函數導出的dll文件。在NSIS的Examples\Plugin目錄下,官方已經給出了一個插件開發的demo,能夠看到插件開發的標準樣式。api
這其中nsis目錄下的三個文件,就是NSIS插件開發的所有奧祕所在bash
頭文件源碼很少,並且淺顯易懂。就是定義了一些宏和數據結構,給出了一些c++代碼與NSIS腳本交互的函數聲明,而pluginapi.lib則是這些函數的實現。微信
好了,如今是動手的時候了!開發環境:數據結構
系統: win10函數
IDE: VS2010測試
NSIS:V2.46編碼
新建一個win32 dll工程,將上面看到的nsis目錄拷貝到工程下幷包含到工程中。UrlEnDeCode的頭文件和源文件定義了一個UrlEnDeCode類,能夠進行UrlEncode/UrlDecode。加密
而後從dllmain中,用extern "C"的方式,NSIS Plugin規定的函數形式,導出本身的擴展函數,導出函數的必須符合以下原型:插件
void __declspec(dllexport) UrlEncode( HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra )
#include "stdafx.h" #include "./../nsis/pluginapi.h" #include "UrlEnDeCode.h" #pragma comment(lib,"./../nsis/pluginapi.lib") extern "C" { void __declspec(dllexport) UrlEncode( HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra ) { EXDLL_INIT(); char szUrl[4096]; popstring(szUrl); std::string re = UrlEnDeCode::UrlEncode(szUrl); pushstring(re.c_str()); } void __declspec(dllexport) UrlDecode( HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra ) { EXDLL_INIT(); char szUrl[4096]; popstring(szUrl); std::string re = UrlEnDeCode::UrlDecode(szUrl); pushstring(re.c_str()); } }; BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; }
將編譯以後的dll,拷貝到NSIS的plugins目錄下,就能夠在NSIS腳本中調用了。
在NSIS的腳本中作個測試,安裝包從啓動參數中,獲取通過UrlEncode過的參數,腳本通過decode,而後彈窗顯示。插件裏面函數的調用方法爲:
模塊名:函數名 參數
!include "FileFunc.nsh" !insertmacro GetParameters !insertmacro GetOptions OutFile "NSISEnDeCodeLibTest.exe" # default section Section ; NSISEnDeCodeLib::UrlEncode "測試" ; Pop $0 ; MessageBox MB_OK "ret = $0" ${GetParameters} $R0 ClearErrors ${GetOptions} $R0 "/Test" $0 MessageBox MB_OK "Test = $0 " NSISEnDeCodeLib::UrlDecode $0 Pop $0 MessageBox MB_OK "$0" SectionEnd
編譯生成安裝包,並傳遞測試參數進行啓動:
本例只是簡單的說明了一下,NSIS插件開發的基本流程和方法,並且只簡單給出了UrlEncode/UrlDecode的方法。可是按照這條路走下去,Base64,MD5,3DES都是很是簡單容易實現的。而這些功能,對於軟件公司的推廣和數據統計分析,都是具備很大的使用價值的。