我在做一个摄像头采集程序,需要引用C++生成的DLL中的一个函数,C++函数签名如下,在C#中该怎么定义呢?//index:摄像头编号
//pFrameBuf:用来接收一帧JPEG静态图片的缓冲区
//bufferLen:用来接收一帧JPEG静态图片的缓冲区
int capGetLastJpeg(int index,unsigned char *pFrameBuf,unsigned int bufferLen)C++获取、保存图片代码void MakeJpeg()
{
int length = 0;
int bufferLen = 40960;
PBYTE buffer = malloc (bufferLen);

length = capGetLastJpeg(0, buffer, bufferLen);
if (length)
{
HANDLE hFile = NULL;
DWORD dwWritten = 0; hFile = CreateFile(TEXT("\\out.jpg"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
WriteFile(hFile, buffer, length, &dwWritten, NULL);
CloseHandle(hFile); //MessageBox(NULL, TEXT("Write jpeg success."), TEXT("Notice"), MB_OK);
}
}

if (buffer)
{
free (buffer);
}
}
请问在C#中该怎么定义呢?
小弟分不多,只能用所有的积分了。
谢了!C++C#WINCE

解决方案 »

  1.   

    int就是int
    un char* 可以用byte[]
    un int unint32
      

  2.   


    也就是这样呗[DLLImport("asdf.dll")]
    public static extern int capGetLastJpeg(int index,ref byte[] pFrameBuf,unint32 bufferLen);然后将pFrameBuf里面的数据转换成图片是吧?
      

  3.   

    [DllImport("<Unknown>", EntryPoint="capGetLastJpeg")]
    public static extern  int capGetLastJpeg(int index, System.IntPtr pFrameBuf, uint bufferLen) ;
      

  4.   

    利用Marshal类可以很方便的将IntPtr地址的数据转换为任意结构体或结构体数组(例如byte[]),因此那样写肯定是不会报错的。
    当然你这里的情况,可以使用byte[]代替IntPtr,但是绝对不能添加ref关键字,ref关键字只能用在struct上,而byte[]是class,本身就是地址了,再传递地址的地址就错了。