Я пытаюсь перевести успешно работающую программу C ++ в C #, и в настоящее время я застрял при инициализации устройства вывода звука. Я хотел бы знать эквивалент указателя «this» в C #.
Ниже приведен рабочий код C ++:
DWORD WINAPI SCFStartOutSound(SCFHANDLE sohOwnerHandle, SCFHANDLE *pscfHandle, SCFEventOutSoundCallback lpfnEventCallback, BSTR FileName);
CCComBSTR FileName = "Out_DxSpeaker.dll";
HANDLE OutSoundHandle = NULL;
SCFStartOutSound(this, &OutSoundHandle, OnSCFEventOutSoundCallback, FileName);
Класс:
CTestAppDlg::CTestAppDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTestAppDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
Typedef:
typedef HANDLE SCFHANDLE;
Результат: устройство вывода звука правильно инициализировано
Инициализированное устройство вывода
Теперь вот мой код на C #:
[DllImport(DllFileName.dll)]
unsafe public static extern uint SCFStartOutSound(IntPtr OwnerHandle,IntPtr* soundoutHandle, SCFEventOutSoundCallback EventCallback, [MarshalAs(UnmanagedType.BStr)] string fileName);
unsafe
{
IntPtr soundOutPtr;
uint res = SCFStartOutSound(this.Handle, &soundOutPtr, onSoundOutEventCallback,"Out_DxSpeaker.dll");
MessageBox.Show(res.ToString());
}
Этот код приводит к исключению System.AccessViolationException.
Я знаю, что «this» в C ++ - это указатель, который содержит адрес памяти текущего объекта, в то время как «this» в C # ссылается на текущий экземпляр класса.