使用PInvoke将struct传递给非托管DLL

时间:2014-10-27 15:49:02

标签: c# c++ .net opencv struct

由于与项目相关的几个限制而不是特别是这个问题,我试图通过PInvoke传递一个结构,其中包含与C#上位图的Mat构造函数相关的数据。
在C#中,我收到一个名为frame的Bitmap,并且为了访问我正在做的像素数据:

BitmapData data = frame.LockBits(new Rectangle(0,0,frame.Width,frame.Height), ImageLockMode.ReadWrite, frame.PixelFormat);

使用data.Scan0作为IntPtr我为非托管dll创建结构。显然,在调用我的外部函数后,我调用frame.UnlockBits(data);

这是代码
C#调用

[DllImport("ImageProcessingExtern", CallingConvention = CallingConvention.Cdecl)]
public static extern void drawLine(IntPtr objPtr, ref ExportBitmap bitmap);

C#Struct声明

[StructLayout(LayoutKind.Sequential, Pack=8)]
public struct ExportBitmap
{
    public int height;
    public int width;
    public IntPtr data;
    public int step;
    public int channels;
}

C ++函数声明

CVAPI(void) drawLine(ObjectsFinder* objPtr, ExportBitmap* bitmap) {
    cv::Mat testmat(cv::Size(bitmap->width, bitmap->height), CV_MAKETYPE(CV_8U, bitmap->channels), bitmap->data, bitmap->step);
}

C ++ Struct

#pragma pack(push, 8)
typedef struct ExportBitmap
{
    int height;
    int width;
    void* data;
    int step;
    int channels;
} ExportBitmap;
#pragma pack(pop)

到目前为止,只要我没有创建那个垫子,我的代码就可以工作了。如果我修改除IntPtr内部数据之外的任何参数,一切正常。当使用Mat构造函数行时,我得到一个错误,说DLL不是有效的Win32应用程序(来自kernel32 LoadLibrary()的错误代码193)

我已经被困了大约两周寻找解决方案,我仍然不确定发生了什么,我只能认为我是如何获得可编辑的位图数据的问题,但是我不确定它的问题是什么。

0 个答案:

没有答案