Использую P/Invoke для вызова wimm из C# и не уверен насчет сигнатур функций

Я пытаюсь вызвать Windows Multimedia API (winmm.dll) из C#, используя P/Invoke.

Причина в том, что я пытаюсь портировать некоторый неуправляемый код C++, который генерирует тоны с различной частотой и не имеет успеха с управляемыми библиотеками, и поэтому пытаюсь напрямую повторно использовать код C++, который уже работает очень хорошо.

Я начал с перехода на pinvoke.net и поиска различных сигнатур функций и вставки оттуда в предоставленные строки DllImport.

Что меня смутило, так это очевидное несоответствие того, как все отображается.

Например, функция waveOutPrepareHeader ( MS Docs, pinvoke.net). Второй аргумент - это указатель на структуру WAVEHDR. Страница pinvoke.net имеет смысл для меня в том смысле, что это должен быть IntPtr, который указывает на блок памяти, содержащий структуру. Я подготовил это, используя GlobalAlloc с GMEM_FIXED, а затем Marshal.StructureToPtr, чтобы заполнить данные. Затем я передаю указатель, возвращенный из GlobalAlloc, как IntPtr в функцию.

Однако для других функций, таких как waveOutOpen ( MS Docs, pinvoke.net) и waveOutWrite ( MS Docs, pinvoke.net), указатели на структуры передаются как ссылка на управляемую структуру, соответствующую неуправляемой структуре.

Почему разница? Как это работает при передаче ссылки на управляемую структуру? Слой P / Invoke просто обнаруживает это и выполняет отображение внутри?

Мне интересно, потому что я получаю нарушения прав доступа в некоторых случаях, когда код работает, и поэтому я пытаюсь пройти вызовы функций с помощью зубного гребня, и это просто не имеет смысла для меня.

0 ответов

Другие вопросы по тегам