在使用英創(chuàng)ARM9系列主板做開發(fā)時,用戶可能希望將自己一部分代碼封裝起來,隱藏代碼的實現(xiàn)過程,只提供接口供其他程序調(diào)用。使用動態(tài)鏈接庫(Dynamic Link Library)可以很好實現(xiàn)這個要求。本文將介紹如何使用VS2005制作WINCE下設(shè)備使用的動態(tài)鏈接庫,以及動態(tài)鏈接庫的使用和調(diào)試方法。
1、制作動態(tài)鏈接庫
通過向?qū)?chuàng)建動態(tài)鏈接庫的工程。
1、新建工程,選擇C語言->智能設(shè)備->Win32智能設(shè)備工程,并填入自己工程的名字,這里為hellodll,點擊OK按鈕。

在平臺選項欄中,選擇動態(tài)鏈接庫對應(yīng)的開發(fā)平臺,這里選擇為EM9170。

在工程選項中,選擇工程的類型為dll動態(tài)鏈接庫,這里可以勾選Export symbols選項,新建工程會帶有一些示例代碼。

打開頭文件hellodll.h,可以發(fā)現(xiàn)工程向?qū)б呀?jīng)自動添加了一個類,變量和一個方法的例子了。
// This class is exported from the hellodll.dll
class HELLODLL_API Chellodll {
public:
Chellodll(void);
// TODO: add your methods here.
};
extern HELLODLL_API int nhellodll;
HELLODLL_API int fnhellodll(void);
2、添加自定義的方法,這里添加一個名為login的登錄函數(shù)。
// HELLODLL_API BOOL login(LPCWSTR user,LPCWSTR pass);
extern 'C' HELLODLL_API BOOL login(LPCWSTR user,LPCWSTR pass);
注意:這里使用了extern 'C',應(yīng)為希望編譯器以C的方式編譯,因為C里面沒有函數(shù)重載,所以函數(shù)的名稱不會更改,即DLL入口名稱依然為login,如果以C++的方式編譯,編譯器會給函數(shù)前后加上返回類型和參數(shù)類型的符號,入口名稱會變化為類似?login@@YAHPB_W0@Z這樣的名稱,調(diào)用起來會麻煩一些。使用vs2005自帶的depends.exe工具可以查看dll的信息。

3、在hellodll.cpp中編寫他的實現(xiàn)代碼。
HELLODLL_API BOOL login(LPCWSTR user,LPCWSTR pass)
{
if (wcsicmp(user,L'admin')==0)
{
MessageBox(NULL,user,L'user',MB_OK);
}
if (wcsicmp(pass,L'admin')==0)
{
MessageBox(NULL,pass,L'pass',MB_OK);
}
return (wcsicmp(user,L'admin')==0) && (wcsicmp(pass,L'admin')==0);
}
如果用戶名和密碼都是admin,那么會彈出消息框并返回TRUE。
4、編譯工程,工程目錄下會生成相應(yīng)的dll和lib文件,這里生成的為hellodll.dll和hellodll.lib。
2、C程序調(diào)用方法
新建C工程,調(diào)用之前制作的動態(tài)鏈接庫,測試是否成功。這里創(chuàng)建的是一個win32的命令行程序test_dll,在C里調(diào)用dll,有兩種方法可以使用。

靜態(tài)調(diào)用
靜態(tài)調(diào)用簡單方便。
1、把動態(tài)鏈接庫工程的hellodll.h文件和hellodll.lib文件拷貝到測試工程的工程目錄下。

2、將動態(tài)鏈接庫的頭文件hellodll.h文件,添加到工程中。

3、在工程的鏈接選項中,添加hellodll.lib。

