Win32 API waveInGetErrorText声明到C#

问题描述 投票:1回答:1

需要打电话

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没有成功..

请问,为什么?

c# winapi pinvoke
1个回答
2
投票

你的定义:

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);

告诉我更多

© www.soinside.com 2019 - 2024. All rights reserved.