读书人

vb中调用VC编译的dll的函数有关问题,5

发布时间: 2012-01-16 23:36:51 作者: rapoo

vb中调用VC编译的dll的函数问题,50分送...
我要调用同事编的VC编译的dll文件中的函数,用来读取本地两个文本文件,并查询文件中的数据,但是弄了很久,也不行.程序可以运行通过,但是在Query函数中输入不同的EnglishText变量,chineseText的返回值是同样的27809这个数字,不是我需要的不同的中文字符串.我自觉是VC6中的这两个函数的声明不对,但是试验了很多种,都不行.请各位大侠多多指教,本人是VB菜鸟,非常感谢.


1.vc6中dll的原型如下:(VC中导出方式应该没有问题,加了stdcall方式,并且用def文件到处,此外用dependencies看过导出函数库了,名字没有变化..)
int LoadAllData(char *FileName1, char *FileName2);
int QueryDI(char *strEnglish, unsigned short *strChinese);


2.vb6中声明如下
Public Declare Function LoadAllData Lib "Query.dll " (ByVal FileName1 As String, ByVal FileName2 As String) As Long
Public Declare Function Query Lib "Query.dll " (ByVal strEnglish As String, ByRef strChinese As Integer) As Long

3.vb6中调用主要如下:

Dim returnInt as Interget
Dim ChineseText As Integer
Dim EnglishText As String
returnInt = LoadAllData( "input1.dat ", "input2.dat ")
returnInt = Query(EnglishText, ChineseText)

[解决办法]
int QueryDI(char *strEnglish, unsigned short *strChinese);

后面那个东西,在VC DLL里面是不是一个指向字符串缓冲区的指针?

如果是,那么你的声明就改成这样:

Public Declare Function Query Lib "Query.dll " (ByVal strEnglish As String, ByVal strChinese As String) As Long

同时在调用时,为strChinese变量分配足够的长度,如下:

Dim returnInt as Interget
Dim ChineseText As String * 255 '这里分配255个字节的长度
Dim EnglishText As String

returnInt = LoadAllData( "input1.dat ", "input2.dat ")
returnInt = Query(EnglishText, ChineseText)

在最后,我还想明白一下,你第一个LoadAllData函数的两个参数,文件名确定没问题?(你没有带路径,文件是否放在了工程目录下?)
[解决办法]
方案一:
Public Declare Function Query Lib "Query.dll " (ByVal strEnglish As String, ByRef strChinese As String) As Long

ChineseText = space(256) '需要有足够输出的空间
rnInt = Query(EnglishText, ChineseText)

如果 ChineseText 为乱码,试试用下面的两个方法之一再转换一下
ChineseText = StrConv(ChineseText, vbFromUnicode)
ChineseText = StrConv(ChineseText, vbUnicode)

方案二:
Public Declare Function Query Lib "Query.dll " (ByVal strEnglish As String, ByVal strChinese As Long) As Long

dim a() as byte
redim a(512) '需要有足够输出的空间
rnInt = Query(EnglishText, varptr(a(0)))
ChineseText = a

读书人网 >VB

热点推荐