4、這樣,引入頭文件,即可直接調(diào)用該動態(tài)鏈接庫的方法了,完整代碼如下。
#include 'stdafx.h'
#include
#include
#include 'hellodll.h'
int _tmain(int argc, _TCHAR* argv[])
{
BOOL b;
b = login(L'admin',L'admin');
// 返回TRUE
return 0;
}
動態(tài)調(diào)用
動態(tài)調(diào)用更加靈活,可以判斷dll的加載狀況,從而做出相應(yīng)處理。
1、使用LoadLibrary加載動態(tài)鏈接庫。
HINSTANCE hModule = LoadLibrary(L'hellodll.dll');
2、使用GetProcAddress函數(shù)來獲得動態(tài)鏈接庫方法的函數(shù)指針。
typedef BOOL (CALLBACK *pLogin)(LPCWSTR, LPCWSTR);
pLogin pFun = (pLogin)GetProcAddress(hModule, L'login');
3、使用完畢后,用FreeLibrary卸載動態(tài)鏈接庫。
FreeLibrary(hModule);
完整代碼如下。
#include 'stdafx.h'
#include
#include
#include 'hellodll.h'
typedef BOOL (CALLBACK *pLogin)(LPCWSTR, LPCWSTR);
int _tmain(int argc, _TCHAR* argv[])
{
HINSTANCE hModule = LoadLibrary(L'hellodll.dll');
if(hModule == NULL)
{
MessageBox(NULL, L'加載dll失敗', L'test_dll', MB_OK);
return 0;
}
pLogin pFun = (pLogin)GetProcAddress(hModule, L'login');
if (pFun == NULL)
{
MessageBox(NULL, L'獲取login函數(shù)失敗', L'test_dll', MB_OK);
return 0;
}
BOOL b;
b = pFun(L'admin',L'admin');
// 返回TRUE
FreeLibrary(hModule);
return 0;
}
3、C#程序調(diào)用方法
新建一個C#工程,將dll添加進工程。

添加引用。
using System.Runtime.InteropServices;
定義好相應(yīng)的接口,注意將參數(shù)設(shè)置正確。
[DllImport('hellodll.dll', EntryPoint = 'login', SetLastError = true, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Winapi)]
public static extern bool login(string user, string pass);
然后就可以在任何地方調(diào)用該接口了,完整代碼如下。
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace test_dll_CSharp
{
class Program
{
[DllImport('hellodll.dll', EntryPoint = 'login', SetLastError = true, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Winapi)]
public static extern bool login(string user, string pass);
static void Main(string[] args)
{
bool b;
b = login('admin', 'admin');
}
}
}
4、動態(tài)調(diào)試庫的調(diào)試方法
設(shè)置動態(tài)鏈接庫hellodll工程選項,選擇調(diào)試運行的exe名字及路徑,這里選擇為測試程序test_dll.exe編譯部署的位置。

選擇dll部署到NandFlash目錄。

設(shè)置好斷點,點擊運行,當指定程序test_dll.exe調(diào)用到動態(tài)鏈接庫時,既能觸發(fā)斷點。

-
WINDOWS
+關(guān)注
關(guān)注
4文章
3705瀏覽量
94295 -
嵌入式主板
+關(guān)注
關(guān)注
7文章
6107瀏覽量
37147
發(fā)布評論請先 登錄
瀚高數(shù)據(jù)庫深度參編國家標準《信息技術(shù) 云原生關(guān)系數(shù)據(jù)庫管理系統(tǒng)技術(shù)要求》正式發(fā)布
龍芯中科攜手五所高校加速構(gòu)建自主信息技術(shù)人才體系
龍芯中科成功舉辦2025信息技術(shù)應(yīng)用創(chuàng)新產(chǎn)教融合交流會
龍芯中科助力2025教育信息技術(shù)應(yīng)用創(chuàng)新大賽成功舉辦
誠邁科技信創(chuàng)電腦助力2025第二屆教育信息技術(shù)應(yīng)用創(chuàng)新大賽圓滿收官
Python調(diào)用API教程
寶馬南京信息技術(shù)有限公司開業(yè)
飛凌嵌入式ElfBoard-Vim編輯器之靜態(tài)鏈接和動態(tài)鏈接
易華錄入選國家級信息技術(shù)應(yīng)用創(chuàng)新典型解決方案
佛瑞亞如何通過信息技術(shù)推動業(yè)務(wù)增長
飛騰主板為信創(chuàng)產(chǎn)業(yè)發(fā)展提高硬實力
DEKRA德凱成為沙特通信和信息技術(shù)設(shè)備技術(shù)法規(guī)認證機構(gòu)
科普|信創(chuàng)是什么?一文讀懂“信息技術(shù)應(yīng)用創(chuàng)新”戰(zhàn)略
英創(chuàng)信息技術(shù)WinCE設(shè)備動態(tài)鏈接庫的制作與調(diào)用
評論