首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

VB掉用C++写的DLL出现的有关问题,大家讨论讨论

2012-01-31 
VB掉用C++写的DLL出现的问题,大家讨论讨论vb掉用C些的SOCKET通信DLL先贴C中函数声明代码extern C int PA

VB掉用C++写的DLL出现的问题,大家讨论讨论
vb掉用C些的SOCKET通信DLL
先贴C中函数声明代码
extern "C" int PASCAL EXPORT Commit(
char * serverAddr, //服务器IP地址 in
int serverPort, //服务器端口号 in
char * sndBuf, //发送缓冲区 in
int sndDataLen, //发送缓冲区中数据的长度 in
char * rcvBuf, //接收缓冲区 out
int rcvBufLen, //接收缓冲区的大小 in
LPINT rcvDataLen, //接收缓冲区中数据的长度 out
int conTimeout = 5, //连接超时时间 秒 in
int sndTimeout = 5, //发送超时时间 秒 in
int rcvTimeout = 10 //接收超时时间 秒 in
)
下面是vb中的声明代码
Private Declare Function Commit Lib "mmsCrypto.dll" ( _
  ByVal serverAddr As String, _
  ByVal serverPort As Integer, _
  ByRef sndBuf As Byte, _
  ByVal sndDataLen As Integer, _
  ByRef rcvBuf As Byte, _
  ByVal RcvBufLen As Integer, _
  ByRef rcvDataLen As Integer, _
  Optional ByVal conTimeout As Integer = 5, _
  Optional ByVal sndTimeout As Integer = 5, _
  Optional ByVal rcvTimeout As Integer = 15 _
) As Integer

vb中定义各个变量:
ip,port是常量
Dim SndData() As Byte
Dim RcvData() As Byte
Dim sndDataLen As Integer
Dim RcvBufLen As Integer
Dim rcvDataLen As Integer

奇怪现象:
当我将sndDataLen,RcvBufLen(即2个按值传递的变量)定义为窗体级变量时,在VB环境下能够正常运行,生成EXE后却不能正常运行。我再用vc进行调试,发现传入VC中的值不对。这就是出现异常的原因。

然后,我将sndDataLen,RcvBufLen(即2个按值传递的变量)定义为过程级变量时,在VB环境下不能正常运行,生成EXE却能够正常运行。。。

有高手知道什么原因么?


[解决办法]
VB的调试模式和编译后的运行效果是有区别的,不单是这样,编译的方法不同,
都有可能产生兼容性问题。比如P代码和普通的代码优化,在不同的环境下是会
有区别的。而最容易碰到这种问题的情况就是调用C语言开发的API。毕竟C语言
对类型的要求和VB不同。所以很容易导致问题的产生,但单对于VB本身开发的
接口程序而言,就不会有这类问题。
[解决办法]
从声明上来看,应该将sndDataLen等int(C语言)类型的参数以Long(VB6)来声明.

因为C的INT是4字节,而VB里的Integer是2字节.

那么,如果你传入的值大于了0xFFFF,就不正常了......而VB的超强容错,有可能将其截断或其它什么方式处理后再传给了DLL........

先试试吧,把看到的问题一个一个解决再说.
[解决办法]
顶老马……

[解决办法]
Private Declare Function Commit Lib "mmsCrypto.dll" ( _ 
ByVal serverAddr As String, _ 
ByVal serverPort As Long, _ 
ByRef sndBuf As Byte, _ 
ByVal sndDataLen As Long, _ 
ByRef rcvBuf As Byte, _ 
ByVal RcvBufLen As Long, _ 
ByRef rcvDataLen As Long, _ 
Optional ByVal conTimeout As Long = 5, _ 
Optional ByVal sndTimeout As Long = 5, _ 
Optional ByVal rcvTimeout As Long = 15 _ 
) As Long

热点排行