zoukankan      html  css  js  c++  java
  • 5.07-09制作DLL植入labVIEW

    上网查资料,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 InstrumentsLabVIEW 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:projectsMyDemoJoeyLibsIdleTestdlls”,并在下方的 运行后期生成事件 选择 成功生成时 搞定。

     

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

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

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

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


  • 相关阅读:
    比赛-ZR DAY1 (04 Aug, 2018)
    Java NIO系列教程(十一) Pipe
    Java NIO系列教程(九) ServerSocketChannel
    Java NIO系列教程(十) Java NIO DatagramChannel
    Java NIO系列教程(七) FileChannel
    Java NIO系列教程(八) SocketChannel
    Java NIO系列教程(六) Selector
    Java NIO系列教程(四) Scatter/Gather
    Java NIO系列教程(五) 通道之间的数据传输
    Java NIO系列教程(二) Channel
  • 原文地址:https://www.cnblogs.com/lizhensheng/p/11241936.html
Copyright © 2011-2022 走看看