Private Type CardInfo
     XH As String * 33
     CardID As String * 33
     XI As String * 10
     BJ As String * 20
     XM As String * 20
     XB As String * 4
     CardIDL As Long
 End Type用VB定义的结构体如上,然后定义一个实例
Dim kk as CardInfoBCB动态链接库函数为int ReadCard_ETest(HCardInfo *CI)
{
CI->CardIDL=0;
char xh[]="abcdefghij";
char id[]="abcdefghijklmnopqrstuvwxyz";
char xm[]="abcdefghij";
char xb[]="ab";
char xi[]="abcdefghij";
char bj[]="abcdefghij";
strcpy(CI->XH,xh);
strcpy(CI->CardID,id);
strcpy(CI->XI,xi);
strcpy(CI->BJ,bj);
strcpy(CI->XM,xm);
strcpy(CI->XB,xb);
return 0;
}
就只是给传进来的结构体赋值
调用BCB函数ReadCard_ETestDLL后    a = ReadCard_ETestDLL(kk)
    MsgBox "BJ:" & kk.BJ
    MsgBox "CardID:" & kk.CardID
    MsgBox "XB:" & kk.XB
    MsgBox "XH:" & kk.XH
    MsgBox "XI:" & kk.XI
    MsgBox "XM:" & kk.XM
为什么只有XH,CardID,XI正常,
其他的BJ是bcd...第一个字符没了
XB是def...前三个没了
XM是cde...前两个没了
不知道为什么
而此函数在BCB下用正常,请教大侠

