我在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(块)意味着我正在覆盖某人的堆,但我不知道如何解决这个问题。