需要打电话
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
没有成功..
请问,为什么?
你的定义:
public static extern uint waveInGetErrorText(uint mmrError,
IntPtr pszText,
uint cchText);
......还不足以告诉.NET,IntPtr pszText
正在输出任何东西。默认情况下,编译器会使用[in]
marshal属性修饰所有参数。所以你的上述定义相当于:
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
更容易。像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);