5.07-09制作DLL植入labVIEW

大憨熊 提交于 2020-02-19 17:44:41

上网查资料,VS创建WIN32 DLL

一、为什么需要dll

代码复用是提高软件开发 效率的重要途径。一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用。比较常见的例子是各种应用程序框架, ATLMFC等,它们都以源代码的形式发布。由于这种复用是“源码级别”的,源代码完全暴露给了程序员,因而称之为“白盒复用”。“白盒复用”的缺点 比较多,总结起来有4点。

  1. 暴露了源代码;
  2. 容易与程序员的“普通”代码发生命名冲突;
  3. 多份拷贝,造成存储浪费;
  4. 更新功能模块比较困难。

实际上,以上4点概括起来就是“暴露的源代码”造成“代码严重耦合”。为了弥补这些不足,就提出了“二进制级别”的代码复用。使用二进制级别的代码复用一定程度上隐藏了源代码,对于缓解代码耦合现象起到了一定的作用。这样的复用被称为“黑盒复用”。

Windows操作系 统中有两种可执行文件,其后缀名分别为.exe.dll。它们的区别在于,.exe文件可被独立的装载于内存中运行;.dll文件却不能,它只能被其它 进程调用。然而无论什么格式,它们都是二进制文件。上面说到的“二进制级别”的代码复用,可以使用.dll来实现。

与白盒复用相 比,.dll很大程度上弥补了上述4大缺陷。.dll是二进制文件,因此隐藏了源代码;如果采用“显式调用”(后边将会提到),一般不会发生命名冲突;由 .dll是动态链接到应用程序中去的,它并不会在链接生成程序时被原原本本拷贝进去;.dll文件相对独立的存在,因此更新功能模块是可行的。

说明:实现“黑盒复用”的途径不只dll一种,静态链接库甚至更高级的COM组件都是。本文只对dll进行讨论。

 

Inserted from <http://www.cnblogs.com/laogao/archive/2012/12/07/2806528.html>

Stdafx-预编译头文件

stdafx的英文全称为:Standard Application Framework Extensions(标准应用程序框架的扩展)。

所谓头文件预编译,就是把一个工程(Project)中使用的一些MFC标准头文件(Windows.HAfxwin.H)预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果。这样可以加快编译速度,节省时间。

 

Inserted from <http://baike.baidu.com/link?url=RzjR11RK_TcreehmVy_Gf4zyb2B2edWEzpMSHaBufwoZbQHQdttHTK57iV69twf621NKtZxqkWAJF3TA6AtV6q>

labview调用dll

只支持C语言,不支持引用,只支持导出函数,导出函数声明需要用 extern "C"{} 修饰,不然会提示在DLL中找不到指定函数,特别注意C语言变量类型和LABVIEW中变量类型的对应关系

labview固然强大,但是有些功能实现起来也是比较麻烦的。我们想使用其他语言或者平台下的现成的程序,怎么办呢?

可以通过下面的集中办法来实现:

    1、调用公式节点 functions- All fuctions-structures

    2、调用C语言代码(code interface node  functions- All fuctions-structures  代码接口节点

    3、调用matlab脚本节点   functions- All fuctions-analyze-mathematics-formula

    4、调用windows API函数(call library function node 调用库函数节点 .dll

    5、调用ActiveX控件(微软的)   使用ActiveX容器,具体的实例可参见labview帮助文件里面的事件回调的浏览器的例子。

    6、调用.dll程序集或者共享库,通过.net容器来实现。

 

Inserted from <http://blog.sina.com.cn/s/blog_0414b7360101jron.html>

LV2010的函数选板中,已经找不到CIN函数了,对于习惯用C语言编程的朋友们可能会感觉不方便,当然CLN基本可以解决我们日常需要。

最近在中国测控网论坛上看到一个帖子,才知道Labview2010只是没有在函数选板显示CIN函数,实际上仍然可以可以使用。

下面详细介绍一下实现的方法:

从帖子中得知,CIN函数位于下面的MNU文件中:

\

通过工具菜单--》高级--》编辑选板,导入这个菜单文件,我们就可以看到CIN函数了。

\

Inserted from <http://www.eeworld.com.cn/Test_and_measurement/2014/1105/article_9955.html>

 

插入-子选板-链接到现有选板文件

CIN在新版本labview 中已经不支持,没有此功能,建议全面使用CLN

CreateDll 项目属性修改记录

复制三个文件夹

配置属性-C/C++-常规-附加包含目录-include 文件夹,其他类似设置暂时不做。

注意,需要设置工作路径!因为存在内存读写,读写音频文件!而音频文件存在bin文件夹下

测试记录

将不需要的头文件全部删掉,并只测试MSPlogin 功能,成功

将能够用labview改写的函数改写,实际需要用DLL的只有 run_asr()

改写的函数包括:

const char*  get_audio_file(void)

const char* get_grammar(const char* filename)

Dereferencing Pointers from C/C++ DLLs in LabVIEW

版本

创建于: 2010-1-18 下午3:13 作者 JervinJustin - 最后修改:  2011-11-1 下午5:06 作者 JervinJustin

LabVIEW Add-on Dev Center » Calling External Code » Calling C/C++ DLLs » Dereferencing Pointers

 

 

Inserted from <https://decibel.ni.com/content/docs/DOC-9091>

解决fopen()不执行的问题。

已查明:将地址转换为绝对地址后成功执行

已查明:LabVIEW 中调用DLL,使用 fopen()文件路径只支持绝对路径,不支持相对路径!

当设置相对地址时,原点地址可能是:1)系统路径2)执行文件路径3)当前软件的入口路径

 

