发表于:2003-12-10 14:53:00
楼主
1,在VC++6.0里,新建一个Project,取名叫my_dll2,选建立一个DLL类型的工程,生成一个带输出的project,生成好后,主程序将有三个输出的东西,分别是一个class, 一个全局变量nMy_dll2,和一个函数fnMy_dll2()。我只想输出全局变量nMy_dll2和函数fnMy_dll2(),所以将这个class在主程序和头文件中的代码删除即可。
2,由于CVI5.5一下的版本,不能读取VC++6.0以上的DLL,
"You need to specify the Visual C++ 6.0 link option "/LINK50COMPAT" to generate an import library compatible with Visual C++ 5.0, and therefore LabWindows/CVI. "
所以在VC++6.0里,
Project Setting -> Link -> Project Option里,添加字符串:
/LINK50COMPAT,
使之编译出来的DLL是和VC++5.0兼容的,
否则,CVI将出现错误报告如下:
“Bad COFF ibrary member header”
或 "Bad header encountered while reading external module: XXX.DLL"
"Aborted load of member XXX.DLL from library XXX.LIB"
"Aborted load of library XXX.DLL"
3,在my_dll2.cpp里,无需更改
但在my_dll2.h里,则需如下更改:
原来是
extern MY_DLL2_API int nMy_dll2;
MY_DLL2_API int fnMy_dll2(void);
应加个条件,改成:
#ifdef __cplusplus
extern "C" {
#endif
extern MY_DLL2_API int nMy_dll2;
MY_DLL2_API int fnMy_dll2(void);
#ifdef __cplusplus
}
#endif
注意:
"The #ifdef statements are needed for external compilers that compile .cpp file as C++ code. This forces the external compiler to compile the function prototypes as C code instead of C++ code."
意思就是把C++代码强制转换成C代码,这样在CVI中才能调用
4,build DLL,这样,VC++6.0环境下就生成了my_dll.lib和my_dll.dll,以及我们更改后的my_dll.h
5,在CVI里,新建一个project,取名叫test_mydll2.prj,注意将my_dll2.h和my_dll.lib和my_dll.dll拷贝到当前的目录中,其中,my_dll2.h可以不加
#ifdef __cplusplus
extern "C" {
#endif
这样的编译条件,因为CVi本来就是基于C的。当然直接沿用修改后的.h文件,也是一样的,没有问题。
6,新建一个.c文件,添加到project中去,并在其在开头处添加
#include "my_dll2.h"
最好把my_dll2.h和my_dll.lib都添加到project中去。
至此,就可以在CVI中调用VC++6.0的DLL里的全局变量和函数了:
int temp_int;
temp_int=fnMy_dll2();
//因为函数fnMy_dll2()将返回42,所以temp_int将等于42
temp_int=nMy_dll2;
//因为函数nMy_dll2=0,所以temp_int将等于0
参考文献:
http://www.ni.com
《How to Integrate 32-Bit Microsoft Visual C/C++ or Borland C/C++ DLLs into LabWindows/CVI 4.0》
《CVI Does Not Understand New Microsoft Visual C++ 6.0 Import Library Format》
题外话:
用CVI的人非常稀少,但CVI提供基于C的图形化编程环境,使我等这样只会C的硬件工程师可以迅速掌握windows图形界面的简单编程。
我是昨天下午才开始学习如何把在CVI5.0里去调用VC++6.0的DLL,一直到今天上午11时,才弄出个最简单的应用。感觉国内的CVI专业论坛人气不够旺盛,帖子的数量和质量远不能跟“驱动开发网”相比。看来学好E文是当务之急了,因为我也是昨天没弄出来,今天上了NI的英文网站search,才从大量的搜索结果中找到了解决之道。
其实这个问题别人早就解决了,只不过没有贴出来,或者贴出来了我没有能轻易的找到。所以希望大家把平时的经验点滴都公布一下,好让我等愚笨之人在R&D的道路上少走些弯路。
我的Email: zhoujian29@yahoo.com