typedef unsigned char   HI_U8;
typedef unsigned char   HI_UCHAR;
typedef unsigned long   HI_U32;
typedef unsigned __int64        HI_U64;
typedef void* HI_HDL;HI_S32 HI_DLLEXPORT Hi264DecFrame(
    HI_HDL  hDec,
    HI_U8*  pStream,
    HI_U32  iStreamLen,
    HI_U64  ullPTS,
    H264_DEC_FRAME_S *pDecFrame,
    HI_U32  uFlags );typedef struct hiH264_DEC_FRAME_S
{
    HI_U8*  pY;                  
    HI_U8*  pU;                  
    HI_U8*  pV;                   
    HI_U32  uWidth;               
    HI_U32  uHeight;             
    HI_U32  uYStride;             
    HI_U32  uUVStride;           
    HI_U32  uCroppingLeftOffset;  
    HI_U32  uCroppingRightOffset; 
    HI_U32  uCroppingTopOffset;   
    HI_U32  uCroppingBottomOffset;
    HI_U32  uDpbIdx;              
    HI_U32  uPicFlag;             
    HI_U32  bError;               
    HI_U32  bIntra;              
    HI_U64  ullPTS;               
    HI_U32  uPictureID;           
    HI_U32  uReserved;           
    H264_USERDATA_S *pUserData;   
} H264_DEC_FRAME_S;typedef struct hiH264_USERDATA_S
{
    HI_U32             uUserDataType;   
    HI_U32             uUserDataSize;   
    HI_UCHAR*          pData;           
    struct hiH264_USERDATA_S* pNext;   
} H264_USERDATA_S;

