NI的LabWindows/CVI 开发环境已经升级到2009版,不仅可以使用Windows下 Borland C++、Visual C++编译的dll,而且可以直接用这些外部编译器替代CVI本身的编译器来编译原来的代码资源!相比原来LabWindows/CVI 5.5 ,2009版在多编译器环境下协同开发的阻力大大减少,提供了诸多便利,由此组合出多编译环境的协同开发方法至少由9种。这里,考虑的是:将现有的CVI工程代码转换为dll,嵌入到Visual C++工程中去。用意很显然——用于半实物仿真系统构造。
#include <cvirte.h>
int __stdcall DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
if (InitCVIRTE (hinstDLL, 0, 0) == 0)
return 0; /* out of memory */
break;
case DLL_PROCESS_DETACH:
CloseCVIRTE ();
break;
}
return 1;
}
int __stdcall DllEntryPoint (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
/* Included for compatibility with Borland */
return DllMain (hinstDLL, fdwReason, lpvReserved);
}
这段代码基本上是操作系统的要求,不涉及CVI运行时系统。要生成可供外部实用的dll,代码方面还有一个细微的修改:修改面板的加载方式。一般的main函数加载面板的方式如下:
return;
DisplayPanel (panelHandle);
RunUserInterface ();
DiscardPanel (panelHandle);
...
return;
DisplayPanel (panelHandle);
RunUserInterface ();
DiscardPanel (panelHandle);
...
/*if using C++ Compiler to compile the file, adopting C linkage mode
*/
#ifdef __cplusplus
extern "C" {
#endif
/* your function declaration for dll */
#ifdef __cplusplus
}
#endif
通过在该配置页面设置Custom Copy directory,甚至连拷贝dll到Visual C++工程下的运行时目录这一步也省了。
这个例子最后是实现在MFC程序中调用CVI面板程序:
常见问题:
1、链接错误2001:找不到dll中符号。这是由于Visual C++默认对*.cpp文件中的函数调用(包括dl中的导出函数)采用C++命名方式造成的,需要使用 extern "C"宏进行保护。 思路来自这里 关于dll调用原理的解释和dll头文件格式的分析 。