C#调用C++ dll的问题,尝试读取或写入受保护的内存,这通常指示其他内存已损坏

coloriy 2007-08-02 12:59:56
用C++封装的DLL,其中函数用到结构,C++中的函数如下:
extern "C" bool __stdcall SaveBMPFile(LPCSTR lpFileName, BITMAPINFO* pBmpInfo, BYTE *pImageBuffer)
{
BOOL bRVal = FALSE;
DWORD dwBytesRead = 0;
DWORD dwSize = 0;
BITMAPFILEHEADER bfh = {0};
int nTable = 0;
DWORD dwImageSize = 0;

if (pBmpInfo->bmiHeader.biBitCount > 8) {
nTable = 0;
}
else{
nTable = 256;
}

dwImageSize =(((pBmpInfo->bmiHeader.biWidth * pBmpInfo->bmiHeader.biBitCount) + 31) / 32 * 4 )* pBmpInfo->bmiHeader.biHeight;

if (dwImageSize <= 0) {
bRVal = FALSE;
MessageBox(NULL,"dwImageSize <= 0",NULL,MB_OK);
}
else{
bfh.bfType = (WORD)'M' << 8 | 'B';
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + nTable * sizeof(RGBQUAD);
bfh.bfSize = bfh.bfOffBits + dwImageSize;

HANDLE hFile = ::CreateFile(lpFileName,
GENERIC_WRITE ,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (hFile == INVALID_HANDLE_VALUE) {
bRVal = FALSE;
MessageBox(NULL,"hFile= 0",NULL,MB_OK);

}
else{
dwSize = sizeof(BITMAPFILEHEADER);
::WriteFile(hFile, &bfh, dwSize, &dwBytesRead, NULL );

dwSize = sizeof(BITMAPINFOHEADER) + nTable * sizeof(RGBQUAD);
::WriteFile(hFile, pBmpInfo, dwSize, &dwBytesRead, NULL );

dwSize = dwImageSize;
WriteFile(hFile, pImageBuffer, dwSize, &dwBytesRead, NULL );

CloseHandle(hFile);
MessageBox(NULL,"Writefile= 0",NULL,MB_OK);


}
}

return bRVal;
}
----------------------------------
C#中声明的相关结构:
[StructLayout(LayoutKind.Sequential)]
public struct BITMAPFILEHEADER
{
public ushort bfType;
public int bfSize;
public ushort bfReserved1;
public ushort bfReserved2;
public uint bfOffBits;
}

[StructLayout(LayoutKind.Sequential)]
public struct BITMAPINFOHEADER
{
public uint biSize;
public int biWidth;
public int biHeight;
public ushort biPlanes;
public ushort biBitCount;
public uint biCompression;
public int biSizeImage;
public int biXPelsPerMeter;
public int biYPelsPerMeter;
public uint biClrUsed;
public uint biClrImportant;

}

[StructLayout(LayoutKind.Sequential)]
public struct RGBQUAD
{
public byte Red;
public byte Green;
public byte Blue;
public byte reserved;
}


[StructLayout(LayoutKind.Sequential)]
public struct BITMAPINFO
{
public BITMAPINFOHEADER header;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=1)]
public RGBQUAD[] bmiColors;
}
---------------
C#中调用DLL:
[DllImport("mydll.dll", EntryPoint = "SaveBMPFile",CharSet = CharSet.Ansi)]
public static extern bool SaveBMPFile( string filepath, ref BITMAPINFO bmpinfo, ref byte pImageBuffer);

----------------------------------------------------
C#中调用函数如下:
bool rsult = DH_CGCard.SaveBMPFile("E:\\Test" + i.ToString() + ".bmp", ref bminfo, ref pBuffer[0]);

-----------------------------
不能成功,提示尝试读取或写入受保护的内存,这通常指示其他内存已损坏,
--------------------------------------------------
问题:如何才能调用我的dll中的函数,C#中如何声明,拜托高手,定给高分,在线等!
...全文
1474 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wts_net 2009-11-30
  • 打赏
  • 举报
回复
学习
yinrongg 2008-09-26
  • 打赏
  • 举报
回复
MARK
coloriy 2007-08-06
  • 打赏
  • 举报
回复
谢谢上面朋友!
coloriy 2007-08-06
  • 打赏
  • 举报
回复
后来不知道怎么又好了,现在贴出来源码,不过不是上面这位朋友说的关于buffer的原因,下面是代码:
------------原函数声明不变------
请参考上面
----------
-----C#结构定义不变,后来发现如果C#和原来C++源文件中的结构定义字节数不同,则会导致上面错误,读不出结构体中的变量数值-----------
-------------引入函数-------------------
[DllImport("SaveBMPDll.dll", EntryPoint = "SaveBMPFile")]
public static extern bool SaveBMPFile(string filepath, ref BITMAPINFO bmpinfo, ref byte pImageBuffer);
---------------C#中调用-------------
bool rsult = DH_CGCard.SaveBMPFile(fpath + i.ToString() + ".bmp", ref bminfo, ref pBuffer[0]);
neucf 2007-08-02
  • 打赏
  • 举报
回复
你的用法中,第三个参数ref pBuffer[0]传的是pBuffer[0]里边的值,而不是pBuffer的首地址,所以会有问题
neucf 2007-08-02
  • 打赏
  • 举报
回复
以上方法感觉可行,但具体没试,请lz亲自实验一下吧
neucf 2007-08-02
  • 打赏
  • 举报
回复
首先,请确定你传入的参数在c#中都new过了。然后,试试以下的做法。
定义一个buffer
struct Buffer
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst=自己指定)]
public byte[] pBuffer;
}

然后,SaveBMPFile的第三个参数改成IntPtr类型的:
在使用之前,new一个Buffer,用System.Runtime.InteropServices.Marshal.StructureToPtr将new出来的Buffer的首地址搞出来,传进去。
coloriy 2007-08-02
  • 打赏
  • 举报
回复
能够进入函数,只是不能访问结构体里的数据

111,092

社区成员

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

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

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