C#调用非托管DLL(VC) 内存错误

yaohua1210 2012-06-24 09:16:22
非托管调用Dll D1, D1又去调用DLL D2, 提示尝试读取或写入受保护的内存的错误,通过写日志发现是D1调用D2出现的错误,
但是在VC下调用时正常的。

求解!!!!!
...全文
200 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
yaohua1210 2012-06-25
  • 打赏
  • 举报
回复
问题已经解决了, 是我粗心大意了, 把DLL路径弄错导致的!
lanwah 2012-06-25
  • 打赏
  • 举报
回复
你调用的 IRP_RAStartRealAudio() 是无参函数,而里面有用到 &m_lAudioPlayer 变量,而就调用
IRP_RAStartRealAudio()函数而言,&m_lAudioPlayer变量的定义是不可能完成的!
lanwah 2012-06-25
  • 打赏
  • 举报
回复
是你在把非托管的代码,如C++封装好的API函数在C#中用DllImport中引入的时候 声明该函数有错误!

IRP_RAStartRealAudio()函数:
{
WRITE_LOG(LOG_LEVEL_HIGHEST, "CIRealAudio::StartRealAudio(%08X, IO:%d)", this, m_bStartIO);
if (m_bStartIO)
{
return IDIR_FALSE;
}
WRITE_LOG(LOG_LEVEL_HIGHEST, "CIRealAudio::IDEC_OpenAudioPlayer1(%08X)", &m_lAudioPlayer);
IDEC_OpenAudioPlayer(NULL, &m_lAudioPlayer);
WRITE_LOG(LOG_LEVEL_HIGHEST, "CIRealAudio::IDEC_OpenAudioPlayer2(%08X)", &m_lAudioPlayer);
}

IDEC_OpenAudioPlayer(NULL, &m_lAudioPlayer)这里执行出错
这个函数中有一个变量 &m_lAudioPlayer 在这个函数里面可定是没声明的把,在你的C++里面应该是全局变量,可是如果就用C#来调用而已,这个变量是不可能定义的,所以错误应该就在这个参数上!
yaohua1210 2012-06-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

vc写的dll有个毛病,就是错误的代码通常都可以执行,所以报错的地方通常不是写错的地方,你发现“D1调用D2出现的错误”其实用处不大,因为可能错的地方在前面,

一般是参数错,
[/Quote]
那我在仔细检查下。


stonespace 2012-06-24
  • 打赏
  • 举报
回复
vc写的dll有个毛病,就是错误的代码通常都可以执行,所以报错的地方通常不是写错的地方,你发现“D1调用D2出现的错误”其实用处不大,因为可能错的地方在前面,

一般是参数错,
yaohua1210 2012-06-24
  • 打赏
  • 举报
回复
在线等答案!!!
yaohua1210 2012-06-24
  • 打赏
  • 举报
回复
IRP_RAStartRealAudio()函数:
{
WRITE_LOG(LOG_LEVEL_HIGHEST, "CIRealAudio::StartRealAudio(%08X, IO:%d)", this, m_bStartIO);
if (m_bStartIO)
{
return IDIR_FALSE;
}
WRITE_LOG(LOG_LEVEL_HIGHEST, "CIRealAudio::IDEC_OpenAudioPlayer1(%08X)", &m_lAudioPlayer);
IDEC_OpenAudioPlayer(NULL, &m_lAudioPlayer);
WRITE_LOG(LOG_LEVEL_HIGHEST, "CIRealAudio::IDEC_OpenAudioPlayer2(%08X)", &m_lAudioPlayer);
}

IDEC_OpenAudioPlayer(NULL, &m_lAudioPlayer)这里执行出错
yaohua1210 2012-06-24
  • 打赏
  • 举报
回复
IRP_RAStartRealAudio()这里出错。
足球中国 2012-06-24
  • 打赏
  • 举报
回复
楼主应该给个调用哪个函数出的错吧。
__天涯寻梦 2012-06-24
  • 打赏
  • 举报
回复
具体执行到哪个函数出的错,函数里做了什么
yaohua1210 2012-06-24
  • 打赏
  • 举报
回复
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
[DllImport(@"C:\Users\lenovo\Desktop\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\Bin\IRealPlay.Dll", CharSet = CharSet.Ansi)]
static extern int IRP_Initialize(int nType);
[DllImport(@"C:\Users\lenovo\Desktop\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\Bin\IRealPlay.Dll", CharSet = CharSet.Ansi)]
static extern int IRP_UnInitialize();
//语音监听
[DllImport(@"C:\Users\lenovo\Desktop\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\Bin\IRealPlay.Dll", CharSet = CharSet.Ansi)]
static extern int IRP_RAOpenRealAudio( String szIP, ushort usPort, String szDevIDNO, int nChn, ref int lpRealHandle);
[DllImport(@"C:\Users\lenovo\Desktop\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\Bin\IRealPlay.Dll", CharSet = CharSet.Ansi)]
static extern int IRP_RAStartRealAudio(int lRealHandle);
[DllImport(@"C:\Users\lenovo\Desktop\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\Bin\IRealPlay.Dll", CharSet = CharSet.Ansi)]
static extern int IRP_RAStopRealAudio(int lRealHandle);
[DllImport(@"C:\Users\lenovo\Desktop\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\Bin\IRealPlay.Dll", CharSet = CharSet.Ansi)]
static extern int IRP_RAPlaySound(int lRealHandle, int lPlay);
[DllImport(@"C:\Users\lenovo\Desktop\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\Bin\IRealPlay.Dll", CharSet = CharSet.Ansi)]
static extern int IRP_RASetVolume(int lRealHandle, ushort wVolume);
[DllImport(@"C:\Users\lenovo\Desktop\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\Bin\IRealPlay.Dll", CharSet = CharSet.Ansi)]
static extern int IRP_RACloseRealAudio(int lRealHandle);

