Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#程序访问ViolationException中的Win32 DLL_C#_Winapi_Dll - Fatal编程技术网

C#程序访问ViolationException中的Win32 DLL

C#程序访问ViolationException中的Win32 DLL,c#,winapi,dll,C#,Winapi,Dll,所以,我遇到了一个由来已久的问题:“我更改了代码,但它不起作用,但后来我又更改了代码,它仍然不起作用”。作为作业的一部分,我们一直在使用DLL,讲师给了我们播放和录制声音的代码,这些代码应该放在DLL中,然后用在我们自己的C#程序中。昨天,它工作得很好,但后来我试图找出我的一些代码是否冗余,我设法打破了它 从主程序调用启动函数initDialog,我现在得到一个AccessViolationException。我很清楚,大多数时候,当你遇到这个问题时,是因为你试图使用一些未初始化的东西。但是,我

所以,我遇到了一个由来已久的问题:“我更改了代码,但它不起作用,但后来我又更改了代码,它仍然不起作用”。作为作业的一部分,我们一直在使用DLL,讲师给了我们播放和录制声音的代码,这些代码应该放在DLL中,然后用在我们自己的C#程序中。昨天,它工作得很好,但后来我试图找出我的一些代码是否冗余,我设法打破了它

从主程序调用启动函数
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);