上网查资料,VS创建WIN32 DLL
一、为什么需要dll
代码复用是提高软件开发 效率的重要途径。一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用。比较常见的例子是各种应用程序框架, 如ATL、MFC等,它们都以源代码的形式发布。由于这种复用是“源码级别”的,源代码完全暴露给了程序员,因而称之为“白盒复用”。“白盒复用”的缺点 比较多,总结起来有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.H、Afxwin.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
版本 7
创建于: 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
- Overview
- Option 1: MoveBlock Function
- Option 2: GetValueByPointer VI
- Special Case: Dereferencing Arrays
- Special Case: Dereferencing Strings
- Special Case: 2D Arrays
- Conclusions / Next Steps
Inserted from <https://decibel.ni.com/content/docs/DOC-9091>
解决fopen()不执行的问题。
已查明:将地址转换为绝对地址后成功执行
已查明:LabVIEW 中调用DLL,使用 fopen()文件路径只支持绝对路径,不支持相对路径!
当设置相对地址时,原点地址可能是:1)系统路径2)执行文件路径3)当前软件的入口路径
在labview中调用DLL就得遵守它的规则,DLL中fopen 相对路径的原点地址在
D:\Program Files (x86)\National Instruments\LabVIEW 2014中,这是LabVIEW的入口路径!
故要将wav文件夹复制到此路径下,这一步可由labview完成!!!
0524修改:DLL地址原点会根据你加载VI的方式不同而不同,当你先打开labview.exe时是一回事,当你直接打开.vi时又是一回事。
关键代码
const char* asrfile = "./wav/iflytek09.wav";//选择待识别的语音文件
labview读取文件出现错误解决方式
解决:改用文本文件读写,方便一些
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>
相对路径输入规范
需要复制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)
考虑放弃使用相对路径,而使用绝对路径。
来源:https://www.cnblogs.com/lizhensheng/p/11241936.html