C# 调用dll结构指针 Attempted to read or write protected memory.

cthzr 2014-06-27 07:48:50
C#中调用win32 dll库,如下
[DllImport("NetLib.dll", CharSet = CharSet.Ansi)]
public static extern uint HI_NET_DEV_StartStream(uint lHandle, ref HI_S_STREAM_INFO struStreamInfo);

其函数原型为:
u32 NETSDK_APICALL HI_NET_DEV_StartStream(HI_U32 u32Handle, HI_S_STREAM_INFO* pstruStreamInfo);
HI_S_STREAM_INFO为一个结构体
public struct HI_S_STREAM_INFO
{
public uint u32Channel; /*通道号 */
public uint blFlag; /*HI_TRUE:连接主码流,HI_FALSE:连接次码流*/
public uint u32Mode; /*网络连接模式*/
public byte u8Type; /*流数据类型,视频,音频,其他数据*/
};
然后我在C#代码中写的程序运行如下代码后报错:
result = HI_NET_DEV_StartStream(lHandle, ref struStreamInfo);


An unhandled exception of type 'System.AccessViolationException' occurred in Monitor.exe

Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

求大神帮忙,在线等


...全文
1528 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cthzr 2014-06-28
  • 打赏
  • 举报
回复
引用 1 楼 only_endure 的回复:
[StructLayout(LayoutKind.Sequential)]
........
我已经加了[StructLayout(LayoutKind.Sequential)],但还是报同样的错误
cthzr 2014-06-28
  • 打赏
  • 举报
回复
引用 2 楼 only_endure 的回复:
调用非托管代码示例:
using System;
using System.Runtime.InteropServices;

namespace QQloginCont
{
	/// <summary>
	/// PlaySound 的摘要说明。
	/// </summary>
	public class PlaySound
	{
		public PlaySound()
		{
			//
			// TODO: 在此处添加构造函数逻辑
			//
		}
		[DllImport("winmm.dll")]
		private static extern long mciSendString(string strCommand,	string strReturn, int iReturnLength, IntPtr hwndCallback);
		private static void GetWavAndOpen(int SoundId)
		{
			string sFileName;
			switch(SoundId)
			{
				case 1://系统消息
					sFileName="sound\\System.wav";
					break;
				case 2://收到消息
					sFileName="sound\\Msg.wav";
					break;
				case 3://功能切换
					sFileName="sound\\Folder.wav";
					break;
				default:
					sFileName="sound\\Call.wav";
					break;
			}
			string sCommand = "open \"" + sFileName + "\" type mpegvideo alias MediaFile";	//   MediaFile是选择播放文件类型 
			string ret = null;
			mciSendString(sCommand, ret, 0, IntPtr.Zero);
		}
		public static void play(int SoundId)
		{
			StopPlay();
			GetWavAndOpen(SoundId);
			string sCommand = "play MediaFile";
			string ret = null;
			mciSendString(sCommand, ret, 0, IntPtr.Zero);
		}
		private static void StopPlay()
		{
			string sCommand = "close MediaFile";
			string ret = null;
			mciSendString(sCommand, ret, 0, IntPtr.Zero);
		}
	}
}
对于回调函数中的参数是结构体指针的应该怎么引用?
cthzr 2014-06-28
  • 打赏
  • 举报
回复
public struct HI_S_STREAM_INFO { public uint u32Channel; /*通道号 */ public uint blFlag; /*HI_TRUE:连接主码流,HI_FALSE:连接次码流*/ public uint u32Mode; /*网络连接模式*/ public byte u8Type; /*流数据类型,视频,音频,其他数据*/ }; 这是C#的
孤独de猫 2014-06-28
  • 打赏
  • 举报
回复
把你DLL 的 此结构体 和 原型贴出来。有可能是你C#的结构体类型与SDK有偏差,导致内存越界了。
真相重于对错 2014-06-27
  • 打赏
  • 举报
回复
public struct HI_S_STREAM_INFO { public uint u32Channel; /*通道号 */ public uint blFlag; /*HI_TRUE:连接主码流,HI_FALSE:连接次码流*/ public uint u32Mode; /*网络连接模式*/ public byte u8Type; /*流数据类型,视频,音频,其他数据*/ }; 这是c++的原型???
一品梅 2014-06-27
  • 打赏
  • 举报
回复
调用非托管代码示例:
using System;
using System.Runtime.InteropServices;

namespace QQloginCont
{
	/// <summary>
	/// PlaySound 的摘要说明。
	/// </summary>
	public class PlaySound
	{
		public PlaySound()
		{
			//
			// TODO: 在此处添加构造函数逻辑
			//
		}
		[DllImport("winmm.dll")]
		private static extern long mciSendString(string strCommand,	string strReturn, int iReturnLength, IntPtr hwndCallback);
		private static void GetWavAndOpen(int SoundId)
		{
			string sFileName;
			switch(SoundId)
			{
				case 1://系统消息
					sFileName="sound\\System.wav";
					break;
				case 2://收到消息
					sFileName="sound\\Msg.wav";
					break;
				case 3://功能切换
					sFileName="sound\\Folder.wav";
					break;
				default:
					sFileName="sound\\Call.wav";
					break;
			}
			string sCommand = "open \"" + sFileName + "\" type mpegvideo alias MediaFile";	//   MediaFile是选择播放文件类型 
			string ret = null;
			mciSendString(sCommand, ret, 0, IntPtr.Zero);
		}
		public static void play(int SoundId)
		{
			StopPlay();
			GetWavAndOpen(SoundId);
			string sCommand = "play MediaFile";
			string ret = null;
			mciSendString(sCommand, ret, 0, IntPtr.Zero);
		}
		private static void StopPlay()
		{
			string sCommand = "close MediaFile";
			string ret = null;
			mciSendString(sCommand, ret, 0, IntPtr.Zero);
		}
	}
}
一品梅 2014-06-27
  • 打赏
  • 举报
回复
[StructLayout(LayoutKind.Sequential)]
........

110,535

社区成员

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

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

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