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 Integervb中定义各个变量:
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却能够正常运行有高手知道什么原因么?

解决方案 »

  1.   

    VB的调试模式和编译后的运行效果是有区别的,不单是这样,编译的方法不同,
    都有可能产生兼容性问题。比如P代码和普通的代码优化,在不同的环境下是会
    有区别的。而最容易碰到这种问题的情况就是调用C语言开发的API。毕竟C语言
    对类型的要求和VB不同。所以很容易导致问题的产生,但单对于VB本身开发的
    接口程序而言,就不会有这类问题。
      

  2.   

    从声明上来看,应该将sndDataLen等int(C语言)类型的参数以Long(VB6)来声明.因为C的INT是4字节,而VB里的Integer是2字节.那么,如果你传入的值大于了0xFFFF,就不正常了......而VB的超强容错,有可能将其截断或其它什么方式处理后再传给了DLL........先试试吧,把看到的问题一个一个解决再说.
      

  3.   

    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
      

  4.   

    3q3q,问题解决,以后不会出这种问题了。不过这个VB也有点搞笑EXE跟VB环境还不一样的
      

  5.   

    不一样,那多半是使用了本地编译.IDE中是按P代码方式编译的.