解决方案 »

  1.   

    把 As String * n都改成 (n-1) As Byte
      

  2.   

    TO;楼上
      我照你说的把所以的换成as Byte格式,可是现在还是只有XH,CardID,XI正常,其他的一个都没了,我不知道,这些定义都一样为什么XH,等可以其他的不行呢
      

  3.   

    我发现我把结构体的顺序变下一,还有strcpy那块的位置换一下,又是另外几个不出来了,有个还COPY串了,为什么呢,真的不懂呀
      

  4.   

    我跟踪到DLL里面看到传进去的指针的值都对呀,为什么出来对VB里就没有了呢
      

  5.   

    Private Declare Function ReadCard_ETestDLL Lib "NDCard.dll" (ByRef Sxh As CardInfo) As Integer
     Private Declare Function ReadCard_TestDLL Lib "NDCard.dll" (ComHandle As Long, CardID As String, CardIDL As Long, XH As String, XM As String, XB As String, XI As String, BJ As String) As Integer
      
    Private Sub Command2_Click()
        Dim s As String
        a = ReadCard_ETestDLL(kk)
        
        MsgBox "XM:" & kk.XM
        MsgBox "XI:" & kk.XI
        MsgBox "BJ:" & kk.BJ
        MsgBox "CardID:" & kk.CardID
        MsgBox "XB:" & kk.XB
        MsgBox "XH:" & kk.XH
        MsgBox "XM:" & kk.XM
    End SubPrivate Sub Command4_Click()
         Dim XHa As String * 33
         Dim CardIDa As String * 33
         Dim XIa As String * 17
         Dim BJa As String * 17
         Dim XMa As String * 17
         Dim XBa As String * 4
         Dim CardIDLa As Long
        a = ReadCard_TestDLL(CardIDa, CardIDLa, XHa, XMa, XBa, XIa, BJa)
        MsgBox a
        MsgBox "XM:" & XMa
        MsgBox "XI:" & XIa
        MsgBox "BJ:" & BJa
        MsgBox "CardID:" & CardIDa
        MsgBox "XB:" & XBa
        MsgBox "XH:" & XHa
    End Sub
    就是这样了,那个ReadCard_TestDLL和上面的ReadCard_ETestDLL 最终调用的都是DLL里那个函数的,但是好像传入结构体的那个只有XH和CARDID,XI有返回值,其他的没有返回值的,ReadCard_TestDLL返回后就是我说的从第二个或者第三个开始读的
      

  6.   

    声明改为这样看
    Private Type CardInfo
         XH(32) As Byte
         CardID(32) As Byte
         XI(9) As Byte
         BJ(19) As Byte
         XM(19) As Byte
         XB(3) As Byte     
         CardIDL As Long
    End TypePrivate Declare Function ReadCard_ETestDLL Lib "NDCard.dll" (ByRef Sxh As CardInfo) As Long
    Private Declare Function ReadCard_TestDLL Lib "NDCard.dll" (ByVal ComHandle As Long, ByVal CardID As String, CardIDL As Long, ByVal XH As String, ByVal XM As String, ByVal XB As String, ByVal XI As String, ByVal BJ As String) As Integer
      

  7.   

    很感谢这位大哥的回答,我想问一下照您那样的声明我如下转为转成字符可以吗
        s = StrConv(kk.XH, vbUnicode)
        MsgBox "XH:" & s
    另外我第二个传进去的是个地址,照您那样声明不行吧怎么加分
      

  8.   

    还是不行。为什么只有XI,XH,CardID,能出来,其他的没了,这三个是结构的前三个和这个有关吗
      

  9.   

    在改成Byte后出错就什么指令引用的什么内存,该内存不能为READ
      

  10.   

    对了,弄了半天最重要的东西忘了问,你C里面是怎么声明CardInfo的
      

  11.   

    typedef struct _CardInfo
    {
    unsigned char XH[33];
    unsigned char CardID[33];
    unsigned char XI[17];
    unsigned char BJ[17];
    unsigned char XM[17];
    unsigned char XB[4];
    unsigned long CardIDL;
    }HCardInfo;我在BCB的DLL里加了一个CPP,和.h。这个结构体在.h中定义的,ReadCard_ETest这个函数在.cpp里,在DLL主程序里有个函数引用.cpp里的ReadCard_ETest。而VB调用的这个实际上是调用DLL里主程序里的,然后主程序里的这个函数又去调用的.hpp里的ReadCard_ETest。太乱不知道大哥能否看明白的
      

  12.   

    根据你这个结构,vb的声明应该这样:
    private type CardInfo
      XH(32) as byte
      CardID(32) as byte
      XI(16) as byte
      BJ(16) as byte
      XM(16) as byte
      XB(3) as byte
      CardIDL as long
    end type
      

  13.   

    supergreenbean(超级绿豆 - 要准备发芽了) ( ) 很感谢您的回复,我也试过了,可还是这样,我想用不用重新把我所有的源码也贴出来看看的怎么加分呀,真的很想加分的
      

  14.   

    去万万上诉人于个工会去日漱口剂功课差
    extern "C"
    {
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
    {
        return 1;
    }
    //---------------------------------------------------------------------------
    __declspec(dllexport) int __stdcall ETest(char * CardID,unsigned long *CardIDL,char *XH,char *XM,char *XB,char *XI,char *BJ)
    {
    CardIDL=0;
    char xh[]="abcdefghxh";
    char id[]="abcdefghijklmnopqrstuvwxyzid";
    char xm[]="abcdefghxm";
    char xb[]="xb";
    char xi[]="abcdefghxi";
    char bj[]="abcdefghbj";
    strcpy(BJ,bj);
    strcpy(XM,xm);
    strcpy(XB,xb);
    strcpy(XH,xh);
    strcpy(CardID,id);           
    strcpy(XI,xi);
    return 6;
    }
    }
    这个是BCB动态链接库的
     Private Declare Function ETest Lib "C:\Documents and Settings\Administrator\桌面\VSNET\VB\NewBCBVB\BCB\Project2.dll" (CardID As String, CardIDL As Long, XH As String, XM As String, XB As String, XI As String, BJ As String) As Integer
    Private Sub Command4_Click()
         Dim XHa As String * 33
         Dim CardIDa As String * 33
         Dim XIa As String * 33
         Dim BJa As String * 33
         Dim XMa As String * 33
         Dim XBa As String * 33
         Dim CardIDLa As Long
         a = ETest(CardIDa, CardIDLa, XHa, XMa, XBa, XIa, BJa)
         MsgBox a
         MsgBox "XM:" & XMa
         MsgBox "XI:" & XIa
         MsgBox "BJ:" & BJa
         MsgBox "CardID:" & CardIDa
         MsgBox "XB:" & XBa
         MsgBox "XH:" & XHa
         MsgBox CardIDL
    End Sub
    Private Sub Command5_Click()
         Dim XH As String
         Dim CardID As String
         Dim XI As String
         Dim BJ As String
         Dim XM As String
         Dim XB As String
         Dim CardIDL As Long
        a = ETest(CardID, CardIDL, XH, XM, XB, XI, BJ)
        MsgBox a
        s = StrConv(XI, vbUnicode)
        MsgBox "XI:" & s
        s = StrConv(BJ, vbUnicode)
        MsgBox "BJ:" & s
        s = StrConv(CardID, vbUnicode)
        MsgBox "CardID:" & s
        s = StrConv(XB, vbUnicode)
        MsgBox "XB:" & s
        s = StrConv(XH, vbUnicode)
        MsgBox "XH:" & s
        s = StrConv(XM, vbUnicode)
        MsgBox "XM:" & s
        MsgBox CardIDL
    End Sub
    这个是VB调用的char CardID[33],XH[33],XM[33],XB[33],XI[33],BJ[33];
    unsigned long CardIDL=0;
    ShowMessage(ETest(CardID,&CardIDL,XH,XM,XB,XI,BJ));
    ShowMessage("CardID:"+AnsiString(CardID));
    ShowMessage("CardIDL:"+AnsiString(CardIDL));
    ShowMessage("XH:"+AnsiString(XH));
    ShowMessage("XM:"+AnsiString(XM));
    ShowMessage("XB:"+AnsiString(XB));
    ShowMessage("XI:"+AnsiString(XI));
    ShowMessage("BJ:"+AnsiString(BJ));
    这个是BCB调用的,用BCB调用的没有错误用VB调用的,会弹出框,内存错误吧,另外我用XH(33) AS BYTE的在编译都出错的,大哥帮我看看怎么回事吧
      

  15.   

    typedef struct _CardInfo
    {
    unsigned char XH[33];
    unsigned char CardID[33];
    unsigned char XI[17];
    unsigned char BJ[17];
    unsigned char XM[17];
    unsigned char XB[4];
    unsigned long CardIDL;
    }HCardInfo;int __stdcall ReadCard_ETest(HCardInfo *CI)
    {
    CI->CardIDL=0;
    char xh[]="abcdefghij";
    char id[]="abcdefghijklmnopqrstuvwxyz";
    char xm[]="abcdefghij";
    char xb[]="ab";
    char xi[]="abcdefghij";
    char bj[]="abcdefghij";
    strcpy((char*)CI->XH,xh);
    strcpy((char*)CI->CardID,id);
    strcpy((char*)CI->XI,xi);
    strcpy((char*)CI->BJ,bj);
    strcpy((char*)CI->XM,xm);
    strcpy((char*)CI->XB,xb);
    return 0;
    }Private Declare Function ReadCard_ETest Lib "D:\我的程序\CallTest\Debug\calltest.dll" (Sxh As CardInfo) As LongPrivate Type CardInfo
      XH(32) As Byte
      CardID(32) As Byte
      XI(16) As Byte
      BJ(16) As Byte
      XM(16) As Byte
      XB(3) As Byte
      CardIDL As Long
    End TypePrivate Sub Form_Load()
    Dim x As CardInfo
    Debug.Print ReadCard_ETest(x)
    Debug.Print StrConv(x.BJ, vbUnicode)
    End Sub
      

  16.   

    多谢大哥了,照您的方法解决了,是我定义的长度和DLL里的不一样,谢谢,
    最后一个问题,怎么加分的