在vb中,定义结构如下:
Public Type SvrAPI_SndDetail
    BookMarkName As String  
    SndDataBuff As String * 501 
    SndAttrib As Byte           
    VoiceSequence As Long 
End Type在vc中,与上面结构对应的结构定义如下:
typedef struct _SvrAPI_SndDetail
{
char BookMarket[41]; char StringBuffer[501]; char Atrribute; long VoiceSequence;
}SvrAPI_SndDetail;vc中引出的dll接口函数定义如下:
_SVRAPI long  WINAPI SvrAPI_SendQueue(LPSAFEARRAY FAR *pSendDetial)
vb中声明如下:
Public Declare Function SvrAPI_SendQueue Lib "TestAP.dll" ( pDetailInfo As SvrAPI_SndDetail) As Long问题:
当vb调用dll中引出的函数时,调用是成功的,pSendDetial是vb中输入的不定长的SvrAPI_SndDetail结构数组,当这个数组的长度大于1的时候,这个结构数组中只有第一个元素的值是正确的,其他的都不正确(即只有(SvrAPI_SndDetail*)pSendDetial这个指针指向的值是正确的,(SvrAPI_SndDetail*)pSendDetial+1 以后指向的值都不正确)。但是如果上面的结构中,如果没有String 类型得值时,这些元素都是正确的。请各位大虾指教

解决方案 »

  1.   

    dll里函数的参数是指针,vb调用时声明的函数参数是结构
    怎么行??
      

  2.   

    String类型是个指针,而你VC里的定义是有确定大小的一块内存。
    Public Type SvrAPI_SndDetail
        BookMarkName(40) As Byte  
        SndDataBuff(500) As Byte 
        SndAttrib As Byte           
        VoiceSequence As Long 
    End Type
    这样试试。
      

  3.   

    结构体有个内存对齐的问题,VB和VC内存对齐不一样则会发生错误,但内存对齐是可以在IDE里设置的。
    如果你要在两中语言之间调用DLL函数,最好不要传递结构体。难道不可以将结构体展开成多个函数参数吗?笨...
      

  4.   

    Public Type SvrAPI_SndDetail
        BookMarkName As String * 41
        SndDataBuff As String * 501
        SndAttrib As Byte           
        VoiceSequence As Long 
    End Type
      

  5.   

    照楼上的帖子的做法
    VB的定义改成如下
    Public Type SvrAPI_SndDetail
        BookMarkName As String  * 41
        SndDataBuff As String * 501 
        SndAttrib As Byte           
        VoiceSequence As Long 
    End Type
    是可以的,我原来这么处理过或者是在VB用Byte数组也可以
      

  6.   

    很明显是内存对齐问题
    楼上的应该可以吧
    要是不行,你这样试试
    Public Type SvrAPI_SndDetail
        BookMarkName As String 
        SndDataBuff As String 
        SndAttrib As Byte           
        VoiceSequence As Long 
    End Type
    在调用之前呢你先这样:
    BookMarkName = BookMarkName + space(41 - len(BookMarkName))
    SndDataBuff 也一样给足内存空间
      

  7.   

    数据对齐的问题。在VC里,这样定义结构:#pragma pack(push)
    #pragma pack(1)
    typedef struct _SvrAPI_SndDetail
    {
        char BookMarket[41];
        char StringBuffer[501];
        char Atrribute;
        long VoiceSequence;
    }SvrAPI_SndDetail;
    #pragma pack(pop)