我要调用同事编的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.   

    其中的LoadAllData()函数是读取两个文本文件数据到缓冲区,然后Query()函数是输入一个英文字符串,然后在前面读入的文本文件中查找相应字符串...
      

  2.   

    我刚才又查了一个返回的27809那个东西,如果转换成unicode码,就是"没"这个字.
    我同事针对查不到的情况会返回"没有对应中文"这样的字符串.我在考虑,这个27809是不是就是我传进去了英文字符串,但是没有查到,所以返回了"没有对应中文"的第一个字符...
      

  3.   

    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 StringreturnInt = LoadAllData("input1.dat","input2.dat")
    returnInt = Query(EnglishText, ChineseText)在最后,我还想明白一下,你第一个LoadAllData函数的两个参数,文件名确定没问题?(你没有带路径,文件是否放在了工程目录下?)
      

  4.   

    谢谢myjian的帮助,不过我按照你说的尝试了,还是不行...每次查询出来就是一堆乱码了....我的第一个LoadAllData函数中两个参数都是文件名,检查过没有错误,都没有带路径,并且都是放在工程目录下的.但是我同事在vc里面是用fopen(wb方式)打开这两个文件的,不是wfopen,我不知道此处VB里面传string进去行不行,因为听说vb里面的string是unicode形式的.但是我看了这个loadAllData的返回值,是-1,我同事定义的只有return 1才是正常执行了.我觉得这个函数在VB里面没有正常执行.还有就是第二个函数,我按照你贴出来的修改了,还是不行.查询出来每次都是同样的乱码.这个函数里面第一个参数是需要查询的英文字符串(char *, 即用Acii码),第二个参数是用来得到输出的中文字符串(这里用unsingend short来保存对应的unicode码),是一个指向缓冲区的指针.又搞了好久,还是出不来,都快发疯了...
      

  5.   

    我不清除这里面在vc里面用char *的参数,VB里面用string声明可不可以,不知道VB会不会自动转换的.不过我也尝试过把参数声明成byte数组,然后将文件名转换成ansi码,再对这个byte数组最后一位强制写成\0,但是调用LoadAllData后,watch 返回值returnLong还是-1.....以下是我按照这种方式调用的部分代码
    -------------------------------------------------
    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)
      

  6.   

    还是没解决......
    我现在觉得,应该是按照这样声明,但是还是不行.....真是郁闷啊...各位老大啊,就帮帮小弟偶吧
    -----------------------------------------------------------------
    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) 
      

  7.   

    VC的代码好多的,几千行....贴不完
    我就贴第一个函数好了,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
      

  8.   

    另一个导出函数如下, 这些代码我同事在vc下测试过(不是通过dll方式),是把.cpp和.h加入到已有的项目里面可以运行的.  我现在在vb里面,可以运行,没有那种找不到entry point的常规错误, QueryDI返回0, LoadAllDIData返回-1.谢谢帮忙看看.
    /************************************************************************/
    /* 查询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;

    }
      

  9.   

    问题
    1、你要调用的是函数 Query,但是给我们看的声明却是 QueryDI,请明确
    2、Query 函数实现什么功能?两个参数是否都是 Out 的?如果第一个是 In 的,那么 VB 调用中 EnglishText 变量没有赋任何值!
      

  10.   

    Tiger_zhao,我那个函数名是后面改过,问题不是这个.
    queryDI中,第一个是输入的英文字符串(char*)是英文的;第二个是输出的中文字符串(unsigned short*),是out的.
    关于你说的EnglishText我在程序里面取得了别的值,也是string类型的,这里没有列出.
      

  11.   

    query就是querydi,我后面改过了的
      

  12.   

    方案一:
    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
      

  13.   

    我现在确定了是LoadAllDIData函数调用的时候就有问题了,我在vc里面又把返回值改过了,然后确定现在是在loadAllDIdata里面现在就有问题了.
    因为我在vb里LoadAllDIData时返回9.
    相应的vc中,我把loadAllDIdata函数中打开英文文件的地方改成了如下;
    if ((pfEng = fopen(strEngFileName, "rb")) == 0)
    {
    printf("Error Open eng");
    return -9;
    }
    ---------------------------------
    应该是VB里面传的英文文件名就没有传进去...这种情况该怎么处理?
      

  14.   

    后面那个函数queryDI函数,我现在用过查出来的是在vc里面定义的常量的unicode的little endian形式. 这个问题可以先放下,我现在最想知道的是,我为什么调用那个loadALLDIdata函数居然也传不进去文件名....
      

  15.   

    刚才又尝试了,不再传参,直接在vc的dll源程序里面就把LoadAllData()中,让
    if ((pfEng = fopen("EngAsciiDI.dat", "rb")) == 0)
    {
    printf("Error Open eng");
    return -9;
    }
    这样都不行,返回值仍然是-9....
    搞不定了....