当前位置: 首页 > news >正文

网站开发公司网站官网百度一下你就知道官方网站

网站开发公司网站官网,百度一下你就知道官方网站,网站空间就是虚拟主机吗,北京网站建设招聘先小话一下DLL,DLL是动态链接库,是源代码编译后的二进制库文件和程序接口,和静态链接库不同的是,程序在编译时并不链接动态链接库的执行体,而是在文件中保留一个调用标记,在程序运行时才将动态链接库文件加载入内存。并…

  先小话一下DLL,DLL是动态链接库,是源代码编译后的二进制库文件和程序接口,和静态链接库不同的是,程序在编译时并不链接动态链接库的执行体,而是在文件中保留一个调用标记,在程序运行时才将动态链接库文件加载入内存。并且DLL在运行时是共享的,即当多个程序调用时,内存中也只保持一份动态链接库。
  动态链接库的调用有显式和隐式两种方式。
  隐式链接需要用到我们前面生成的plotdata.c,plotdata.h,plotdata.lib以及plotdata.dll文件。
  首先将plotdata.c,plotdata.h加入工程中,注意在需要用到函数的文件加入#include "plotdata.h".
  之后链接输入项中写上plotdata.lib.右击工程->Propertites->Link->Input->Additional Dependecies中加上plotdata.lib(也就是在调用MATLAB引擎时填写libmat.lib、libeng.lib等的地方)注意plotdata.lib也需要放在你的工程下,或者写全路径,如"D:\data\plotadata.lib",需要加引号。
  这样在你的代码中就可以直接用plotdata.h中的接口函数了。
  另显式链接的方式:所谓"显式"说白了就是在代码中写出来我要调用这个DLL.
  首先我们需要定义一个函数类型,方便我们后面进行函数的强制类型转换。我们可以在plotdata.h中找到我们将要使用的函数plotdata,他的函数声明如下:
  extern LIB_plotdata_CPP_API void MW_CALL_CONV plotdata(const mwArray& rgbData);
  忽略那些复杂的宏定义,模仿着定义我们自己的函数类型:
  typedef void (*HMAT)(const mwArray& rgbData);
  之后在代码中显式链接plotdata.dll
  HINSTANCE hDLL=NULL;//DLL句柄
  hDLL=LoadLibrary("plotdata.dll");
  HMAT plotData=(HMAT)GetProcAddress(hDLL,"plotdata");
  //第一个参数为DLL句柄,第二个为要加载的函数名
  之后便可直接在代码中直接使用函数plotData了。这种显式链接只需要plotdata.dll文件即可~
  下面我们来看一下生成的函数接口
  extern LIB_plotdata_C_API
  bool MW_CALL_CONV plotdataInitializeWithHandlers(
  mclOutputHandlerFcn error_handler,
  mclOutputHandlerFcn print_handler);
  extern LIB_plotdata_C_API
  bool MW_CALL_CONV plotdataInitialize(void);
  extern LIB_plotdata_C_API
  void MW_CALL_CONV plotdataTerminate(void);
  extern LIB_plotdata_C_API
  void MW_CALL_CONV plotdataPrintStackTrace(void);
  extern LIB_plotdata_C_API
  bool MW_CALL_CONV mlxPlotdata(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[]);
  extern LIB_plotdata_C_API
  long MW_CALL_CONV plotdataGetMcrID();
  extern LIB_plotdata_C_API bool MW_CALL_CONV mlfPlotdata(mxArray* rgbData);
  这是plotdata.h中主要的函数。plotdataInitialize(void)可以看出是初始化的函数。如果是隐式链接DLL最好先调用此函数,判断返回值否则很可能加载不到dll,而在显式链接时,如果没有加载函数成功,也不会直接报错,但我们可以在单步调试时看函数是否为分配了内存(即是否为null)。plotdataTerminate(void)是终止动态链接库的函数。
  mlxPlotdatat与mlfPlotdata是最关键的两个接口,也是我们要加载的函数。他们执行的功能与m文件中plotdata函数是一样的。两个函数输入参数不同:
  mlxPlotdata(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[]); 其中 nlhs,plhs分别表示输出参数的个数及输出参数的mxArray数组;nrhs,prhs表示输入参数的个数及输入参数数组。(这个函数有点通用的感觉……)
  mlfPlotdata(mxArray* rgbData); 就简单的多,基本和m文件中你定义的plotdata函数是一样的(我的plotdata定义为 function []=plotdata(rgbData))
  所以一般在程序中加载的是mlf开头的函数。
  这里需要提的是我编译生成的是C的动态链接库。如果是生成C++的动态链接库,生成的接口函数也带有一个mlx开头的函数,即
  bool MW_CALL_CONV mlxPlotdata(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[])
  但是另一个函数是不带有mlf的,直接为
  void MW_CALL_CONV plotdata(const mwArray& rgbData)
  而且输入参数不是mxArray数组,而是mwArray数组,这也是C和C++与MATLAB混合编程时最主要的不同(下篇再详细说)
  但是我在尝试C++动态链接时一直没有成功。后来看到生成的cpp文件同c文件一样也有一个 extend "C"{},这是C++为了与C兼容而提供的一个关键字,C++编译器将会在extend "C"的大括号内部代码当做C语言代码处理,这让我很困惑……而如果注释掉又会报连接错误托福答案
  想来可能是MATLAB对C++编译支持并不好(他自带的lcc编译器是只能编译成C的接口)总之没有尝试成功,暂时在程序中都用C的动态链接了。

转载于:https://www.cnblogs.com/haosola/p/3871029.html

http://www.lbrq.cn/news/2472697.html

相关文章:

  • 招聘网站如何做薪酬报告东莞网络公司电话
  • 网站编辑信息怎么做百度应用商店下载安装
  • web网站开发里怎么切换界面搜索引擎技术
  • 网站建设价格方案滨州seo招聘
  • 代做网站收费标准国内最新新闻
  • 小学生信息科学做网站网站seo优化技巧
  • 网页设计与网站建设的区别竞价推广工作内容
  • ui设计就业方向有哪些?seo基础教程视频
  • 网站代码在哪看北京网站seo
  • 做石材外贸用什么网站营销平台
  • 阳东网站seo网络项目平台
  • iava是做网站还是app指数基金定投怎么买
  • 做教师知识网站有哪些内容厦门排名推广
  • 如何建一个论坛网站长沙百度网站推广优化
  • 自己搞网站建设百度热搜榜怎么打开
  • 婚纱摄影网站设计济南网站设计
  • 贵州网站建设gzzctyi一个新品牌怎样营销推广
  • 西安的商城网站建设平台连接
  • 阿里云 有企业 网站吗搜外友链
  • 黄浦区seo网站建设流量推广app
  • 做营销网站设计免费快速网站
  • 个人网站备案流程搜索百度下载安装
  • 做英语网站刷死粉网站推广
  • 丹阳做网站白百度一下你就知道
  • 做网站如何分页百度推广二级代理商
  • 如何查看网站权重百度关键词搜索排名
  • 企业建设网站的方式百度推广授权代理商
  • 最好的网站建设公司哪家好长沙官网网站推广优化
  • 和优网站建设口碑营销是什么
  • 彩钢做网站能赚钱吗优化搜索点击次数的方法
  • Nacos-服务注册,服务发现(二)
  • bmp280的压力数据采集(i2c设备驱动+设备树编写)
  • C++___快速入门(上)
  • kali [DNS劫持] 实验(详细步骤)
  • Web攻防-业务逻辑篇密码找回重定向目标响应包检验流程跳过回显泄露验证枚举
  • 关于“PromptPilot”