0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

英創(chuàng)信息技術(shù)WinCE設(shè)備動(dòng)態(tài)鏈接庫的制作與調(diào)用

英創(chuàng)信息技術(shù) ? 來源:英創(chuàng)信息技術(shù) ? 作者:英創(chuàng)信息技術(shù) ? 2020-01-15 14:33 ? 次閱讀

在使用英創(chuàng)ARM9系列主板做開發(fā)時(shí),用戶可能希望將自己一部分代碼封裝起來,隱藏代碼的實(shí)現(xiàn)過程,只提供接口供其他程序調(diào)用。使用動(dòng)態(tài)鏈接庫(Dynamic Link Library)可以很好實(shí)現(xiàn)這個(gè)要求。本文將介紹如何使用VS2005制作WINCE下設(shè)備使用的動(dòng)態(tài)鏈接庫,以及動(dòng)態(tài)鏈接庫的使用和調(diào)試方法。

1、制作動(dòng)態(tài)鏈接庫

通過向?qū)?chuàng)建動(dòng)態(tài)鏈接庫的工程。

1、新建工程,選擇C語言->智能設(shè)備->Win32智能設(shè)備工程,并填入自己工程的名字,這里為hellodll,點(diǎn)擊OK按鈕。

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

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

打開頭文件hellodll.h,可以發(fā)現(xiàn)工程向?qū)б呀?jīng)自動(dòng)添加了一個(gè)類,變量和一個(gè)方法的例子了。

// 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、添加自定義的方法,這里添加一個(gè)名為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的方式編譯,因?yàn)镃里面沒有函數(shù)重載,所以函數(shù)的名稱不會(huì)更改,即DLL入口名稱依然為login,如果以C++的方式編譯,編譯器會(huì)給函數(shù)前后加上返回類型和參數(shù)類型的符號(hào),入口名稱會(huì)變化為類似?login@@YAHPB_W0@Z這樣的名稱,調(diào)用起來會(huì)麻煩一些。使用vs2005自帶的depends.exe工具可以查看dll的信息