//语音对讲
[DllImport(@"C:\Users\lenovo\Desktop\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\Bin\IRealPlay.Dll", CharSet = CharSet.Ansi)]
static extern int IRP_TBOpenTalkback(String szIP, ushort usPort, String szDevIDNO, int nCh, ref int lpTalkbackHandle);
[DllImport(@"C:\Users\lenovo\Desktop\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\Bin\IRealPlay.Dll", CharSet = CharSet.Ansi)]
static extern int IRP_TBStartTalkback(int lTalkbackHandle);
[DllImport(@"C:\Users\lenovo\Desktop\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\Bin\IRealPlay.Dll", CharSet = CharSet.Ansi)]
static extern int IRP_TBStopTalkback(int lTalkbackHandle);
[DllImport(@"C:\Users\lenovo\Desktop\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\Bin\IRealPlay.Dll", CharSet = CharSet.Ansi)]
static extern int IRP_TBPlaySound(int lTalkbackHandle, int lPlay);
[DllImport(@"C:\Users\lenovo\Desktop\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\Bin\IRealPlay.Dll", CharSet = CharSet.Ansi)]
static extern int IRP_TBSetVolume(int lTalkbackHandle, ushort wVolume);
[DllImport(@"C:\Users\lenovo\Desktop\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\Bin\IRealPlay.Dll", CharSet = CharSet.Ansi)]
static extern int IRP_TBCloseTalkback(int lTalkbackHandle);




int lRealHandle = 0;
int lTalkBack = 0;

public IntPtr lTest = IntPtr.Zero;

public Form1()
{
lRealHandle = 0;
InitializeComponent();
IRP_Initialize(0);

}

private void button1_Click(object sender, EventArgs e)
{
StartMonitor("192.168.50.109", 8504, "10002", 1);

}

private void button2_Click(object sender, EventArgs e)
{

}

private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
IRP_UnInitialize();
}

private void StartMonitor(String szIP, ushort usPort, String szDevIDNO, int nChn)
{

StopMonitor();
StopTalkback();
if (0 == lRealHandle)
{

IRP_RAOpenRealAudio(szIP, usPort, szDevIDNO, nChn, ref lRealHandle);
// Marshal.
int nRet = IRP_RAStartRealAudio(lRealHandle);
if (0 != nRet)
{
StopMonitor();
}
else
{
IRP_RAPlaySound(lRealHandle, 1);
}

}
}
private void StopMonitor()
{
if(0 != lRealHandle)
{
IRP_RAStopRealAudio(lRealHandle);
IRP_RACloseRealAudio(lRealHandle);
lRealHandle = 0;
}
}
private void StartTalkback(String szIP, ushort usPort, String szDevIDNO, int nChn)
{
StopMonitor();
StopTalkback();
if (0 == lTalkBack)
{

IRP_TBOpenTalkback(szIP, usPort, szDevIDNO, nChn, ref lTalkBack);
//IRP_RASetRAudioMsgCallBack(m_lMonitor, this, FUNMonitorMsgCB);
int nRet = IRP_TBStartTalkback(lTalkBack);
if (nRet != 0)
{
IRP_TBStopTalkback(lTalkBack);
IRP_TBCloseTalkback(lTalkBack);

lTalkBack = 0;
}
else
{
StopTalkback();
}
}

}
private void StopTalkback()
{
if (0 != lTalkBack)
{
IRP_TBStopTalkback(lTalkBack);
IRP_TBCloseTalkback(lTalkBack);
lTalkBack = 0;
}
}

}


}



VC头文件


IREALPLAY_API int API_CALL IRP_Initialize(int nType);
IREALPLAY_API int API_CALL IRP_UnInitialize();

//语音监听
IREALPLAY_API int API_CALL IRP_RAOpenRealAudio(const char* szIP, unsigned short usPort, const char* szDevIDNO, int nChn, long* lpRealHandle);
IREALPLAY_API int API_CALL IRP_RAStartRealAudio(long lRealHandle);
IREALPLAY_API int API_CALL IRP_RAStopRealAudio(long lRealHandle);
IREALPLAY_API int API_CALL IRP_RAPlaySound(long lRealHandle, long lPlay);
IREALPLAY_API int API_CALL IRP_RASetVolume(long lRealHandle, WORD wVolume);
IREALPLAY_API int API_CALL IRP_RACloseRealAudio(long lRealHandle);

//语音对讲
IREALPLAY_API int API_CALL IRP_TBOpenTalkback(const char* szIP, unsigned short usPort, const char* szDevIDNO, int nChn, long* lpTalkbackHandle);
IREALPLAY_API int API_CALL IRP_TBStartTalkback(long lTalkbackHandle);
IREALPLAY_API int API_CALL IRP_TBStopTalkback(long lTalkbackHandle);
IREALPLAY_API int API_CALL IRP_TBPlaySound(long lTalkbackHandle, long lPlay);
IREALPLAY_API int API_CALL IRP_TBSetVolume(long lTalkbackHandle, WORD wVolume);
IREALPLAY_API int API_CALL IRP_TBCloseTalkback(long lTalkbackHandle);

__天涯寻梦 2012-06-24
  • 打赏
  • 举报
回复
D1 函数的代码和 C# 声明的方法和调用代码 能否贴出来看下

110,535

社区成员

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

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

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