Win32 API waveInGetErrorText声明进入C#

时间:2019-03-14 02:45:32

标签: c# winapi pinvoke

需要致电

MMRESULT waveInGetErrorText(
   MMRESULT mmrError,
   LPTSTR   pszText,
   UINT     cchText
);

来自C#代码。在PINVOKE.net上找不到声明。 该功能的描述为here

MMRESULT只是一个uint值。 0-没有错误。任何其他值,直到20-都是错误。

尝试了很多模式。始终返回一个空字符串。

[DllImport("Winmm", EntryPoint = "waveInGetErrorText")]
public static extern uint waveInGetErrorText(uint mmrError, IntPtr pszText, uint cchText);

通话时。

uint r = 12 // for example return value is 12
uint szErrorMessage = 128;
string errorMessage = new string(' ', (int) szErrorMessage);
IntPtr strPtr = Marshal.StringToBSTR(errorMessage);

r = waveInGetErrorText(r, strPtr, szErrorMessage);

返回字符串始终为空,保留128个字节的空格。 尝试refout失败。.

请问,为什么?

1 个答案:

答案 0 :(得分:2)

您的定义:

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调用中期望某些东西。由于您未指定out[out],因此在调用完成后,没有任何内容传递回参数中。

现在您可以使用out string,但是StringBuilder更容易。 .NET将某些类型如StringBuilder识别为“嘿,对于这个参数,我希望有回报”。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);

告诉我更多