c# 调用c dll 时出现尝试读取或写入受保护的内存,这通常指示其他内存已损坏

boytomato 2007-06-18 04:30:19

typedef struct{
DWORD dwYear; //年
DWORD dwMonth; //月
DWORD dwDay; //日
DWORD dwHour; //时
DWORD dwMinute; //分
DWORD dwSecond; //秒
}NET_DVR_TIME,*LPNET_DVR_TIME;

NET_DVR_API LONG __stdcall NET_DVR_FindNextFile(LONG lFindHandle,LPNET_DVR_FIND_DATA lpFindData);




public struct NET_DVR_TIME
{
public int dwYear; /* 年 */
public int dwMonth; /* 月 */
public int dwDay; /* 日 */
public int dwHour; /* 时 */
public int dwMinute; /* 分 */
public int dwSecond; /* 秒 */
}
public struct NET_DVR_FIND_DATA
{
public string sFileName; /* 文件名 */
public NET_DVR_TIME struStartTime; /* 文件的开始时间 */
public NET_DVR_TIME struStoptime; /* 文件的结束时间 */
public int dwFileSize; /* 文件的大小 */
}

[DllImport("HCNetSDK.dll")]
public static extern int NET_DVR_FindNextFile(int lFindHandle, ref NET_DVR_FIND_DATA lpFindData);


NET_DVR_FIND_DATA strFileInfo=new NET_DVR_FIND_DATA ();

bRet = NET_DVR_FindNextFile(m_lFileHandle, ref strFileInfo);
...全文
826 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
badnewfish 2008-12-18
  • 打赏
  • 举报
回复
尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
当c#调用其它语言封装的dll时候,有可能会出现这个错误。

1、先来看看dll说明文档里面的函数原型说明:

int GetItemNames(char* sName,WORD wItemId);

2、分析发现:char* 是个令人头疼的问题,如果转换成以下c#代码运行时就会出错:

[DllImport("kingvewcliend.dll")]

public static extern int GetItemNames(string sName, int wItemId);

3、正确的转换方法是:

[DllImport("kingvewcliend.dll")]

public static extern int GetItemNames(StringBuilder sName, int wItemId);

4、在主程序中正确的调用是:

StringBuilder regname = new StringBuilder(256);

GetItemNames(regname, i);



posted @ 2008-12-18 10:26 badnewfish 阅读(0) 评论(0) 编辑 收藏 网摘 所属分类: OPC 、常见异常及错误
boytomato 2007-06-19
  • 打赏
  • 举报
回复
public struct NET_DVR_FIND_DATA
{
/// <summary>
///
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
public string sFileName; /* 文件名 */
public NET_DVR_TIME struStartTime; /* 文件的开始时间 */
public NET_DVR_TIME struStoptime; /* 文件的结束时间 */

public int dwFileSize; /* 文件的大小 */
}

这样就好了,不过还是谢谢楼上哥们。。
zbking 2007-06-19
  • 打赏
  • 举报
回复
[MarshalAs(UnmanagedType.LPArray)]byte[] sFileName

然后在byte[] 转换成STRING 试试
boytomato 2007-06-19
  • 打赏
  • 举报
回复
沉了。。晕

boytomato 2007-06-18
  • 打赏
  • 举报
回复
typedef struct
{
char sFileName[100];//文件名
NET_DVR_TIME struStartTime;//文件的开始时间
NET_DVR_TIME struStopTime;//文件的结束时间
DWORD dwFileSize;//文件的大小
}NET_DVR_FIND_DATA,*LPNET_DVR_FIND_DATA;

短了一个,
我估计出错的地放就是
char sFileName[100];//这个结构体我改成了 string 和stringbuind 都报错。。


110,571

社区成员

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

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

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