c# 调用 c++.dll

myminimouse 2009-08-10 09:34:03
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;
...全文
466 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
mainsea 2011-10-13
  • 打赏
  • 举报
回复
哎,。。。。。。。。。。
mainsea 2011-10-13
  • 打赏
  • 举报
回复
额,来学习啦了
bsker 2010-05-31
  • 打赏
  • 举报
回复
正在做相关的,能否请教下,给你发消息了
soaringbird 2009-08-10
  • 打赏
  • 举报
回复
你用同样的数据在C++里试试。
这种调用方式应该是没有问题的,我都试过的
myminimouse 2009-08-10
  • 打赏
  • 举报
回复
调试的时候看的
uUserDataType=0
uUserDataSize=0
pData=null
pNext=null
soaringbird 2009-08-10
  • 打赏
  • 举报
回复
你怎么看到pData是空的,那个uUserDataSize是多少?
myminimouse 2009-08-10
  • 打赏
  • 举报
回复
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提供的开发文档,我把没用的都省略了
soaringbird 2009-08-10
  • 打赏
  • 举报
回复
frame里的这个?
H264_USERDATA_S *pUserData;
C++里也要分配空间呀,难道是被调用方分配的?
把C++代码贴上来一些。
myminimouse 2009-08-10
  • 打赏
  • 举报
回复
我也想过这样做,可是长度怎么写啊。
在c++里调用直接申明一个hiH264_DEC_FRAME_S frame,然后传地址进去,frame.pUserData.pData就有值了。
现在函数返回值是说数据已经正确返回了。
soaringbird 2009-08-10
  • 打赏
  • 举报
回复
typedef struct hiH264_USERDATA_S
{
HI_U32 uUserDataType;
HI_U32 uUserDataSize; 看样子这个字段是调用后pData的实际长度。
HI_UCHAR* pData;
struct hiH264_USERDATA_S* pNext;
}
所以给pData分配的容量要满足预计需求。
济南大飞哥 2009-08-10
  • 打赏
  • 举报
回复
做到这一步是不是就算厉害的了,实践的很多了;
soaringbird 2009-08-10
  • 打赏
  • 举报
回复
现在 rel返回值正确了,但是frame.pUserData里的数据是空的。
---------
pData是空的?这个也是个指针,估计你那个函数要往里填数据,一般这种东西都是调用方分配空间的,所以,你需要再弄一个byte[]给它。
myminimouse 2009-08-10
  • 打赏
  • 举报
回复
用byte[]做参数rel返回值不对,用byte*返回正确
myminimouse 2009-08-10
  • 打赏
  • 举报
回复
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都是空的。
soaringbird 2009-08-10
  • 打赏
  • 举报
回复
对,参数中的char*或 u char*,可以直接用byte[],如果是传入字符串,可以用string,传出字符串用StringBuilder
soaringbird 2009-08-10
  • 打赏
  • 举报
回复
C#到C++的封送方式有Marshal方式和unsafe代码方式,各有方便和不方便的地方,我更常用unsafe代码,写起来跟C++类似,可以有指针,对指针进行运算,如 pb++,*pb=xxx之类的。
yuanhuiqiao 2009-08-10
  • 打赏
  • 举报
回复
用的byte[]应该是正确的
soaringbird 2009-08-10
  • 打赏
  • 举报
回复
C#里面也有void*。
byte[]转换成byte*需要固定一下,
fixed(byte* pb=byteArray)
{
在这里可以用pb这个指针。
类似的可以把pb转成void*: void*pv=(void*)pb; 结构取地址后也可以这样转换。
}

IntPtr和*都可以互相转换使用的。
myminimouse 2009-08-10
  • 打赏
  • 举报
回复
To soaringbird:

Hi264DecFrame第一个参数是前面用一个c++函数返回值保存的,类型是void*,我用的IntPtr。
第二个参数如果用byte*,在c#里调用应该怎么传值呢?我是用的byte[]。

按照我自己的方法调用的时候Hi264DecFrame的返回值是表示第一个参数为空或输出参数pDecFrame为空。
第一个参数我调试看是有值的
soaringbird 2009-08-10
  • 打赏
  • 举报
回复
[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;
}
加载更多回复(11)

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