C#debug assertion中的win32失败CrtlsValidHeapPointer(块)

时间:2015-11-04 09:08:19

标签: c# c winapi

我在C#中调用win32 dll中的导出函数。我正在尝试录制音频,然后在我的C#程序中获取数据。至于win32,录制和播放所有工作,问题是当我开始记录时我得到调试断言失败,因为我正在尝试使用全局alloc,以便在两个应用程序之间全局共享数据的内存。

C#:

[DllImport("\\Wave Editor\\Wave Editor\\lib\\Record.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
unsafe public static extern Boolean StartDialog(Byte** d);

unsafe private void OpenRecord(object sender, EventArgs e) {
    unsafe Byte** recordSamples = (Byte**)Marshal.AllocHGlobal(1);

    if (StartDialog(recordSamples) == false)
        Debug.WriteLine("Dialog failed");
    else
        Debug.WriteLine("Dialog success");
}

与pSaveBuffer(共享内存)相关的win32代码的重要部分:

PBYTE pSaveBuffer;
switch (message)
{
case WM_INITDIALOG:

    // Allocate memory for save buffer
    pSaveBuffer = GlobalAlloc(GMEM_FIXED | GMEM_SHARE, 1);
    return 0;
case MM_WIM_CLOSE:
    GlobalFree(pSaveBuffer);
    return 0;
}

创建对话框的win32函数:

BOOL StartDialog(BYTE** b)
{
    b = &pSaveBuffer;
    if (CreateDialog(hdll, MAKEINTRESOURCE(DLG_RECORD), NULL, DlgProc) == NULL)
    {
        return FALSE;
    }
    return TRUE;
}

win32头文件:

#pragma once
#pragma comment(lib, "winmm.lib")

#include <Windows.h>

#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif

EXPORT BOOL StartDialog(BYTE** p);

这不是代码的实际布局,我把更紧密的东西放在一起尝试得到重点。我认为CrtlsValidHeapPointer(块)意味着我正在覆盖某人的堆,但我不知道如何解决这个问题。

0 个答案:

没有答案