vc定义的结构体如下:
typedef struct trs_cmd
{
char CmdId;
char CmdLen[4+1];
char *CmdBuf;
}TRS_CMD;
int  TRSbp_cmd(TRS_CMD *trs_cmd);在vb中该怎么做呀,请指教!

解决方案 »

  1.   

    我也正在研究这个东西,不知道对不对,呵呵:Type trs_cmd
      Dim CmdId As String
      Dim CmdLen As String * 5
      Dim CmdBuf As String
    End TypeDim MyTRS_CMD As trs_cmdDeclare Function TRSbp_cmd Lib "yourdllname.dll" (ByDef TRS_CMD As Long) As Integer调用:Dim Result As Integer
    Result=TRSbp_cmd(AddressOf MyTRS_CMD)
    调用时,注意字符串用chr(0)来结尾。基本上我现在了解到的东西就是这样了吧。算不上是帮你解答,一起学习。
      

  2.   

    'typedef struct trs_cmd
    '{
    ' char CmdId;
    ' char CmdLen[4+1];
    ' char *CmdBuf;
    '}TRS_CMD;
    'int  TRSbp_cmd(TRS_CMD *trs_cmd);Public Type TRS_CMD
      CmdId As String '注意必须以Chr(0)结尾
      CmdLen As String * 5 '注意必须以Chr(0)结尾
      CmdBuf As String '注意必须以Chr(0)结尾
    End TypePublic Declare Function TRSbp_cmd Lib "test.dll"(TRS_CMD As TRS_CMD) As Long楼上的,应该是ByRef,不是ByDef
      

  3.   

    楼上的朋友们:我刚才试过了还是不行呀。
    我用的动态连接库名是Trsbp.dll 。
    内含函数:TRSbp_cmd ,
    函数原型:int  TRSbp_cmd(TRS_CMD *trs_cmd,TRS_RESULT *trs_result);
    主要参数:trs_cmd──命令结构体,trs_result──结果结构体。命令结构体TRS_CMD
    定义
    typedef struct trs_cmd
    {
    char CmdId;
    char CmdLen[4+1];
    char *CmdBuf;
    }TRS_CMD;结果结构体TRS_RESULT
    定义
    typedef struct trs_result
    {
    char Status;
    char Rows[4+1];
    char Cols[4+1];
    char ResultLen[8+1];
    char *ResultBuf;
    }TRS_RESULT;请朋友们帮忙!!!
      

  4.   

    Yes,是ByRef不是ByDef,是我写错了。不过这儿我通常都是什么都不写的 :)“楼上的朋友们:我刚才试过了还是不行呀。”
    说说是什么错误信息?还是返回的结果错误?
    另外我想问一下,为什么总是定义 char  Rows[4+1]; 而不直接用 char  Rows[5]呢?有什么来历?
      

  5.   

    我运行的错误是:返回结果不正确。
    定义 char  Rows[4+1]; 而不直接用 char  Rows[5],没什么区别吧。这是给我动态连接库Trsbp.dll的人这样给我注明的。
    另外要说的就是:结构引用中含有指针怎么处理啊?
      

  6.   

    使用 AddressOf 来得到变量或者函数的地址(指针)。比如说刚才的例子:Result=TRSbp_cmd(AddressOf trs_cmd,AddressOf trs_result)这两个AddressOf就分别得到这两个struct的地址(指针)。在声明函数或者过程时,使用Long类型来代替指针类型。比如,你的函数int  TRSbp_cmd(TRS_CMD *trs_cmd,TRS_RESULT *trs_result);就可以这样声明:Declare Function TRSbp_cmd Lib "trsbp.dll" (TRS_CMD As Long,TRS_RESULT As Long) As Integer
      

  7.   

    Result=TRSbp_cmd(AddressOf trs_cmd,AddressOf trs_result)
    在trs_result里面还有指针,并且这个指针是由动态连接库分配内存空间:
    typedef struct trs_result
    {
    char Status;
    char Rows[4+1];
    char Cols[4+1];
    char ResultLen[8+1];
    char *ResultBuf;
    }TRS_RESULT;
      

  8.   

    VB会对结构体的元素自动进行边界对其(n字节的数据位与n的倍数的地址),这样就在中间多了几个填充字节
    而VC不会自动进行边界对其,那些填充字节会搅乱正常的数据解决方案有两种:
    1.自己写代码手动对其
    2.修改原始声明1太麻烦了(处理一个元素就需要一行代码),建议使用2:
    -----------------------------------------------------------/*将char改成BYTE是为了避免UniCode问题*/typedef struct trs_cmd
    {
    BYTE CmdId;       //0
    BYTE CmdLen[4+1]; //1
            BYTE    fillbytes[2];//6
    BYTE *CmdBuf;     //8(*CmdBuf是指针,在Win32下指针是32位——4字节)
    }TRS_CMD;
    int WINAPI TRSbp_cmd(TRS_CMD *trs_cmd); //VB只支持__stdcall协议的函数
    typedef struct trs_result
    {
    BYTE Status;        // 0
    BYTE Rows[4+1];     // 1
    BYTE Cols[4+1];     // 6
    BYTE ResultLen[8+1];//11
    char *ResultBuf;    //20(正好对其)
    }TRS_RESULT;
    --------------------------------------------Private Type Declare Function TRSbp_cmd Lib "Trsbp.dll" (ByRef TRS_CMD As TRS_CMD, ByRef TRS_RESULT As TRS_RESULT) As LongPrivate Type TRS_CMD
        CmdId As Byte
        CmdLen(0 To 4) As Byte
        CmdBuf As Long
    End TypePrivate Type TRS_RESULT
        Status As Byte
        Rows(0 To 4) As Byte
        Cols(0 To 4) As Byte
        ResultLen(0 To 8) As Byte
        ResultBuf As Long
    End Type