用c++ 給易語言寫支持庫學習記錄


 

廢話我就不對說 直接開始

易語言官方下載的易語言安裝路徑下 有一個SDK文件夾

我們點進入cpp文件夾里面提供是c++的SDK

elib文件夾里就是sdk 我們新建一個win32項目

 

這里我用的是VS2015 

 

創建一個空的項目

包含易語言官方的SDK目錄即可

 

需要注意的地方是 預定義處理里面 如果你需要編譯成靜態庫的話 這兩個是必不可少的

代碼生成選擇多線程(MT)

目標平台選擇7.0 支持XP系統

如果需要生成fne后綴的(動態鏈接庫)無法靜態編譯

預處理器需要這樣設置 因為dll和lib的宏名不一樣如果填寫的不對 生成的就不對

主要實現 入口函數dllMain

main.cpp

 1 #include <windows.h>
 2 BOOL APIENTRY DllMain(HMODULE hModule,
 3     DWORD  ul_reason_for_call,
 4     LPVOID lpReserved
 5 )
 6 {
 7     switch (ul_reason_for_call)
 8     {
 9     case DLL_PROCESS_ATTACH:
10     case DLL_THREAD_ATTACH:
11     case DLL_THREAD_DETACH:
12     case DLL_PROCESS_DETACH:
13         break;
14     }
15     return TRUE;
16 }
main.cpp

功能實現 Elibfne.h 頭文件

 1 #ifndef __ELIBFNE__
 2 #define __ELIBFNE__
 3 #include <windows.h>
 4 #include <tchar.h>
 5 #include <cassert>
 6 #if 1        //易語言SDK 必須帶的
 7 #include <lib2.h>
 8 #include <lang.h>
 9 #include <fnshare.h>
10 #include <fnshare.cpp>
11 #endif
12 #define LIBARAYNAME "ELIB_MessageNotify"
13 EXTERN_C void AddFunc(PMDATA_INF pRetData, INT iArgCount, PMDATA_INF pArgInf);
14 EXTERN_C void SubFunc(PMDATA_INF pRetData, INT iArgCount, PMDATA_INF pArgInf);
15 EXTERN_C void MulFunc(PMDATA_INF pRetData, INT iArgCount, PMDATA_INF pArgInf);
16 EXTERN_C void DivFunc(PMDATA_INF pRetData, INT iArgCount, PMDATA_INF pArgInf);
17 EXTERN_C INT WINAPI  ELIB_MessageNotify(INT nMsg, DWORD dwParam1, DWORD dwParam2);
18 #ifndef __E_STATIC_LIB
19 #define LIB_GUID_STR "{1BF8530F-D7F9-4FE2-B94D-1906950FE19F}" /*GUID串: // {E0E54C4E-67DA-47C6-89BE-0DF9E8360AAA}, 必須使用guidgen.exe生成  數字簽名*/
20 #define LIB_MajorVersion 1 /*庫主版本號*/
21 #define LIB_MinorVersion 1 /*庫次版本號*/
22 #define LIB_BuildNumber 20180810 /*構建版本號*/
23 #define LIB_SysMajorVer 3 /*系統主版本號*/
24 #define LIB_SysMinorVer 0 /*系統次版本號*/
25 #define LIB_KrnlLibMajorVer 3 /*核心庫主版本號*/
26 #define LIB_KrnlLibMinorVer 0 /*核心庫次版本號*/
27 #define LIB_NAME_STR "Elib_TEST" /*支持庫名*/
28 #define LIB_DESCRIPTION_STR "\r\n簡單的測試下封裝支持庫\r\n\
29 吹牛逼專用" /*功能描述*/
30 #define LIB_Author "    ┏━━━━━ Cool  ━━━━┓" /*作者名稱*/
31 #define LIB_ZipCode "    ┣━━━━━━━━━━━━━━┫" /*郵政編碼*/
32 #define LIB_Address "    ┃       QQ:252858527        ┃" /*通信地址*/
33 #define LIB_Phone    "    ┣━━━━━━━━━━━━━━┫" /*電話號碼*/
34 #define LIB_Fax        "    ┃  JBec:http://dwz.cn/jb-ec  ┃" /*QQ號碼*/
35 #define LIB_Email     "    ┣━━━━━━━━━━━━━━┫" /*電子郵箱*/
36 #define LIB_HomePage "    ┃            NULL            ┃" /*主頁地址*/
37 #define LIB_Other    "    ┗━━━━━━━━━━━━━━┛" /*其它信息*/
38 #define LIB_TYPE_COUNT 1 /*命令分類數量*/
39 #define LIB_TYPE_STR "0000基本命令\0""\0" /*命令分類*/
40 #endif
41 
42 #endif
ElibFne.h

