需要致电
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个字节的空格。
尝试ref
和out
失败。.
请问,为什么?
答案 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);