0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

英创信息技术WinCE设备动态链接库的制作与调用

英创信息技术 来源:英创信息技术 作者:英创信息技术 2020-01-15 14:33 次阅读

在使用英创ARM9系列主板做开发时,用户可能希望将自己一部分代码封装起来,隐藏代码的实现过程,只提供接口供其他程序调用。使用动态链接库(Dynamic Link Library)可以很好实现这个要求。本文将介绍如何使用VS2005制作WINCE下设备使用的动态链接库,以及动态链接库的使用和调试方法。

1、制作动态链接库

通过向导创建动态链接库的工程。

1、新建工程,选择C语言->智能设备->Win32智能设备工程,并填入自己工程的名字,这里为hellodll,点击OK按钮。

在平台选项栏中,选择动态链接库对应的开发平台,这里选择为EM9170。

在工程选项中,选择工程的类型为dll动态链接库,这里可以勾选Export symbols选项,新建工程会带有一些示例代码。

打开头文件hellodll.h,可以发现工程向导已经自动添加了一个类,变量和一个方法的例子了。

// 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的登录函数。

// HELLODLL_API BOOL login(LPCWSTR user,LPCWSTR pass);
extern 'C' HELLODLL_API BOOL login(LPCWSTR user,LPCWSTR pass);

注意:这里使用了extern 'C',应为希望编译器以C的方式编译,因为C里面没有函数重载,所以函数的名称不会更改,即DLL入口名称依然为login,如果以C++的方式编译,编译器会给函数前后加上返回类型和参数类型的符号,入口名称会变化为类似?login@@YAHPB_W0@Z这样的名称,调用起来会麻烦一些。使用vs2005自带的depends.exe工具可以查看dll的信息

3、在hellodll.cpp中编写他的实现代码。

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、编译工程,工程目录下会生成相应的dll和lib文件,这里生成的为hellodll.dll和hellodll.lib。

2、C程序调用方法

新建C工程,调用之前制作的动态链接库,测试是否成功。这里创建的是一个win32的命令行程序test_dll,在C里调用dll,有两种方法可以使用。

静态调用

静态调用简单方便。

1、把动态链接库工程的hellodll.h文件和hellodll.lib文件拷贝到测试工程的工程目录下。

2、将动态链接库的头文件hellodll.h文件,添加到工程中。

3、在工程的链接选项中,添加hellodll.lib。

4、这样,引入头文件,即可直接调用该动态链接库的方法了,完整代码如下。

#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;
}

动态调用

动态调用更加灵活,可以判断dll的加载状况,从而做出相应处理。

1、使用LoadLibrary加载动态链接库。

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

2、使用GetProcAddress函数来获得动态链接库方法的函数指针。

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

3、使用完毕后,用FreeLibrary卸载动态链接库。

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函数失败', L'test_dll', MB_OK);
return 0;
}
BOOL b;
b = pFun(L'admin',L'admin');
// 返回TRUE
FreeLibrary(hModule);
return 0;
}

3、C#程序调用方法

新建一个C#工程,将dll添加进工程。

添加引用。

using System.Runtime.InteropServices;

定义好相应的接口,注意将参数设置正确。

[DllImport('hellodll.dll', EntryPoint = 'login', SetLastError = true, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Winapi)]
public static extern bool login(string user, string pass);

然后就可以在任何地方调用该接口了,完整代码如下。

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、动态调试库的调试方法

设置动态链接库hellodll工程选项,选择调试运行的exe名字及路径,这里选择为测试程序test_dll.exe编译部署的位置。

选择dll部署到NandFlash目录。

设置好断点,点击运行,当指定程序test_dll.exe调用到动态链接库时,既能触发断点。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • WINDOWS
    +关注

    关注

    3

    文章

    3524

    浏览量

    88399
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6085

    浏览量

    35198