解决方案 »

  1.   

    http://topic.csdn.net/u/20090809/15/bc5644c0-7a28-4dec-98dd-9ec7d65db0bc.html?38000
    这方面的问题,都还没有解决,可以共同商讨
      

  2.   

    http://topic.csdn.net/u/20090809/15/bc5644c0-7a28-4dec-98dd-9ec7d65db0bc.html?38000
      

  3.   

    这个可能对你有所帮助:
    http://hi.baidu.com/2fred/blog/item/54c89a254b89aa6734a80f93.html
      

  4.   

     [DllImport("")]
            unsafe extern public static int Hi264DecFrame(void* hDec, byte* pStream, uint iStreamLen, ulong ullPTS, H264_DEC_FRAME_S* pDecFrame, uint uFlags);[StructLayout(LayoutKind.Sequential, Pack = 1)]
        public unsafe struct H264_DEC_FRAME_S
        {
            public byte* pY;
            public byte* pU;
            public byte* pV;
            public uint uWidth;
            public uint uHeight;
            public uint uYStride;
            public uint uUVStride;
            public uint uCroppingLeftOffset;
            public uint uCroppingRightOffset;
            public uint uCroppingTopOffset;
            public uint uCroppingBottomOffset;
            public uint uDpbIdx;
            public uint uPicFlag;
            public uint bError;
            public uint bIntra;
            public ulong ullPTS;
            public uint uPictureID;
            public uint uReserved;
            public H264_USERDATA_S* pUserData;
        }    [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public unsafe struct H264_USERDATA_S
        {
            public uint uUserDataType;
            public uint uUserDataSize;
            public byte* pData;
            public H264_USERDATA_S* pNext;
        }
      

  5.   

    To soaringbird:Hi264DecFrame第一个参数是前面用一个c++函数返回值保存的,类型是void*,我用的IntPtr。
    第二个参数如果用byte*,在c#里调用应该怎么传值呢?我是用的byte[]。按照我自己的方法调用的时候Hi264DecFrame的返回值是表示第一个参数为空或输出参数pDecFrame为空。
    第一个参数我调试看是有值的
      

  6.   

    C#里面也有void*。
    byte[]转换成byte*需要固定一下,
    fixed(byte* pb=byteArray)
    {
    在这里可以用pb这个指针。
    类似的可以把pb转成void*: void*pv=(void*)pb; 结构取地址后也可以这样转换。
    }IntPtr和*都可以互相转换使用的。
      

  7.   

    C#到C++的封送方式有Marshal方式和unsafe代码方式,各有方便和不方便的地方,我更常用unsafe代码,写起来跟C++类似,可以有指针,对指针进行运算,如 pb++,*pb=xxx之类的。
      

  8.   

    对,参数中的char*或 u char*,可以直接用byte[],如果是传入字符串,可以用string,传出字符串用StringBuilder
      

  9.   

    hiH264_DEC_ATTR_S attr = new hiH264_DEC_ATTR_S();
    //给attr赋值
    void* ip = CDll. Hi264DecCreate(&attr);
    hiH264_DEC_FRAME_S frame = new hiH264_DEC_FRAME_S();
    hiH264_USERDATA_S userdata = new hiH264_USERDATA_S();
    frame.pUserData = &userdata; FileStream fs //打开一个文件
    byte[] buffer = new byte[1024*50]; UInt32 len = (UInt32)(fs.Read(buffer,0,buffer.Length));
    UInt32 flag =(UInt32)( (len>0)?0:1);
    int rel =0;
    fixed(byte* pb=buffer) 
    rel = CDll.Hi264DecFrame(ip,pb,len,0,&frame,flag);现在 rel返回值正确了,但是frame.pUserData里的数据是空的。
    unsafe public struct hiH264_USERDATA_S
    {  
    public System.UInt32 uUserDataType; 
    public System.UInt32 uUserDataSize; 
    public byte* pData;
    public hiH264_USERDATA_S* pNext;
    }
    如果不写frame.pUserData = &userdata;这句,frame.pUserData都是空的。
      

  10.   

    用byte[]做参数rel返回值不对,用byte*返回正确
      

  11.   

    现在 rel返回值正确了,但是frame.pUserData里的数据是空的。 
    ---------
    pData是空的?这个也是个指针,估计你那个函数要往里填数据,一般这种东西都是调用方分配空间的,所以,你需要再弄一个byte[]给它。
      

  12.   

    typedef struct hiH264_USERDATA_S
    {
        HI_U32            uUserDataType; 
        HI_U32            uUserDataSize; 看样子这个字段是调用后pData的实际长度。
        HI_UCHAR*          pData;         
        struct hiH264_USERDATA_S* pNext; 

    所以给pData分配的容量要满足预计需求。
      

  13.   

    我也想过这样做,可是长度怎么写啊。
    在c++里调用直接申明一个hiH264_DEC_FRAME_S frame,然后传地址进去,frame.pUserData.pData就有值了。
    现在函数返回值是说数据已经正确返回了。
      

  14.   

    frame里的这个?
    H264_USERDATA_S *pUserData;  
    C++里也要分配空间呀,难道是被调用方分配的?
    把C++代码贴上来一些。
      

  15.   

    hi_u8 buf[1024];
    h264_dec_attr_s dec_attrbute;
    h264_dbc_frame_s dec_frame;
    hi_hdl handle =null;file* h264=null;
    h264 = fopen();
    给dec_attrbute赋值handle = hi264deccreate(&dec_attrbute);//上一个帖子问的,这个已经没问题了
    hi_u32 len 赋值
    hi_u32 flags 赋值
    hi_s32 rel =0;
    rel = hi264decframe(handle,buf,len,0,&dec_frame,flags)
    后面是处理dec_frame里的数据这个是c++.dll提供的开发文档,我把没用的都省略了
      

  16.   

    你怎么看到pData是空的,那个uUserDataSize是多少?
      

  17.   

    调试的时候看的
    uUserDataType=0
    uUserDataSize=0
    pData=null
    pNext=null
      

  18.   

    终于搞定了,pData已经有了。再看一下就结贴,谢谢soaringbird
      

  19.   

    申明hiH264_DEC_FRAME_S的时候我new了一下,应该是就分配了地址了。把new去掉,传出来就有数据了。
      

  20.   

    结构不一定需要new。当传结构指针的时候不用new,取地址就可以,传值的时候需要每个字段都初始化一下。
      

  21.   

    不必转换,你在vs中新建一个C++库,把dll封装一下。然后用C#调用。我都是这么干的。
      

  22.   

    #ifndef __HI_CONFIG__
    #define __HI_CONFIG__#include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdarg.h>
    #ifdef _WIN32
    #include <malloc.h>
    #include <windows.h>
    #include <process.h> 
    #endif
    #ifdef HI_DLL_CALL
    #define HI_DLLEXPORT __declspec( dllexport )
    #else 
    #define HI_DLLEXPORT 
    #endif
    #define CONSTVOID const void
    typedef unsigned char   HI_U8;
    typedef unsigned char   HI_UCHAR;
    typedef unsigned short  HI_U16;
    typedef unsigned long   HI_U32;
    typedef signed char     HI_S8;
    typedef signed short    HI_S16;
    typedef signed long     HI_S32;
    typedef char            HI_CHAR;
    typedef char*           HI_PCHAR;
    typedef float           HI_FLOAT;
    typedef double          HI_DOUBLE;
    typedef void            HI_VOID;
    typedef enum {
        HI_FALSE = 0,
        HI_TRUE  = 1,
    } HI_BOOL;#define HI_NULL                 0L
    #define HI_NULL_PTR             HI_NULL#define HI_SUCCESS              0
    #define HI_FAILURE              (-1)#define  HI_LITTLE_ENDIAN       1234      
    #define  HI_BIG_ENDIAN          4321      
    #define  HI_DECODER_SLEEP_TIME  60000
    #ifdef _MSC_VER
    typedef __int64                 HI_S64;
    typedef unsigned __int64        HI_U64;
    #endif#if defined __INTEL_COMPILER || defined __GNUC__
    typedef long long               HI_S64;
    typedef unsigned long long      HI_U64;
    #endif#ifdef _WIN32
    #define  HiSleep(x)  Sleep(x)
    #endif#endif __HI_CONFIG__#ifndef __HI_H264API__
    #define __HI_H264API__
    #define  HI_H264DEC_OK               0
    #define  HI_H264DEC_NEED_MORE_BITS  -1
    #define  HI_H264DEC_NO_PICTURE      -2
    #define  HI_H264DEC_ERR_HANDLE      -3typedef void* HI_HDL;
    typedef struct hiH264_USERDATA_S
    {
        HI_U32             uUserDataType;   //Type of userdata
        HI_U32             uUserDataSize;   //Length of userdata in byte
        HI_UCHAR*          pData;           //Buffer contains userdata stuff
        struct hiH264_USERDATA_S* pNext;    //Pointer to next userdata
    } H264_USERDATA_S;typedef struct hiH264_DEC_ATTR_S
    {
        HI_U32  uPictureFormat;      
        HI_U32  uStreamInType;       
        HI_U32  uPicWidthInMB;        
        HI_U32  uPicHeightInMB;       
        HI_U32  uBufNum;              
        HI_U32  uWorkMode;            
        H264_USERDATA_S  *pUserData;  
        HI_U32  uReserved;
    } H264_DEC_ATTR_S;
    typedef struct hiH264_DEC_FRAME_S
    {
        HI_U8*  pY;                   
        HI_U8*  pU;                  
        HI_U8*  pV;                  
        HI_U32  uWidth;               
        HI_U32  uHeight;              
        HI_U32  uYStride;             
        HI_U32  uUVStride;            
        HI_U32  uCroppingLeftOffset;  
        HI_U32  uCroppingRightOffset; 
        HI_U32  uCroppingTopOffset;   
        HI_U32  uCroppingBottomOffset;
        HI_U32  uDpbIdx;              
        HI_U32  uPicFlag;             
        HI_U32  bError;              
        HI_U32  bIntra;               
        HI_U64  ullPTS;               
        HI_U32  uPictureID;           
        HI_U32  uReserved;            
        H264_USERDATA_S *pUserData;   
    } H264_DEC_FRAME_S;
    HI_HDL HI_DLLEXPORT Hi264DecCreate( H264_DEC_ATTR_S *pDecAttr );void HI_DLLEXPORT Hi264DecDestroy( HI_HDL hDec );HI_S32 HI_DLLEXPORT Hi264DecFrame(
        HI_HDL  hDec,
        HI_U8*  pStream,
        HI_U32  iStreamLen,
        HI_U64  ullPTS,
        H264_DEC_FRAME_S *pDecFrame,
        HI_U32  uFlags );