vb中调用VC编译的dll的函数有关问题,50分送.
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
我要调用同事编的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