Эквивалент C ++ указатель «this» в C # - PullRequest
0 голосов
/ 30 июня 2018

Я пытаюсь перевести успешно работающую программу 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 # ссылается на текущий экземпляр класса.

...