功能實現 Elibfne.cpp 源文件

  1 #include "ElibFne.h"
  2 
  3 /*
  4 @ 常量 定義導出 
  5 */
  6 
  7 #ifndef __E_STATIC_LIB
  8 
  9 LIB_CONST_INFO constStruct[] =
 10 {
 11     /*
 12     常量參數注釋
 13     @ 中文名稱
 14     @ 英文名稱
 15     @ 常量的介紹
 16     @ 命令的學習難度級別
 17     @ 常量類型
 18     @ 文本類型存放的內容
 19     @ 布爾類型 浮點類型存放的內容
 20     */
 21     { _WT("ELB_VERSION"), _WT("取ELIB版本"), _WT("獲取支持庫版本號 返回文本型內容"), LVL_HIGH, CT_TEXT, _WT("1.0"), NULL },//文本常量
 22     {_WT("ELB_BOOL"),_WT("ELB布爾類型常量"),_WT("測試ELB布爾類型 常量返回布爾類型內容"),LVL_SIMPLE,CT_BOOL,NULL,1},
 23     { _WT("ELB_DOUBLE"),_WT("ELB小數類型常量"),_WT("測試ELB浮點類型 常量返回浮點類型內容"),LVL_SIMPLE,CT_NUM,NULL,1}
 24 
 25 };
 26 /*
 27 @ 導出 結構體類型
 28 */
 29 LIB_DATA_TYPE_ELEMENT structIntType[] =
 30 {
 31     /*{ 成員類型 ,數組成員 , 中文名稱 ,英文名稱 ,成員解釋 ,枚舉類型 ,默認值}*/
 32     { SDT_INT, NULL,_T("左邊"), _T("left"), _T("left"), NULL, 0},
 33     { SDT_INT, NULL,_T("定邊"), _T("top"), _T("top"), NULL, 0 },
 34     { SDT_INT, NULL,_T("右邊"), _T("right"), _T("right"), NULL, 0 },
 35     { SDT_INT, NULL,_T("底邊"), _T("bottom"), _T("bottom"), NULL, 0 }
 36 };
 37 LIB_DATA_TYPE_ELEMENT structTypes[] =
 38 {
 39     /*{ 成員類型 ,數組成員 , 中文名稱 ,英文名稱 ,成員解釋 ,枚舉類型 ,默認值}*/
 40     { SDT_TEXT, NULL,_T("數據內容"), _T("data"), _T("要發送的文本數據"), NULL, 0},
 41     { SDT_SHORT, NULL,_T("短整數類型"), _T("short"), _T("短整數類型測試"), NULL, 0 },
 42     { SDT_FLOAT, NULL,_T("小數類型測試"), _T("float"), _T("小數類型測試"), NULL, 0 },
 43     { SDT_BOOL, NULL,_T("布爾類型"), _T("Boolean"), _T("布爾類型測試"), NULL, 0 },
 44     { SDT_DATE_TIME, NULL,_T("日期時間類型測試"), _T("TimeDate"), _T("日期時間類型測試"), NULL, 0 },
 45     { SDT_SUB_PTR, NULL,_T("子程序指針類型測試"), _T("SUBPTR"), _T("子程序指針類型測試"), NULL, 0 },
 46     { SDT_BIN, NULL,_T("字節集類型測試"), _T("bin"), _T("字節集類型測試"), NULL, 0 }
 47 };
 48 
 49 static LIB_DATA_TYPE_INFO DataTypes[] =
 50 {
 51     /* { 中文名稱, 英文名稱, 數據描述, 索引數量, 命令索引, 對象狀態, 圖標索引, 事件數量, 事件指針, 屬性數量, 屬性指針, 界面指針, 元素數量, 元素指針 } */
 52     { _WT("矩形"), _WT("RECT"), _WT("窗口矩形數據結構"), 0, NULL, NULL, 0, 0, NULL, 0, NULL, NULL, sizeof(structIntType) / sizeof(structIntType[0]), structIntType },
 53     { _WT("復雜數據結構"), _WT("Struct"), _WT("測試多種數據類型"), 0, NULL, NULL, 0, 0, NULL, 0, NULL, NULL, sizeof(structTypes) / sizeof(structTypes[0]), structTypes }
 54 };
 55 #endif // !1
 56 
 57 /*
 58 函數的實現都需要定義在宏的外面以便靜態和動態庫都能使用,但ExecuteCommand,Commands則只需定義在宏的里面供動態庫使用。
 59 pRetData 輸出數據指針。當對應CMD_INFO中m_dtRetType為_SDT_NULL(即定義無返回值)時,pRetData無效;
 60 iArgCount 函數參數個數
 61 pArgInf 函數參數指針
 62 */
 63 EXTERN_C void AddFunc(PMDATA_INF pRetData, INT iArgCount, PMDATA_INF pArgInf)
 64 {
 65     if (iArgCount==2)
 66     {
 67         pRetData->m_int = pArgInf[0].m_int + pArgInf[1].m_int;
 68     }
 69     return;
 70 }
 71 
 72 EXTERN_C void SubFunc(PMDATA_INF pRetData, INT iArgCount, PMDATA_INF pArgInf)
 73 {
 74     if (iArgCount == 2)
 75     {
 76         pRetData->m_int = pArgInf[0].m_int - pArgInf[1].m_int;
 77     }
 78     return;
 79 }
 80 
 81 EXTERN_C void MulFunc(PMDATA_INF pRetData, INT iArgCount, PMDATA_INF pArgInf)
 82 {
 83     if (iArgCount == 2)
 84     {
 85         pRetData->m_int = pArgInf[0].m_int * pArgInf[1].m_int;
 86     }
 87     return;
 88 }
 89 
 90 EXTERN_C void DivFunc(PMDATA_INF pRetData, INT iArgCount, PMDATA_INF pArgInf)
 91 {
 92     if (iArgCount == 2 && pArgInf[0].m_int!=0)
 93     {
 94         pRetData->m_int = pArgInf[0].m_int / pArgInf[1].m_int;
 95     }
 96     return;
 97 }
 98 
 99 