3、在hellodll.cpp中編寫他的實(shí)現(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,那么會(huì)彈出消息框并返回TRUE。

4、編譯工程,工程目錄下會(huì)生成相應(yīng)的dll和lib文件,這里生成的為hellodll.dll和hellodll.lib。

2、C程序調(diào)用方法

新建C工程,調(diào)用之前制作的動(dòng)態(tài)鏈接庫,測(cè)試是否成功。這里創(chuàng)建的是一個(gè)win32的命令行程序test_dll,在C里調(diào)用dll,有兩種方法可以使用。

靜態(tài)調(diào)用

靜態(tài)調(diào)用簡單方便。

1、把動(dòng)態(tài)鏈接庫工程的hellodll.h文件和hellodll.lib文件拷貝到測(cè)試工程的工程目錄下。

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

3、在工程的鏈接選項(xiàng)中,添加hellodll.lib。

4、這樣,引入頭文件,即可直接調(diào)用該動(dòng)態(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;
}

動(dòng)態(tài)調(diào)用

動(dòng)態(tài)調(diào)用更加靈活,可以判斷dll的加載狀況,從而做出相應(yīng)處理。

1、使用LoadLibrary加載動(dòng)態(tài)鏈接庫。

HINSTANCE hModule = LoadLibrary(L'hellodll.dll');

2、使用GetProcAddress函數(shù)來獲得動(dòng)態(tài)鏈接庫方法的函數(shù)指針。

typedef BOOL (CALLBACK *pLogin)(LPCWSTR, LPCWSTR);
pLogin pFun = (pLogin)GetProcAddress(hModule, L'login');

3、使用完畢后,用FreeLibrary卸載動(dòng)態(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)用方法

新建一個(gè)C#工程,將dll添加進(jìn)工程。

添加引用。

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、動(dòng)態(tài)調(diào)試庫的調(diào)試方法

設(shè)置動(dòng)態(tài)鏈接庫hellodll工程選項(xiàng),選擇調(diào)試運(yùn)行的exe名字及路徑,這里選擇為測(cè)試程序test_dll.exe編譯部署的位置。

選擇dll部署到NandFlash目錄。

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • WINDOWS
    +關(guān)注

    關(guān)注

    3

    文章

    3510

    瀏覽量

    88238
  • 嵌入式主板
    +關(guān)注

    關(guān)注

    7

    文章

    6083

    瀏覽量

    35117
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    創(chuàng)國產(chǎn)化背景下的工控主板發(fā)展現(xiàn)狀

    創(chuàng),是信息技術(shù)應(yīng)用創(chuàng)新產(chǎn)業(yè)的簡稱,于2016年“信創(chuàng)工委會(huì)”(信息技術(shù)應(yīng)用創(chuàng)新工作委員會(huì))提出,目的就是要推動(dòng)我們國內(nèi)軟硬件關(guān)鍵技術(shù)的研發(fā)
    的頭像 發(fā)表于 09-21 16:15 ?229次閱讀

    加速鯤鵬落地!拓維信息創(chuàng)遷移工具榮獲鯤鵬原生開發(fā)技術(shù)認(rèn)證

    認(rèn)證。圖/拓維·數(shù)據(jù)適配中間件取得鯤鵬原生開發(fā)N認(rèn)證在數(shù)字化時(shí)代的大潮中,信創(chuàng)戰(zhàn)略作為國家推動(dòng)信息技術(shù)應(yīng)用創(chuàng)新、保障信息安全與自主可控的關(guān)鍵舉措,其重要性日益凸顯
    的頭像 發(fā)表于 09-10 08:03 ?336次閱讀
    加速鯤鵬落地!拓維<b class='flag-5'>信息</b>信<b class='flag-5'>創(chuàng)</b>遷移工具榮獲鯤鵬原生開發(fā)<b class='flag-5'>技術(shù)</b>認(rèn)證

    梯度科技入選2023年信息技術(shù)應(yīng)用創(chuàng)新解決方案名單

    日前,工業(yè)和信息化部網(wǎng)絡(luò)安全產(chǎn)業(yè)發(fā)展中心(工業(yè)和信息化部信息中心)在天津舉辦2024信息技術(shù)應(yīng)用創(chuàng)新發(fā)展大會(huì)暨解決方案應(yīng)用推廣大會(huì)。會(huì)上正式公布了2023年
    的頭像 發(fā)表于 09-09 16:29 ?333次閱讀

    嵌入式學(xué)習(xí)-靜態(tài)鏈接動(dòng)態(tài)鏈接

    會(huì)發(fā)現(xiàn),so文件里全是亂碼,這就是使用動(dòng)態(tài)鏈接庫的一個(gè)好處,可以防止核心算法的泄露。現(xiàn)在就可以將mymath.c刪除掉了:直接調(diào)用編譯發(fā)現(xiàn)程序不能運(yùn)行。下面將我們自己建立的
    發(fā)表于 08-28 09:33

    靜態(tài)鏈接動(dòng)態(tài)鏈接

    的時(shí)候會(huì)發(fā)現(xiàn),so文件里全是亂碼,這就是使用動(dòng)態(tài)鏈接庫的一個(gè)好處,可以防止核心算法的泄露。 現(xiàn)在就可以將mymath.c刪除掉了: 直接調(diào)用編譯發(fā)現(xiàn)程序不能運(yùn)行。 下面將我們自己建立
    發(fā)表于 08-27 10:20

    芯盾時(shí)代中標(biāo)西安西熱電站信息技術(shù)有限公司!

    芯盾時(shí)代中標(biāo)西安西熱電站信息技術(shù)有限公司!芯盾時(shí)代基于完整的身份安全產(chǎn)品體系,增強(qiáng)客戶的業(yè)務(wù)系統(tǒng)、網(wǎng)絡(luò)設(shè)備和安全設(shè)備等認(rèn)證安全強(qiáng)度
    的頭像 發(fā)表于 04-09 11:32 ?420次閱讀

    兩種linux系統(tǒng)下常見的HOOK方法

    Linux提供了一個(gè)名為LD_PRELOAD的環(huán)境變量。這個(gè)環(huán)境變量允許用戶指定一個(gè)或多個(gè)共享鏈接庫文件的路徑。當(dāng)程序啟動(dòng)時(shí),動(dòng)態(tài)加載器會(huì)在加載C語言運(yùn)行庫之前,首先加載LD_PRELOAD所指定的共享鏈接庫。這種加載方式被稱為
    發(fā)表于 04-08 11:26 ?3610次閱讀
    兩種linux系統(tǒng)下常見的HOOK方法

    EtherCAT運(yùn)動(dòng)控制器在ROS上的應(yīng)用開發(fā)案例(下)

    本篇文章我們主要介紹正運(yùn)動(dòng)技術(shù)動(dòng)態(tài)鏈接庫環(huán)境配置以及EtherCAT運(yùn)動(dòng)控制器在ROS下的單軸運(yùn)動(dòng)。
    的頭像 發(fā)表于 03-17 11:11 ?799次閱讀
    EtherCAT運(yùn)動(dòng)控制器在ROS上的應(yīng)用開發(fā)案例(下)

    基于物聯(lián)網(wǎng)、大數(shù)據(jù)、云計(jì)算等現(xiàn)代信息技術(shù)高速公路智慧消防平臺(tái)解決方案

    安科瑞 程瑜 系統(tǒng)簡介 1、概述 智慧消防云平臺(tái)基于物聯(lián)網(wǎng)、大數(shù)據(jù)、云計(jì)算等現(xiàn)代信息技術(shù),將分散的火災(zāi)自動(dòng)報(bào)警設(shè)備、電氣火災(zāi)監(jiān)控設(shè)備、智慧煙感探測(cè)器、智慧消防用水等設(shè)備連接形成網(wǎng)絡(luò),并
    的頭像 發(fā)表于 03-15 14:20 ?379次閱讀
    基于物聯(lián)網(wǎng)、大數(shù)據(jù)、云計(jì)算等現(xiàn)代<b class='flag-5'>信息技術(shù)</b>高速公路智慧消防平臺(tái)解決方案

    EtherCAT運(yùn)動(dòng)控制器在ROS上的應(yīng)用(下)

    正運(yùn)動(dòng)技術(shù)動(dòng)態(tài)鏈接庫環(huán)境配置以及EtherCAT運(yùn)動(dòng)控制器在ROS下的單軸運(yùn)動(dòng)。
    的頭像 發(fā)表于 03-13 14:54 ?461次閱讀
    EtherCAT運(yùn)動(dòng)控制器在ROS上的應(yīng)用(下)

    龍芯中科三項(xiàng)信創(chuàng)方案入圍工信部2023年信息技術(shù)應(yīng)用創(chuàng)新應(yīng)用示范案例名單

    近日,工業(yè)和信息化部通報(bào)了2023年信息技術(shù)應(yīng)用創(chuàng)新解決方案征集遴選結(jié)果,本次共評(píng)選出典型解決方案173個(gè)、應(yīng)用示范案例83個(gè)、單項(xiàng)創(chuàng)新案例64個(gè)。
    的頭像 發(fā)表于 03-07 16:45 ?772次閱讀
    龍芯中科三項(xiàng)信<b class='flag-5'>創(chuàng)</b>方案入圍工信部2023年<b class='flag-5'>信息技術(shù)</b>應(yīng)用創(chuàng)新應(yīng)用示范案例名單

    phpy:PHP與Python互調(diào)用

    phpy 是識(shí)沃團(tuán)隊(duì)最新推出的開源項(xiàng)目,目標(biāo)是為 PHP 引入 Python 生態(tài),來彌補(bǔ) PHP 生態(tài)的空缺和不足。phpy 使得 PHP 可以調(diào)用所有 Python 的包。 包括當(dāng)下非常流行
    的頭像 發(fā)表于 12-12 10:43 ?942次閱讀
    phpy:PHP與Python互<b class='flag-5'>調(diào)用</b><b class='flag-5'>庫</b>

    LabVIEW程序中包含.net和C++dll的注意事項(xiàng)簡介

    LabVIEW的VI調(diào)用.NET程序集或者C++動(dòng)態(tài)鏈接庫時(shí)的關(guān)系圖如下
    的頭像 發(fā)表于 12-11 09:22 ?1179次閱讀
    LabVIEW程序中包含.net和C++dll的注意事項(xiàng)簡介

    闡述量子信息技術(shù)的研究現(xiàn)狀與未來

    20世紀(jì) 80 年代, 科學(xué)家將量子力學(xué)應(yīng)用到信息領(lǐng)域, 從而誕生了量子信息技術(shù), 諸如量子計(jì)算機(jī)、量子密碼、量子傳感等. 這些技術(shù)的運(yùn)行規(guī)律遵從量子力學(xué), 因此不僅其原理是量子力學(xué), 器件本身也
    發(fā)表于 11-22 11:40 ?742次閱讀
    闡述量子<b class='flag-5'>信息技術(shù)</b>的研究現(xiàn)狀與未來

    Linux下動(dòng)態(tài)相關(guān)知識(shí)

    Linux 下有動(dòng)態(tài)和靜態(tài)動(dòng)態(tài)以.so為擴(kuò)展名,靜態(tài)以.a為擴(kuò)展名。二者都使用廣泛。本
    的頭像 發(fā)表于 11-07 09:23 ?529次閱讀
    Linux下<b class='flag-5'>動(dòng)態(tài)</b><b class='flag-5'>庫</b>相關(guān)知識(shí)