Ваше определение:
public static extern uint waveInGetErrorText(uint mmrError,
IntPtr pszText,
uint cchText);
... недостаточно, чтобы сообщить .NET, что IntPtr pszText
выводит что-либо. По умолчанию все параметры имеют компилятор с [in]
маршальными атрибутами. Таким образом, ваше вышеупомянутое определение эквивалентно:
public static extern uint waveInGetErrorText([in] uint mmrError,
[in] IntPtr pszText,
[in] uint cchText);
Теперь, если у вас было такое определение:
int CountRecords (out int numErrors)
... компилятор превращает это в:
int CountRecords ([out] out int numErrors)
... Я верю. В любом случае, out
(любая форма) говорит компилятору ожидать чего-то от p-invoke. Поскольку вы не указали out
или [out]
, после завершения вызова ничего не передается обратно в параметр.
Теперь вы можете использовать out string
, но StringBuilder
проще. Некоторые типы, такие как StringBuilder
, распознаются .NET как "эй, для этого параметра я ожидаю что-то взамен" . out
является необязательным.
Измените ваше определение на:
[DllImport("Winmm", EntryPoint = "waveInGetErrorText")]
public static extern uint waveInGetErrorText(uint mmrError, StringBuilder text, uint cchText);
Я полагаю, вы должны называть это так:
uint r = 12 // for example return value is 12
StringBuilder data = new StringBuilder(255);
r = waveInGetErrorText(r, data, data.Capacity);
Скажите мне больше