c#定义c++结构

myminimouse 2010-05-06 05:09:20
#define MAX_WIDTH 704
#define MAX_HEIGHT 576
#define Y_size (MAX_WIDTH*MAX_HEIGHT)
#define U_size (MAX_WIDTH*MAX_HEIGHT/4)
#define V_size U_size

typedef struct _YUVDescriptor_t_ {
long long llPts;
BYTE Y[Y_size];
BYTE U[U_size];
BYTE V[V_size];
UINT uiWidth;
UINT uiHeight;
} YUV_DESC;

LVP_SDK_CMI_API BOOL LVP_SDK_CMI_DecodeVideoData(HWND hDecoder,void * pFrame,YUV_DESC *pYUV);

pFrame为输入参数,pYUV为输出参数
...全文
386 53 打赏 收藏 转发到动态 举报
写回复
用AI写文章
53 条回复
切换为时间正序
请发表友善的回复…
发表回复
lh1611 2010-05-14
  • 打赏
  • 举报
回复
访问的是非托管内存,记得在类的定义前面加unsafe关键字,如
public unsafe class MyProj
{
public const int MAX_WIDTH = 704
...
}
lh1611 2010-05-14
  • 打赏
  • 举报
回复
访问的是非托管内存,记得在类的定义前面加unsafe关键字,如
public unsafe class MyProj
{
public const int MAX_WIDTH = 704
...
}
lh1611 2010-05-14
  • 打赏
  • 举报
回复
访问的是非托管内存,记得在类的定义前面加unsafe关键字,如
public unsafe class MyProj
{
public const int MAX_WIDTH = 704
...
}
soaringbird 2010-05-14
  • 打赏
  • 举报
回复
如果你用03的话,你还是用一个byte[]代替结构吧
xingyuebuyu 2010-05-12
  • 打赏
  • 举报
回复
        [DllImport("sdk.dll", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)]
public static extern bool LVP_SDK_CMI_DecodeVideoData(int hDecoder,ref byte[] pFrame, IntPtr pYUV);


在我看来,调用LVP_SDK_CMI_DecodeVideoData在参数有问题的情况下应该是得到的数据有问题,即pYUV所指向的内容可能不正确,你之前提到的空引用是怎么产生的?
pFrame的内容是如何得到的,确定是正确的吗?
xk1126 2010-05-12
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 li45214521 的回复:]
C# code
public unsafe struct YUV_DESC
{
public const int MAX_WIDTH = 704;
public const int MAX_HEIGHT = 576;
public const int Y_size = (MAX_WIDTH * MAX_HEIGHT);
……
[/Quote]
指针
li45214521 2010-05-12
  • 打赏
  • 举报
回复
如何寻找XUV值,当然取地址,使用指针了 ,调用过程像Fixed结构体一样
如何会抛出已成 ,当然你子结构体中定义的BYte[]没有初始化,封送器找不到内存
li45214521 2010-05-12
  • 打赏
  • 举报
回复
可以使用这个内存布局


[StructLayout(LayoutKind.Explicit,Size = Y_size + U_size + V_size+12)]
public unsafe struct YUV_DESC
{
public const int MAX_WIDTH = 704;
public const int MAX_HEIGHT = 576;
public const int Y_size = (MAX_WIDTH * MAX_HEIGHT);
public const int U_size = (MAX_WIDTH * MAX_HEIGHT / 4);
public const int V_size = U_size;

[FieldOffset(0)]
public int llPts;

[FieldOffset(3)]
public byte Y;

[FieldOffset(Y_size+3)]
public byte U;

[FieldOffset(Y_size+U_size+3)]
public byte V;

[FieldOffset(Y_size+U_size+V_size+3)]
public uint uiWidth;

[FieldOffset(Y_size + U_size + V_size + 7)]
public uint uiHeight;
}
myminimouse 2010-05-12
  • 打赏
  • 举报
回复
LVP_SDK_CMI_DecodeVideoData函数是将byte[] pFrame中的内容Decode为YUV_DESC吗?

是的

myminimouse 2010-05-12
  • 打赏
  • 举报
回复
谢谢大家,我测试下
li45214521 2010-05-12
  • 打赏
  • 举报
回复
呵呵 可以使用以前的内存布局
xingyuebuyu 2010-05-12
  • 打赏
  • 举报
回复
        [DllImport("sdk.dll", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)]
public static extern bool LVP_SDK_CMI_DecodeVideoData_Args(int hDecoder,byte[] pFrame,
ref int pllPts,byte[] Y,byte[] U,byte[] V,ref uint puiWidth,ref uint puiHeight);



调用LVP_SDK_CMI_DecodeVideoData_Args方法之前Y,U,V数组要先申请空间.
如果Y,U,V数组是在DLL内部分配的空间,那要通过ref方式调用

        [DllImport("sdk.dll", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)]
public static extern bool LVP_SDK_CMI_DecodeVideoData_Args(int hDecoder,byte[] pFrame,
ref int pllPts,ref byte[] Y,ref byte[] U,ref byte[] V,ref uint puiWidth,ref uint puiHeight);

oneatree 2010-05-12
  • 打赏
  • 举报
回复
mark
dlsgliss 2010-05-12
  • 打赏
  • 举报
回复
路过,帮顶!
myminimouse 2010-05-12
  • 打赏
  • 举报
回复
pFrame肯定没问题的

现在dll方法改成
LVP_SDK_CMI_API BOOL SWITCH_STDCALL LVP_SDK_CMI_DecodeVideoData_Args(HWND hDecoder,void * pFrame,
long long *pllPts,BYTE *Y,BYTE *U,BYTE *V,UINT *puiWidth,UINT *puiHeight)

就是把结构分成几个参数传出来,这样要怎么写呢
xingyuebuyu 2010-05-11
  • 打赏
  • 举报
回复
把你的调用代码贴出来看看。
空引用发生在哪一行?


LVP_SDK_CMI_DecodeVideoData(m_IntPtr, pFrame, ii);
前面的2个参数如何赋值的?
myminimouse 2010-05-11
  • 打赏
  • 举报
回复
To xingyuebuyu
调用的时候出空引用的错误
myminimouse 2010-05-11
  • 打赏
  • 举报
回复
谢谢 xingyuebuyu
我试一下
只在此山中 2010-05-11
  • 打赏
  • 举报
回复
分别在C++和C#中分别用sizeof()和Marshal.Sizeof( )看看结构的大小,这样就知道问题在哪了。
还有如果c#中要c++回写数据,函数需加ref,如pucRGBbuf需要返回数据,则:
[DllImport("sdk.dll", ExactSpelling=true, CharSet=CharSet.Ansi, SetLastError=true)]
public static extern bool LVP_SDK_CMI_YUV2RGB24(YUV_DESC pYUV,ref byte[] pucRGBbuf,uint uiSizeOfRgbBuf);
ProjectDD 2010-05-11
  • 打赏
  • 举报
回复
路过不懂
加载更多回复(33)

110,536

社区成员

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

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

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