我用delphi中的纪录模拟c中的远程结构体指针接收传回来的数据有报错!
C中的定义如下:
typedef enum {    STREAM_VIDEO_ONLY,
    STREAM_AUDIO_ONLY,
    STREAM_VIDEO_AUDIO,
    STREAM_UNKNOWN,} media_stream_type_t;typedef enum {    VIDEO_ALG_MPEG4,
    VIDEO_ALG_H263,
    VIDEO_ALG_UNKNOWN,} media_video_algorithm_t;typedef enum {    AUDIO_ALG_G711,
    AUDIO_ALG_G729,
    AUDIO_ALG_UNKNOWN,} media_audio_algorithm_t;typedef struct _FileInfoStruct
{
    media_stream_type_t streamType;
    struct
    {
        media_video_algorithm_t videoAlg;
        int frameRate;
        int srcWidth;
        int srcHeight; 
    }video;    struct
    {
        media_audio_algorithm_t audioAlg; 
    }audio;}FileInfoStruct;调用动态库中的函数如下:
BOOL GetFileInfo(LPSTR lpFilename,FileInfoStruct* pFileInfo);
//把lpFilename文件的信息读出存储到pFileInfo结构中来
我用delphi实现如下:
type media_video_algorithm_t
                 = (VIDEO_ALG_MPEG4,
                    VIDEO_ALG_H263,
                    VIDEO_ALG_UNKNOWN);type media_audio_algorithm_t
                 = (AUDIO_ALG_G711,
                    AUDIO_ALG_G729,
                    AUDIO_ALG_UNKNOWN);type media_stream_type_t
                 = (STREAM_VIDEO_ONLY,
                    STREAM_AUDIO_ONLY,
                    STREAM_VIDEO_AUDIO,
                    STREAM_UNKNOWN);type mpvideo = packed record     videoAlg : media_video_algorithm_t;
     frameRate:integer;
     srcWidth:integer;
     srcHeight:integer;
    end;type mpaudio = packed record
     audioAlg: media_audio_algorithm_t;
     end;type MPFileInfoStruct = record
     streamType: integer;
     video : mpvideo;
     audio : mpaudio;
     end;var 
  fileInfor: MPFileInfoStruct
/...
GetFileInfo(pCur.filename,fileInfo); ×××
/...我这样实现运行到×××出老是报错,而在VC中实现就没有任何问题,
我怀疑是结构定义错误,望高手指教错误之处!◎

解决方案 »

  1.   

    蔡鸟说一下
      1. 调用约定必须一样
      2. 字节对齐必须一样,象你的代码
    mpvideo和mpaudio都声明为1字节对齐,但是MPFileInfoStruct却是8字节对齐,那C代码的对齐是多少?  3. 最好声明也一样
    C的是
    BOOL GetFileInfo(LPSTR lpFilename,FileInfoStruct* pFileInfo);
    从你的
    var 
      fileInfor: MPFileInfoStructGetFileInfo(pCur.filename,fileInfo);
    调用中,估计你的函数声明类似于
    function GetFileInfo(lpFileName: PChar; pFileInfo: MPFileInfoStruct): Boolean; ...
    最好是改为type
      PMPFileInfoStruct = ^MPFileInfoStruct;function GetFileInfo(lpFileName: PChar; pFileInfo: PMPFileInfoStruct): Boolean;...
      

  2.   

    这些是基本常识你要看看你的C编译器的默认字节对齐设置,以及该函数声明时的对齐设置,C有一个编译指示符是关于对齐的,我忘了是什么,好像是#pragma pack(push, n)这样的,其中n就是对齐的边界。Delphi的对齐指示符看关于"$A"的帮助如果C那边是4字节对齐,那么你在Delphi里也必须{$A4}把这个指示符放在结构声明的前面