首页 > 解决方案 > 尝试从作为 IntPtr 传递的托管内存复制时与 memcpy 发生访问冲突

问题描述

我试图通过将两个指针传递给由 C#-Code 调用的 C++ 函数来简单地将一个缓冲区复制到另一个缓冲区。

也试过:

[DllImport(dllName, CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr ConvertYUV420pToRGB24(byte[] src, byte[] dst);

C++ 函数:

extern "C" __declspec(dllexport) uint8_t* __stdcall ConvertYUV420pToRGB24(uint8_t* src, uint8_t* dst) {
    errno_t err;

    err = memcpy_s(dst, 3110400, src, 3110400);

    if (err)
        return NULL;
    else
        return dst;
}

DLLImport

[DllImport(dllName, CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr ConvertYUV420pToRGB24(IntPtr src, IntPtr dst);

调用 C# 代码

GCHandle srcPtr;
GCHandle dstPtr;

byte[] result = new byte[3110400];
byte[] srcFrame = new byte[3110400];


srcPtr = GCHandle.Alloc(srcFrame);
dstPtr = GCHandle.Alloc(result);

FFmpegInterface.ConvertYUV420pToRGB24(GCHandle.ToIntPtr(srcPtr), GCHandle.ToIntPtr(dstPtr));

结果:访问冲突

预期:只需复制

标签: c#c++dllimportaccess-violationmemcpy

解决方案


推荐阅读