背景信息:
PC通过SOCKET收到一数据包(包头+数据长度+数据),其中数据由用户ID+用户心率组成,但数据个数不固定(N*(用户ID+用户心率)。
要求:
写一个DLL解包过滤出用户信息(用户ID+用户心率),无疑要用结构体数组来实现!
问题:
不知道如何编写通过DLL输出一个结构体数组供其它程序调用!或者提供其它方法,DLL是必须的!

解决方案 »

  1.   

    可以传递1个指针指向你的Buf(N*(用户ID+用户心率)),然后,简单的拆个Buf就OK了,很容易的
      

  2.   

    你的DLL里面的函数不是只作解包的处理吗?那么在主程序中调用的时候肯定要根据接收到的数据长度动态的分配内存,然后将保存数据的buff和数据长度信息作为参数传递给函数。在DLL中没有必要分配空间啊。
    结构体数组最好也在主程序中创建,只是将指针传递给DLL的函数就可以了。
      

  3.   

    heluqing,我的DLL只做解包处理,虽然用户可以知道收到数据的长度,但他只能知道原始数据长度(SOCKET收以的数据长度,包头+数据长度+数据+包尾),原始数据是经过处理的,用户根本不能自己分析其内容,所以才有了此DLL的产生,DLL就是专门为解包的,用户只能通过调用DLL提供的函数,获取数据,否则不能获取真实信息。
      

  4.   

    这很难么?不论是结构体也好,数组也好.道理都是一样的.通过指针来操作数据,同时返回数据.呵~~,这个示例代码:
    type  TBuffer=array [0..255] of byte;function GetUserData(var buffer:Tbuffer):byte;stdcall;所有的用户数据都用BUFFER来处理并回调.
    至于数据的解析,你可以在应用软件中来实现了.这个并不麻烦. .^_^.
      

  5.   

    不行就用内存映射吧, dll  和应用程序共享一块内存,很好用的
      

  6.   

    数据包是EXE获得,并传递给DLL函数吧。如果数据包格式简单,例如数据包的“数据长度”可以描述数据量,那么可以在EXE里面开辟动态缓冲区,并将缓冲区地址传递给DLL。否则,也就是说,在EXE里面无法判断数据量,那么如下处理:
    1.先传递给函数1,函数1判断数据量,EXE根据返回的数据量生成缓冲区,然后调用函数2,由函数2进行数据拆分。2.直接将数据包传递给DLL,并传递窗口句柄,DLL使用消息方式返回数据,由窗口接收消息。3.直接将数据包传递给DLL,并提供回调函数,DLL使用回调函数返回数据。
      

  7.   

    用动态数组,在运行时分配空间//DLL中的函数
    function DllFunc(Data : Pointer;DataLength : Integer;DataCount : Integer) : Integer;
    type
      //假定数据内容
      pData = ^TData;  TData = record
        id : Integer;
        name : array [0..9] of char;
      end;
    var
      P : pData;
      i : Integer;
      DadaItem : TData;
    begin
      P := Data;
      for i:=0 to DataCount-1 do
      begin
        DadaItem := pData(p)^;
        inc(p);
      end;end;procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
    type
      //假定数据头占10Byte
      TDataHeader = record
        value : array [0..9] of char;
      end;  //假定数据内容
      TData = record
        id : Integer;
        name : array [0..9] of char;
      end;  //假定用4Byte存放个数
      TCount = array[0..3] of Byte;var
      BufferCount : Integer;
      Buffer : array of Byte;
      a : array of TData;
      aCount : TCount;
      iCount : DWORD;begin
      a := nil;
      if not AThread.Terminated and AThread.Connection.Connected then
      begin
        //读取Buffer
        BufferCount := AThread.Connection.ReadFromStack;
        SetLength(Buffer,BufferCount);
        AThread.Connection.ReadBuffer(Buffer[0],BufferCount);    //从Buffer读取个数放入一个数组
        Move(Buffer[SizeOf(TDataHeader)],aCount[0],Length(aCount));
        //初始化整型变量
        FillMemory(@iCount,SizeOf(DWORD),0);
        //数组中的内容写入整型变量
        Move(aCount[0],iCount,Length(aCount));    //给data数组分配内存空间
        SetLength(a,iCount*SizeOf(TData));
        //从Buffer中读取数据
        Move(Buffer[SizeOf(TDataHeader)+Length(aCount)],
          a[0],
          Length(aCount));    //调用Dll中的函数
        DllFunc(@a[0],Length(aCount),iCount);  end;
    end;
      

  8.   

    呵呵,主要是数据长度不固定啊,内存空间分配不能确定其大小,怎么办?
    方法1. 先getlen
    方法2. 传接口
    方法3. sharemem
    方法4. MapViewOfFile
    .......
      

  9.   

    DLL和exe是在同一个内存空间,直接传指针就可以
    用内存映射有点小题大做了