千家信息网

如何浅析C++动态加载DLL在Windows Mobile下实现

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,如何浅析C++动态加载DLL在Windows Mobile下实现,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。静态加载D
千家信息网最后更新 2026年11月01日如何浅析C++动态加载DLL在Windows Mobile下实现

如何浅析C++动态加载DLL在Windows Mobile下实现,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

静态加载DLL的方法

使用Native C++的开发,一般使用静态加载的方法加载DLL,所谓静态加载就是在程序编译时(Compile Time)直接调用DLL的头文件定义的函数,链接时(Link Time)链接*.lib文件指向DLL的接口,在程序开始运行时(Run Time Start up)加载DLL。

下面讲述使用静态加载DLL的方法,在程序中需要指定加载的*.lib文件,用于链接(Link)。

#pragma comment(lib, "SamsungMobileSDK_1.lib")

使用静态加载的DLL可以直接调用头文件定义的函数,例如:

SmiAccelerometerCapabilities cap;if( SmiAccelerometerGetCapabilities(&cap) != SMI_SUCCESS){    throw;}SmiAccelerometerHandler h = &GetVectorHandler;if(SmiAccelerometerRegisterHandler(1000, h) != SMI_SUCCESS){    throw;}

SmiAccelerometerGetCapabilities()和SmiAccelerometerRegisterHandler()是定义在头文件smiAccelerometer.h中的,可以直接调用,定义如下:

使用静态加载的方法使用方面还是很方便的,可是在动态加载的时候就不能直接调用头文件的函数了,增加了复杂度,下面会讲到。

/**  *  Start receiving accelerometer data periodically.   *   *  The period interval must be a multiple of the callbackPeriod specified   *  in SmiAccelerometerCapabilities. If it is less than the callbackPeriod, it will be   *  set to the callbackPeriod. If it is not a multiple of the callbackPeriod, it will be   *  truncated to fit the value. ( (period / callbackPeriod)   * callbackPeriod )   *     *  Only one handler per process is allowed. Successive calls per process will replace the previous handler   *  function and period.   *  *  @param    period    [in]    callback interval.      *  @param    handler   [in]    callback function for every period interval.     *   *  @return                      *                              SMI_SUCCESS on success   *  \n                          SMI_ERROR_INVALID_PARAMETER if the handler input parameter is NULL   *  \n                          SMI_ERROR_DEVICE_NOT_FOUND if the device is not present or supported   *  \n                          SMI_ERROR_CANNOT_ACTIVATE_SERVER if the sensor server cannot be started   */ SMI_API SMI_RESULT SmiAccelerometerRegisterHandler(UINT period, SmiAccelerometerHandler handler);

C++动态加载DLL的方法

静态加载DLL是比较简单的开发方法,可是有个缺点是程序开始运行的时候就需要加载DLL,如果该DLL不存在,程序就不能启动了。由于Windows Mobile Sensors API库需要自适应具体的设备,也就是说Windows Mobile Sensors API库不能依赖于具体设备的Sensor库,所以不能使用静态加载的方法来引用DLL。下面讲述动态加载DLL的方法。

定义指向函数的指针

动态加载DLL,需要根据头文件来定义指向函数的指针,如下:

typedef UINT (WINAPI * PFN_SmiAccelerometerGetVector)(SmiAccelerometerVector*);  typedef UINT (WINAPI * PFN_SmiAccelerometerGetCapabilities)(SmiAccelerometerCapabilities*);  typedef UINT (WINAPI * PFN_SmiAccelerometerRegisterHandler)(UINT, SmiAccelerometerHandler);typedef UINT (WINAPI * PFN_SmiAccelerometerUnregisterHandler)();  PFN_SmiAccelerometerGetVector pfnSmiAccelerometerGetVector;PFN_SmiAccelerometerGetCapabilities   pfnSmiAccelerometerGetCapabilities;PFN_SmiAccelerometerRegisterHandler   pfnSmiAccelerometerRegisterHandler;PFN_SmiAccelerometerUnregisterHandler pfnSmiAccelerometerUnregisterHandler;

这些指向函数的指针可以对应下面的在smiAccelerometer.h头文件的函数进行定义:

SMI_API SMI_RESULT SmiAccelerometerGetVector(SmiAccelerometerVector *accel);  SMI_API SMI_RESULT SmiAccelerometerGetCapabilities(SmiAccelerometerCapabilities *capabilities);  SMI_API SMI_RESULT SmiAccelerometerRegisterHandler(UINT period, SmiAccelerometerHandler handler);  SMI_API SMI_RESULT SmiAccelerometerUnregisterHandler();

定义是一一对应的。参数入口和返回值都必须完全一致。

初始化指向函数的指针

初始化指向函数的指针的过程也就是动态加载DLL的过程,代码如下:

