CVI4.0/5.0调用VC++6.0编译生成的DLL的一种方法 点击:2453 | 回复:0



zhoujian29

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 1回
  • 年度积分:0
  • 历史总积分:4
  • 注册:2003年12月10日
发表于: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


热门招聘
相关主题

官方公众号

智造工程师