C#程序访问ViolationException中的Win32 DLL
所以,我遇到了一个由来已久的问题:“我更改了代码,但它不起作用,但后来我又更改了代码,它仍然不起作用”。作为作业的一部分,我们一直在使用DLL,讲师给了我们播放和录制声音的代码,这些代码应该放在DLL中,然后用在我们自己的C#程序中。昨天,它工作得很好,但后来我试图找出我的一些代码是否冗余,我设法打破了它 从主程序调用启动函数C#程序访问ViolationException中的Win32 DLL,c#,winapi,dll,C#,Winapi,Dll,所以,我遇到了一个由来已久的问题:“我更改了代码,但它不起作用,但后来我又更改了代码,它仍然不起作用”。作为作业的一部分,我们一直在使用DLL,讲师给了我们播放和录制声音的代码,这些代码应该放在DLL中,然后用在我们自己的C#程序中。昨天,它工作得很好,但后来我试图找出我的一些代码是否冗余,我设法打破了它 从主程序调用启动函数initDialog,我现在得到一个AccessViolationException。我很清楚,大多数时候,当你遇到这个问题时,是因为你试图使用一些未初始化的东西。但是,我
initDialog
,我现在得到一个AccessViolationException
。我很清楚,大多数时候,当你遇到这个问题时,是因为你试图使用一些未初始化的东西。但是,我在代码中没有看到任何应该导致此问题的内容,调试器也没有给出任何关于原因的提示
我将发布我的initDialog
函数的代码和下面的变量声明,如有必要,我可以稍后发布更多的代码。我的想法是创建一个不可见的窗口来处理我发送的消息,这样我就不必在C#中处理消息
在主程序中,我有以下代码:
[DllImport("RecordDll.dll", CharSet = CharSet.Auto)]
public static extern int initDialog();
public PlayForm()
{
InitializeComponent();
this.Show();
initDialog();//AccessViolationException???
}
我想出来了。该异常由以下行生成:
*pSaveBuffer = (PBYTE)malloc(1);
当我将缓冲区更改为双指针到单指针时,我做出了一个错误的假设,即我所要做的就是取消对它的引用,然后对单指针进行malloc。但是,我从未对单个指针进行过malloce处理,因此无法取消对双指针的引用。添加此行解决了以下问题:
pSaveBuffer = (PBYTE*)malloc(1); //this line
*pSaveBuffer = (PBYTE)malloc(1);
你需要学习几项关键技能才能取得成功。首先也是最重要的当然是源代码控制,能够将程序恢复到其原始工作状态非常重要。您还需要学习如何调试本机代码,以便查看生成异常的语句。在该现场的现有Q+A中,所有项目均覆盖良好。也许还可以考虑一下分配一个1字节的存储缓冲区和多次注册窗口类的智慧。除了Hans的思考之外,我还想知道在最后的while循环中,您期望会发生什么。@rene while循环用于获取和处理WndProc中的消息。在本例中,我使用它来获取与播放和录制功能相关的消息。
pSaveBuffer = (PBYTE*)malloc(1); //this line
*pSaveBuffer = (PBYTE)malloc(1);