labview中调用DLL就得遵守它的规则,DLLfopen 相对路径的原点地址在

D:\Program Files (x86)\National Instruments\LabVIEW 2014中,这是LabVIEW的入口路径!

故要将wav文件夹复制到此路径下,这一步可由labview完成!!!

 

0524修改:DLL地址原点会根据你加载VI的方式不同而不同,当你先打开labview.exe时是一回事,当你直接打开.vi时又是一回事。

 

关键代码

const char* asrfile = "./wav/iflytek09.wav";//选择待识别的语音文件

labview读取文件出现错误解决方式

计算机生成了可选文字: LabVIEW:  E:WS2013XCreateDLLXDebug XLzsData.dat  Fni.com

解决:改用文本文件读写,方便一些

fopen not working when called through dll-The DLL can not open a file

TestStand passes the filename parameter to the DLL.  I ended up fixing the problem by hard coding the filename into the function so everything is good now

 

Inserted from <http://forums.ni.com/t5/NI-TestStand/fopen-not-working-when-called-through-dll/td-p/2931014>

ctycheer 2013.09.11 02:25

hello. I meet a trouble about dll.

I make a dll in C++. the dll open a file for get  data.

in my C++ project ,I can use the dll for opening a file in the Metatrader 5 data path to get data.

But. I  can't do the same things in Metatrader5. I make a scripts in Metatrader5 ,the scripts use the dll to open a file to get data. But it's not work.  My OS is  Windows7.

who could tell me why?

how can I change data between dll and EA 

 

Inserted from <https://www.mql5.com/en/forum/13871>

DLL中添加文件读写的代码,首先要写一句FILE* pData=fopen(char* filename,char* mode),我发现在DLL中如果文件路径不写绝对路径,文件指针就为NULL

It may caused by the relative path issue.

 

来自 <https://www.mql5.com/en/forum/13871>

 

 

相对路径输入规范

计算机生成了可选文字: E:XVS2013XCreateDLLXDebugXCreateDLL.dI  EN DependencvXCreateDll

需要复制msc.dll 文件到.dll文件同级目录下

VS 后期生成事件

可以看到有一个列表(含有“宏”和“值”列),而“宏”下的“TargetPath”对应的值就是当前项目生成的 dll/exe 文件对应的物理路径,双击该行,在上方的方框中就出现了“$(TargetPath)”,好了不罗嗦了。

直接在每个项目的生成事件窗口中的“后期生成事件命令行”写下“copy $(TargetPath) E:\projects\MyDemo\JoeyLibs\IdleTest\dlls”,并在下方的 运行后期生成事件 选择 成功生成时 搞定。

 

Inserted from <http://www.cnblogs.com/FreeDong/p/3406737.html>

严重问题:通过不同方式加载DLL导致相对路径随用户打开方式变化而变化!

通过合成方法生成绝对地址问题(VS

考虑放弃使用相对路径,而使用绝对路径。


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!