#define SAMSUNG_SENSOR_DLL  L"SamsungMobilesdk_1.dll"HMODULE hSensorLib = LoadLibrary (SAMSUNG_SENSOR_DLL);if (NULL == hSensorLib){      printf("Unable to load Samsung Sensor DLL\n");      throw std::runtime_error("Unable to load Samsung Sensor DLL");}  pfnSmiAccelerometerGetVector = (PFN_SmiAccelerometerGetVector)      GetProcAddress(hSensorLib, L"SmiAccelerometerGetVector");pfnSmiAccelerometerGetCapabilities = (PFN_SmiAccelerometerGetCapabilities)      GetProcAddress(hSensorLib, L"SmiAccelerometerGetCapabilities");pfnSmiAccelerometerRegisterHandler = (PFN_SmiAccelerometerRegisterHandler)      GetProcAddress(hSensorLib, L"SmiAccelerometerRegisterHandler");pfnSmiAccelerometerUnregisterHandler = (PFN_SmiAccelerometerUnregisterHandler)     GetProcAddress(hSensorLib, L"SmiAccelerometerUnregisterHandler");if (NULL == pfnSmiAccelerometerGetVector){    printf("Unable to find entry point of SmiAccelerometerGetVector\n");      throw std::runtime_error("Unable to find entry point of SmiAccelerometerGetVector");}if (NULL == pfnSmiAccelerometerGetCapabilities){      printf("Unable to find entry point of SmiAccelerometerGetCapabilities\n");      throw std::runtime_error("Unable to find entry point of SmiAccelerometerGetCapabilities");}if (NULL == pfnSmiAccelerometerRegisterHandler){      printf("Unable to find entry point of SmiAccelerometerRegisterHandler\n");      throw std::runtime_error("Unable to find entry point of SmiAccelerometerRegisterHandler");}if (NULL == pfnSmiAccelerometerUnregisterHandler){      printf("Unable to find entry point of SmiAccelerometerUnregisterHandler\n");      throw std::runtime_error("Unable to find entry point of SmiAccelerometerUnregisterHandler");}

LoadLibrary()函数动态加载DLL,GetProcAddress()根据函数的名字 加载函数的入口地址 到指向函数的指针。有点绕口,sorry。如果地址不为空,那么可以根据这个地址调用相应的函数。

调用函数

调用函数的方法和静态加载DLL的方法一样,但是不是直接调用函数的名字,而是使用指向函数的指针来调用,下面的例子可以和静态加载DLL函数调用的例子对比来看。

SmiAccelerometerCapabilities cap;   if( pfnSmiAccelerometerGetCapabilities(&cap) != SMI_SUCCESS)   {      throw;}SmiAccelerometerHandler h = &GetVectorHandler;  if(pfnSmiAccelerometerRegisterHandler(1000, h) != SMI_SUCCESS)  {    throw;}

C++动态加载DLL的方法就完成了。

.NET的世界

下面这段表述不对,请看下面的回复。.NET使用DllImport属性进行P/Invoke不应该叫做动态加载,因为不能卸载,应该叫做按需加载,就是在call这个函数的时候才加载,而不是在程序启动的时候加载。按需加载和静态加载的区别是加载的时间不一样。

{

在.NET里面P/Invoke一个DLL里面的函数全部都是动态加载(这是错的,谢谢Wuya指出,这里应该叫做按需加载,动态加载的方法可以见Wuya到回复)的,使用DllImport属性来定义。如果SmiAccelerometerUnregisterHandler()函数使用在.NET下会定义如下:

[DllImport("SamsungMobileSDK_1.dll", CharSet = CharSet.Auto, SetLastError = true)]private static extern uint SmiAccelerometerUnregisterHandler();使用.NET比使用Native C++动态加载相对简单。

}

关于Mobile Sensors API项目

这个项目还是在起步阶段,当前实现了samsung的重力感应器,我把项目host到 Mobile Sensors API - Native unified APIs for Windows Mobile Sensors 了,我会持续改进,把各种sensors的实现到这个项目中。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

函数 动态 方法 静态 指向 文件 指针 程序 C++ 时候 项目 地址 链接 面的 也就是 例子 入口 名字 就是 属性 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 哈尔滨大商圈互联网科技有限公司 互联网科技金融 北京互联网络科技有限公司 苏州互联网科技贷款公司 大白互联网科技 互联网科技博客 互联网科技公司做什么 互联网科技公司需要的职位 西藏七维空间互联网科技有限公司 小米互联网科技园设置 汽车互联网创新科技园 荆州市昕露互联网络科技有限公司 黑科技闪耀互联网之光 速维有品互联网信息科技(苏州)有限公司 畅思互联网科技 吉林省码上互联网科技电话 版纳互联网科技选哪家 易租星互联网科技有限公司 科技和互联网行业的特点 宁波允成互联网科技有限公司 互联网科技会 杭州互联网科技公司 唐信互联网科技 大连 互联网 新科技 创业天下互联网科技有限公司 重庆威客帮互联网科技 宁夏科技产业互联网案例 国大互联网教育科技有限公司工作 云鲸互联网络科技有限公司 互联网科技博主张洲
0