在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 类型得值时,这些元素都是正确的。请各位大虾指教
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 类型得值时,这些元素都是正确的。请各位大虾指教
怎么行??
Public Type SvrAPI_SndDetail
BookMarkName(40) As Byte
SndDataBuff(500) As Byte
SndAttrib As Byte
VoiceSequence As Long
End Type
这样试试。
如果你要在两中语言之间调用DLL函数,最好不要传递结构体。难道不可以将结构体展开成多个函数参数吗?笨...
BookMarkName As String * 41
SndDataBuff As String * 501
SndAttrib As Byte
VoiceSequence As Long
End Type
VB的定义改成如下
Public Type SvrAPI_SndDetail
BookMarkName As String * 41
SndDataBuff As String * 501
SndAttrib As Byte
VoiceSequence As Long
End Type
是可以的,我原来这么处理过或者是在VB用Byte数组也可以
楼上的应该可以吧
要是不行,你这样试试
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 也一样给足内存空间
#pragma pack(1)
typedef struct _SvrAPI_SndDetail
{
char BookMarket[41];
char StringBuffer[501];
char Atrribute;
long VoiceSequence;
}SvrAPI_SndDetail;
#pragma pack(pop)