为和提高labview程序运行的速度,因此考虑到用DLL调用的方法将原图形化程序替换掉。这些天一直在弄EVC DLL调用问题,可是把我折腾苦啦,明明只是很简单的一件事,可是却弄了好几天才弄出来,现在总结下与大家分享。
首先,由于是在labview touch panel 里面嵌套dll,我所使用的是labview8.5.1,dll要用evc生成才可以,(如果是labview2009 touch 的话,直接用VC的DLL就可以啦,我试验过啦。)同时需要National Instruments/LabVIEW 8.5/cintools下的fundtypes.h,extcode.h和platdefines.h。所以cintools文件夹要写入"additional include directories".
其次,建立工程是基于MFC的Regular DLL工程test。按照向导,工程建好后,首先需要做的就是要在test.h头文件里添加DLL输出函数定义。代码如下:
//如果定义了test_EXPORTS,就设置test_API为导出,否则设置为导入。
#ifdef test_EXPORTS
#define test_API __declspec(dllexport)
#else
#define test_API __declspec(dllimport)
#endif
这里需要注意的是,我的程序还要用到上面提到的几个文件,所以要注明#include "extcode.h"
接着,就是把程序写在test.cpp文件中,值得一提的是,所有从DLL输出的函数都应该以如下语句开始:AFX_MANAGE_STATE(AfxGetStaticModuleState());,这是用来正确切换MFC模块状态。而函数的命名也是要注意的。
long test_API SetCallbackProcAddr(long lProcAddress) //注意其中的test_API
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
..................
}
最后,就是写动态链接库的输出函数了。形式如下:extern "C" long test_API SetCallbackProcAddr(long);如果导出的函数很多,可以写成下面的形式:
extern "C" //C必须大写,如果小写的话,那你可要吃苦头啦,千万不要像我一样噢!
{
long test_API SetCallbackProcAddr(long);
...........
}
再有就是设置上Project Settings切换到C/C++选项卡,在Preprocessor definitions编辑框中输入test_EXPORTS,让编译器预先定义test_EXPORTS。
到此,如果没有太大问题,就可以啦。
不过对于像我一样用labview的编程人员来说,这可不是件容易的事。一开始编译遇到的问题就是说我的CPU没有进行宏定义,可是找来找去,问题居然出现在extcode.h文件上,因为我之前用的是labview7.0版的,里面的extcode.h和8.5.1版的extcode.h是不同的,不同处就在于8.5.1版的定义了ARM,这就让我花了大块的时间。
其次,编译的过程对于我来说现在想想真是漫长啊,每编译一处都会遇到问题,然而当问题解决时,犹如吃了蜜一样的甜。编译时要从编译较独立的函数开始,这样比较容易检查自己的代码的对错,改正时也方便了很多。
以上就是我这次工程的总结了,现在看来光会labview还不行,VC++还是要会的,这样EVC上手也就容易许多了,从现在开始,拓展自己知识的,增强其延续性!
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/paperhappy/archive/2010/01/21/5217199.aspx