【问题标题】:Win32 API waveInGetErrorText declaration into C#Win32 API waveInGetErrorText 声明到 C#
【发布时间】:2019-03-14 02:45:32
【问题描述】:

需要打电话

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

来自 C# 代码。在 PINVOKE.net 上没有找到声明。 func的描述是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 没有成功..

请问,知道为什么吗?

【问题讨论】:

  • 你可以试试public static extern uint waveInGetErrorText(uint mmrError, string pszText, uint cchText);public static extern uint waveInGetErrorText(uint mmrError, StringBuilder pszText, uint cchText); 吗?
  • string 还是StringBuilder? :)
  • StringBuilder..

标签: c# winapi pinvoke


【解决方案1】:

您的定义:

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

告诉我更多

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多