我要调用同事编的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 Long3.vb6中调用主要如下:Dim returnInt as Interget
Dim ChineseText As Integer
Dim EnglishText As String
returnInt = LoadAllData("input1.dat","input2.dat")
returnInt = Query(EnglishText, ChineseText)
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 Long3.vb6中调用主要如下:Dim returnInt as Interget
Dim ChineseText As Integer
Dim EnglishText As String
returnInt = LoadAllData("input1.dat","input2.dat")
returnInt = Query(EnglishText, ChineseText)
解决方案 »
- VBA中无法使用datagrid控件
- [100元+100分]找人做个VB6的小程序
- 请教一个小问题
- 在ACCESS中,如何同时打开多个表,并且同时写入多个表。请举个例子。
- 急!!急.....,送分,送分!!请各位大虾帮帮忙
- 哪位高人知道VSFLEXGRID7该如何打包发布?
- 温州哪里可以买到《程序员》杂志,我寻找了好几个月了!!!!!
- 不难
- 为什么我的VB中的Left和Right函数不好用了,急急急
- 请问,串口通讯中如何控制端口各个脚的电位
- 偶尔我安装了一个vb的软件 可再打开我以前工程检测出一个控件升级 不想升级 如何注销那个新控件
- 如何使组合框下接列表中的项目多于8个呢?默认只能显示8项。但是如何拉长些呢?
我同事针对查不到的情况会返回"没有对应中文"这样的字符串.我在考虑,这个27809是不是就是我传进去了英文字符串,但是没有查到,所以返回了"没有对应中文"的第一个字符...
Dim ChineseText As String * 255 '这里分配255个字节的长度
Dim EnglishText As StringreturnInt = LoadAllData("input1.dat","input2.dat")
returnInt = Query(EnglishText, ChineseText)在最后,我还想明白一下,你第一个LoadAllData函数的两个参数,文件名确定没问题?(你没有带路径,文件是否放在了工程目录下?)
-------------------------------------------------
VB声明:
Public Declare Function LoadAllData Lib "Query.dll" (ByRef strEngFileName() As Byte, ByRef strChinFileName() As Byte) As Long
Public Declare Function Query Lib "Query.dll" (ByRef strEnglish() As Byte, ByRef strChinese As String) As LongVB调用:
Dim fileEn() As Byte
Dim fileCh() As BytefileEn = StrConv("EngAsciiDI.dat0", vbFromUnicode)
fileEn(14) = fileEn(14) - 48 '让fileEn数组最后一个字节为/0
fileCh = StrConv("ChinUnicodeDI.dat0", vbFromUnicode)
fileCh(17) = fileCh(17) - 48 '让fileEn数组最后一个字节为/0
returnLong = LoadAllData(fileEn, fileCh)
我现在觉得,应该是按照这样声明,但是还是不行.....真是郁闷啊...各位老大啊,就帮帮小弟偶吧
-----------------------------------------------------------------
VB 声明
Public Declare Function LoadAllDIData Lib "QueryDI.dll" (ByVal strEngFileName As String, ByVal strChinFileName As String) As Long
Public Declare Function QueryDI Lib "QueryDI.dll" (ByVal strEnglish As String, ByRef strChinese() As Byte) As LongVB调用
Dim returnLong As Long
Dim EnglishText As String
Dim ChineseText(255) As BytereturnLong = LoadAllDIData("EngAsciiDI.dat", "ChinUnicodeDI.dat")
returnLong = QueryDI(EnglishText, ChineseText)
我就贴第一个函数好了,chenhui530帮我看看,我觉得我调用后returnLong那个返回-1是错的..应该就没有执行 LoadAllDIData函数成功,应该是这里有问题.VB里面声明和调用方式我查了很多资料,也尝试了不同的方式,然后觉得还是myjian(嗷嗷叫的老马--无视无视~~)说的对,不过还是有点糊涂的.
下面是vc的部分代码
--------------------------------------------
/************************************************************************/
/* 从文件中LOAD所有DI数据 */
/************************************************************************/
int LoadAllDIData(SEARCHDIDATA &SearchData, char *strEngFileName, char *strChinFileName)
{ FILE *pfEng = 0;
FILE *pfChin = 0;
long lHeaderItemSize = 0;
long lHeaderNumber = 0;
long lPosOffset = 0;
long lPosEngOffset = 0;
long lPosChinOffset = 0;
int nSumCount = 0;
int nDataCount = 0;
char buf[256];
unsigned short wChin[256];
long lFirstPosEng = 0;
long lFirstPosChin = 0;
if ((pfEng = fopen(strEngFileName, "rb")) == 0)
{
printf("Error Open eng");
return -1;
}
if ((pfChin = fopen(strChinFileName, "rb")) ==0)
{
printf("Error Open Chinse");
return -1;
}
memset(buf, 0x00, sizeof(buf));
if (fgets(buf, sizeof(buf), pfEng) == 0)
{
fclose(pfEng);
return -2;
}
buf[strlen(buf)-1] = '\0';
lHeaderNumber = atol(buf);
memset(buf, 0x00, sizeof(buf));
if (fgets(buf, sizeof(buf), pfEng) == 0)
{
fclose(pfEng);
return -2;
}
buf[strlen(buf)-1] = '\0';
lHeaderItemSize = atol(buf); for (int i =0; i<lHeaderNumber; i++)
{
memset(buf, 0x00, sizeof(buf));
if (fgets(buf, sizeof(buf), pfEng) == 0)
{
fclose(pfEng);
return -2;
}
SearchData.ChrPos[i].Ch = GetCharacterLetter(buf);
GetFstPostion(buf, nDataCount, lPosEngOffset, lPosChinOffset);
if (i == 0)
{
lFirstPosEng = lPosEngOffset;
lFirstPosChin = lPosChinOffset;
}
SearchData.ChrPos[i].nCount = nDataCount;
SearchData.ChrPos[i].nFsrPos = nSumCount;
nSumCount += nDataCount;
} fseek(pfEng, lFirstPosEng, SEEK_SET);
fseek(pfChin, lFirstPosChin, SEEK_SET);
for (i =0; i<nSumCount; i++)
{
memset(buf, 0x00, sizeof(buf));
if (fgets(buf, sizeof(buf), pfEng) == 0)
{
fclose(pfEng);
fclose(pfChin);
return -1;
}
buf[strlen(buf)-1] = '\0';
memset(wChin, 0x00, sizeof(wChin));
if (fgetws(wChin, sizeof(wChin), pfChin) == 0)
{
fclose(pfEng);
fclose(pfChin);
return -1;
}
wChin[wcslen(wChin)-1] = 0x00;
strcpy(SearchData.Data[i].strEng, buf);
wcscpy(SearchData.Data[i].strChinese, wChin);
}
fclose(pfEng);
fclose(pfChin);
return 1;}------------------------------------------
/************************************************************************/
/* DI写入内存结构 */
/************************************************************************/
typedef struct TySearchDI
{
POSITION ChrPos[27];
ELEDI Data[11000];
}SEARCHDIDATA
/************************************************************************/
/* 查询DI */
/************************************************************************/
int QueryDI(char *strEnglish, unsigned short *strChinese, SEARCHDIDATA SearchData)
{
wcscpy(strChinese, strNoItemChi);
int nStart = 0;
int nCount = 0;
int ret = 0;
if ((strEnglish == 0)||
(strChinese == 0))
{ return -1;
}
if (IsNormalChar(*strEnglish))
{
nStart = SearchData.ChrPos[*strEnglish - 'A'].nFsrPos;
nCount = SearchData.ChrPos[*strEnglish - 'A'].nCount;
}
else
{
nStart = SearchData.ChrPos[26].nFsrPos;
nCount = SearchData.ChrPos[26].nCount; }
ret = DichotomyDI(SearchData.Data, nStart, nCount, strEnglish);
if (ret >=0)
{
wcscpy(strChinese, SearchData.Data[ret].strChinese);
return 1;
}
return 0;
}
1、你要调用的是函数 Query,但是给我们看的声明却是 QueryDI,请明确
2、Query 函数实现什么功能?两个参数是否都是 Out 的?如果第一个是 In 的,那么 VB 调用中 EnglishText 变量没有赋任何值!
queryDI中,第一个是输入的英文字符串(char*)是英文的;第二个是输出的中文字符串(unsigned short*),是out的.
关于你说的EnglishText我在程序里面取得了别的值,也是string类型的,这里没有列出.
Public Declare Function Query Lib "Query.dll" (ByVal strEnglish As String, ByRef strChinese As String) As LongChineseText = 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 Longdim a() as byte
redim a(512) '需要有足够输出的空间
rnInt = Query(EnglishText, varptr(a(0)))
ChineseText = a
因为我在vb里LoadAllDIData时返回9.
相应的vc中,我把loadAllDIdata函数中打开英文文件的地方改成了如下;
if ((pfEng = fopen(strEngFileName, "rb")) == 0)
{
printf("Error Open eng");
return -9;
}
---------------------------------
应该是VB里面传的英文文件名就没有传进去...这种情况该怎么处理?
if ((pfEng = fopen("EngAsciiDI.dat", "rb")) == 0)
{
printf("Error Open eng");
return -9;
}
这样都不行,返回值仍然是-9....
搞不定了....