100 #ifndef __E_STATIC_LIB
101 PFN_EXECUTE_CMD ExecuteCommand[] =
102 {
103     // 所有需要庫中調用的  函數  都列在這里,用逗號隔開
104     AddFunc,
105     SubFunc,
106     MulFunc,
107     DivFunc
108 };
109 
110 static const char* const CommandNames[] =
111 {
112     // 所有需要庫中調用的  函數名  都寫在這里,用逗號隔開
113     "AddFunc",
114     "SubFunc",
115     "MulFunc",
116     "DivFunc"
117 };
118 /*----------------定義支持庫命令參數表-----------------------*/
119 ARG_INFO AddFunc_CommandArgs[] =
120 {
121     //函數參數數組定義寫在這里,每個{}為一個參數的表述,用逗號隔開
122     /* { 參數名稱, 參數描述, 圖像索引, 圖像數量, 參數類型(參見SDT_), 默認數值, 參數類別(參見AS_) } */
123     { _WT("arg1"), _WT("arg1"), 0, 0, SDT_INT, NULL, NULL },
124     { _WT("arg2"), _WT("arg2"), 0, 0, SDT_INT, NULL, NULL }
125 };
126 ARG_INFO SubFunc_CommandArgs[] =
127 {
128     //函數參數數組定義寫在這里,每個{}為一個參數的表述,用逗號隔開
129     /* { 參數名稱, 參數描述, 圖像索引, 圖像數量, 參數類型(參見SDT_), 默認數值, 參數類別(參見AS_) } */
130     { _WT("arg1"), _WT("arg1"), 0, 0, SDT_INT, NULL, NULL },
131     { _WT("arg2"), _WT("arg2"), 0, 0, SDT_INT, NULL, NULL }
132 };
133 ARG_INFO MulFunc_CommandArgs[] =
134 {
135     //函數參數數組定義寫在這里,每個{}為一個參數的表述,用逗號隔開
136     /* { 參數名稱, 參數描述, 圖像索引, 圖像數量, 參數類型(參見SDT_), 默認數值, 參數類別(參見AS_) } */
137     { _WT("arg1"), _WT("arg1"), 0, 0, SDT_INT, NULL, NULL },
138     { _WT("arg2"), _WT("arg2"), 0, 0, SDT_INT, NULL, NULL }
139 };
140 ARG_INFO DivFunc_CommandArgs[] =
141 {
142     //函數參數數組定義寫在這里,每個{}為一個參數的表述,用逗號隔開
143     /* { 參數名稱, 參數描述, 圖像索引, 圖像數量, 參數類型(參見SDT_), 默認數值, 參數類別(參見AS_) } */
144     { _WT("arg1"), _WT("arg1"), 0, 0, SDT_INT, NULL, NULL },
145     { _WT("arg2"), _WT("arg2"), 0, 0, SDT_INT, NULL, NULL }
146 };
147 
148 /*---------------聲明要導出的支持庫命令----------------------*/
149 static CMD_INFO Commands[] =
150 {
151     /* { 中文名稱, 英文名稱, 對象描述, 所屬類別(-1是數據類型的方法), 命令狀態(CT_), 返回類型(SDT_), 此值保留, 對象等級(LVL_), 圖像索引, 圖像數量, 參數個數, 參數信息 } */
152 
153     //{ _WT("GetAmongText"), _WT("取關鍵詞間文本"), _WT("截取兩個關鍵詞之間的文本"), 1,NULL, SDT_TEXT, 0, LVL_SECONDARY,0,0, 5, fnGetAmongstr_CommandArgs } ,
154 
155     { _WT("ELIB_加法"), _WT("AddFunc"), _WT("加法運算 返回類型整數型"), 1, NULL, SDT_INT, 0, LVL_SIMPLE, 0, 0, 2, AddFunc_CommandArgs },
156     { _WT("ELIB_減法"), _WT("SubFunc"), _WT("減法運算 返回類型整數型"), 1, NULL, SDT_INT, 0, LVL_SIMPLE, 0, 0, 2, SubFunc_CommandArgs },
157     { _WT("ELIB_乘法"), _WT("MulFunc"), _WT("乘法運算 返回類型整數型"), 1, NULL, SDT_INT, 0, LVL_SIMPLE, 0, 0, 2, MulFunc_CommandArgs },
158     { _WT("ELIB_除法"), _WT("DivFunc"), _WT("除法運算 返回類型整數型"), 1, NULL, SDT_INT, 0, LVL_SIMPLE, 0, 0, 2, DivFunc_CommandArgs },
159 
160 
161 };
162 
163 #endif
164 /*-----------------支持庫消息處理函數------------------*/
165 
166 EXTERN_C INT WINAPI ELIB_MessageNotify(INT nMsg, DWORD dwParam1, DWORD dwParam2)
167 {
168 #ifndef __E_STATIC_LIB
169     if (nMsg == NL_GET_CMD_FUNC_NAMES) // 返回所有命令實現函數的的函數名稱數組(char*[]), 支持靜態編譯的動態庫必須處理
170         return (INT)CommandNames;
171     else if (nMsg == NL_GET_NOTIFY_LIB_FUNC_NAME) // 返回處理系統通知的函數名稱(PFN_NOTIFY_LIB函數名稱), 支持靜態編譯的動態庫必須處理
172         return (INT)LIBARAYNAME;
173     else if (nMsg == NL_GET_DEPENDENT_LIBS) return (INT)NULL;
174     // 返回靜態庫所依賴的其它靜態庫文件名列表(格式為\0分隔的文本,結尾兩個\0), 支持靜態編譯的動態庫必須處理
175     // kernel32.lib user32.lib gdi32.lib 等常用的系統庫不需要放在此列表中
176     // 返回NULL或NR_ERR表示不指定依賴文件  
177 #endif
178     return ProcessNotifyLib(nMsg, dwParam1, dwParam2);
179 }
180 /*定義支持庫基本信息*/
181 #ifndef __E_STATIC_LIB
182 static LIB_INFO LibInfo =
183 {
184     /* { 庫格式號, GUID串號, 主版本號, 次版本號, 構建版本號, 系統主版本號, 系統次版本號, 核心庫主版本號, 核心庫次版本號,
185     支持庫名, 支持庫語言, 支持庫描述, 支持庫狀態,
186     作者姓名, 郵政編碼, 通信地址, 電話號碼, 傳真號碼, 電子郵箱, 主頁地址, 其它信息,
187     類型數量, 類型指針, 類別數量, 命令類別, 命令總數, 命令指針, 命令入口,
188     附加功能, 功能描述, 消息指針, 超級模板, 模板描述,
189     常量數量, 常量指針, 外部文件} */
190     LIB_FORMAT_VER,
191     _T(LIB_GUID_STR),
192     LIB_MajorVersion,
193     LIB_MinorVersion,
194     LIB_BuildNumber,
195     LIB_SysMajorVer,
196     LIB_SysMinorVer,
197     LIB_KrnlLibMajorVer,
198     LIB_KrnlLibMinorVer,
199     _T(LIB_NAME_STR),
200     __GBK_LANG_VER,
201     _WT(LIB_DESCRIPTION_STR),
202     _LIB_OS(__OS_WIN),
203     _WT(LIB_Author),
204     _WT(LIB_ZipCode),
205     _WT(LIB_Address),
206     _WT(LIB_Phone),
207     _WT(LIB_Fax),
208     _WT(LIB_Email),
209     _WT(LIB_HomePage),
210     _WT(LIB_Other),
211     sizeof(DataTypes) / sizeof(DataTypes[0]),
212     DataTypes,
213     LIB_TYPE_COUNT,
214     _WT(LIB_TYPE_STR),
215     sizeof(Commands) / sizeof(Commands[0]),
216     Commands,
217     ExecuteCommand,
218     NULL,
219     NULL,
220     ELIB_MessageNotify,
221     NULL,
222     NULL,
223     sizeof(constStruct) / sizeof(constStruct[0]),
224     constStruct,
225     NULL
226 };
227 PLIB_INFO WINAPI GetNewInf()
228 {
229     return (&LibInfo);
230 };
231 #endif
Elibfne.cpp

編譯生成完以后分別把.fne和靜態庫文件復制到易語言lib目錄和static_lib目錄下即可

復制到易語言安裝目錄下的lib目前下

復制到易語言安裝目錄下的static_lib目前下

 

打開易語言選擇你剛添加的支持庫測試即可

 

 

 測試結果可用

 

 也可以下載 當前項目 鏈接: https://share.weiyun.com/51Z3Bxn (密碼:bCDD)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM