用VB2008调用VC6.0的dll出错

来源:百度知道 编辑:UC知道 时间:2024/09/21 22:07:21
是一个用于某USB硬件的程序,dll是硬件商用VC6.0编的,我用VB6.0调用成功,但是改成VB2008后,可以编译成功,但是无法打开该设备。怎么办?

C和vb不兼容吧,exe是一样,编码不同好像就不行吧,总之你应该用同一种语言编

问题不出在代码兼容上。
VB从98年的6到03年的7发生了重大的变革,整个语法结构基本被颠覆,API的调用也出现了不少的变动,比如Long数据类型现在需要替换成Integer或者IntPtr,结构体传递更需要复杂的托管代码封送处理,具体怎么处理需要具体分析。
建议你在MSDN中系统学习.NET托管代码的原理,并详细阅读《针对VB6用户的手册》一章。

添加:752664788对我的答案补充不正确,VB2008和C#同属托管.NET,而你的C++DLL是非托管代码,就算你用VC2008重新编译也是没用的。我觉得你的问题在于结构体的封送,你可以仔细阅读MSDN的这一部分。

添加2,gwzydragon说的不是主要问题,基本数据类型影响不大,32位系统函数调用参数进栈都是4字节对齐进栈的,不过因为现在的Long因为是8个字节,就一定要改成Integer

一般这种问题都是数据类型的问题,比如,你在VB调用的时候用INTEGER,那么在VB2008后就要用INT16,否则两个数据的长度不一样,那么传递与返回的参数肯定都会出现偏差。
由两种解决办法,一个是你看看MSDN,比对一下每种数据类型前后的差别,有没有替代类型。
二,全部采用BYTE数组来传递和接受参数,自己再解码。

问题不出在代码兼容上。
VB从98年的6到03年的7发生了重大的变革,整个语法结构基本被颠覆,API的调用也出现了不少的变动,比如Long数据类型现在需要替换成Integer或者IntPtr,结构体传递更需要复杂的托管代码封送处理,具体怎么处理需要具体分析。

您可以用vb2008的c++升级您的dll,然后再生成,vb再引用就可以了
vb6和vb2008的差别太大了,跨版本的引用往往会出现这样那样的问题,升级是最简单而又行之有效的方法,具体的步骤下面见:
启动vs2008→打开项目→打开你的dll的工程文件→根据提示一步步升级→升级完成后自己检查代码→生成dll就可以了,然后vb再进行引用,就这么简单!

建议你在MSDN中系统学习.