收藏 人收藏

    评论

    相关推荐

    安卓动态链接库文件体积优化探索实践

    诸多方面影响,针对dex、资源文件、so文件都有不同的优化策略,在此不做一一展开,本文主要记录了在研发时针对动态链接库的文件体积裁剪优化方案。 我开发的链接库使用rust语言开发,通过安卓jni接口实现java层和native层
    的头像 发表于 11-21 14:07 48次阅读

    中科达荣获2024年软件和信息技术服务优秀企业

    及前百家企业”名单。中科达凭借非凡的技术实力与持续的创新能力,成功入选“2024年度软件和信息技术服务竞争力百强企业”以及“2024年软件和信息技术服务优秀企业”。
    的头像 发表于 10-30 11:44 372次阅读

    国产化背景下的工控主板发展现状

    ,是信息技术应用创新产业的简称,于2016年“信工委会”(信息技术应用创新工作委员会)提出,目的就是要推动我们国内软硬件关键技术的研发
    的头像 发表于 09-21 16:15 317次阅读

    加速鲲鹏落地!拓维信息迁移工具荣获鲲鹏原生开发技术认证

    认证。图/拓维·数据适配中间件取得鲲鹏原生开发N认证在数字化时代的大潮中,信战略作为国家推动信息技术应用创新、保障信息安全与自主可控的关键举措,其重要性日益凸显
    的头像 发表于 09-10 08:03 386次阅读
    加速鲲鹏落地!拓维<b class='flag-5'>信息</b>信<b class='flag-5'>创</b>迁移工具荣获鲲鹏原生开发<b class='flag-5'>技术</b>认证

    梯度科技入选2023年信息技术应用创新解决方案名单

    日前,工业和信息化部网络安全产业发展中心(工业和信息化部信息中心)在天津举办2024信息技术应用创新发展大会暨解决方案应用推广大会。会上正式公布了2023年
    的头像 发表于 09-09 16:29 384次阅读

    嵌入式学习-静态链接动态链接

    会发现,so文件里全是乱码,这就是使用动态链接库的一个好处,可以防止核心算法的泄露。现在就可以将mymath.c删除掉了:直接调用编译发现程序不能运行。下面将我们自己建立的
    发表于 08-28 09:33

    静态链接动态链接

    的时候会发现,so文件里全是乱码,这就是使用动态链接库的一个好处,可以防止核心算法的泄露。 现在就可以将mymath.c删除掉了: 直接调用编译发现程序不能运行。 下面将我们自己建立
    发表于 08-27 10:20

    芯盾时代中标西安西热电站信息技术有限公司!

    芯盾时代中标西安西热电站信息技术有限公司!芯盾时代基于完整的身份安全产品体系,增强客户的业务系统、网络设备和安全设备等认证安全强度
    的头像 发表于 04-09 11:32 465次阅读

    两种linux系统下常见的HOOK方法

    Linux提供了一个名为LD_PRELOAD的环境变量。这个环境变量允许用户指定一个或多个共享链接库文件的路径。当程序启动时,动态加载器会在加载C语言运行库之前,首先加载LD_PRELOAD所指定的共享链接库。这种加载方式被称为
    发表于 04-08 11:26 3936次阅读
    两种linux系统下常见的HOOK方法

    EtherCAT运动控制器在ROS上的应用开发案例(下)

    本篇文章我们主要介绍正运动技术动态链接库环境配置以及EtherCAT运动控制器在ROS下的单轴运动。
    的头像 发表于 03-17 11:11 856次阅读
    EtherCAT运动控制器在ROS上的应用开发案例(下)

    基于物联网、大数据、云计算等现代信息技术高速公路智慧消防平台解决方案

    安科瑞 程瑜 系统简介 1、概述 智慧消防云平台基于物联网、大数据、云计算等现代信息技术,将分散的火灾自动报警设备、电气火灾监控设备、智慧烟感探测器、智慧消防用水等设备连接形成网络,并
    的头像 发表于 03-15 14:20 405次阅读
    基于物联网、大数据、云计算等现代<b class='flag-5'>信息技术</b>高速公路智慧消防平台解决方案

    EtherCAT运动控制器在ROS上的应用(下)

    正运动技术动态链接库环境配置以及EtherCAT运动控制器在ROS下的单轴运动。
    的头像 发表于 03-13 14:54 518次阅读
    EtherCAT运动控制器在ROS上的应用(下)

    龙芯中科三项信方案入围工信部2023年信息技术应用创新应用示范案例名单

    近日,工业和信息化部通报了2023年信息技术应用创新解决方案征集遴选结果,本次共评选出典型解决方案173个、应用示范案例83个、单项创新案例64个。
    的头像 发表于 03-07 16:45 854次阅读
    龙芯中科三项信<b class='flag-5'>创</b>方案入围工信部2023年<b class='flag-5'>信息技术</b>应用创新应用示范案例名单

    phpy:PHP与Python互调用

    phpy 是识沃团队最新推出的开源项目,目标是为 PHP 引入 Python 生态,来弥补 PHP 生态的空缺和不足。phpy 使得 PHP 可以调用所有 Python 的包。 包括当下非常流行
    的头像 发表于 12-12 10:43 979次阅读
    phpy:PHP与Python互<b class='flag-5'>调用</b><b class='flag-5'>库</b>

    LabVIEW程序中包含.net和C++dll的注意事项简介

    LabVIEW的VI调用.NET程序集或者C++动态链接库时的关系图如下
    的头像 发表于 12-11 09:22 1286次阅读
    LabVIEW程序中包含.net和C++dll的注意事项简介