与SystemParametersInfo签名冲突

时间:2014-01-13 19:41:14

标签: .net vb.net winapi pass-by-reference signature

就像这样,运行这条指令:

NativeMethods.SystemParametersInfo(SPI.SPI_SETKEYBOARDCUES, 
                                   0UI, 
                                   True, 
                                   SPIF.None)

我需要这个签名:

<DllImport("user32.dll")>
Private Shared Sub SystemParametersInfo(
               ByVal uiAction As NativeMethods.SPI,
               ByVal uiParam As UInteger,
               ByVal pvParam As Boolean,
               ByVal fWinIni As NativeMethods.SPIF)

End Sub

但要运行其他指令:

Dim MyBoolean As Boolean = False
NativeMethods.SystemParametersInfo(SPI.SPI_GETKEYBOARDCUES, 
                                   0UI, 
                                   MyBoolean, 
                                   SPIF.None)

...当然我需要通过ByRef的Boolean参数来检索值:

<DllImport("user32.dll")>
Private Shared Sub SystemParametersInfo(
               ByVal uiAction As NativeMethods.SPI,
               ByVal uiParam As UInteger,
               ByRef pvParam As Boolean,
               ByVal fWinIni As NativeMethods.SPIF)

End Sub

那么我需要如何管理这些签名呢?我不能只选择一个。

有一种方法可以将两个签名保持为布尔值,以便不将其中一个更改为整数?

是的,第一条指令不适用于ByRef参数,那么我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

在C#中,您会将两个版本声明为重载方法。然后让编译器根据您是通过值还是通过ref传递参数来选择合适的一个。但是,VB语法不允许您指定参数是ref还是值。在C#中,您必须包含refout,因此重载解析程序可以使用该信息来选择适当的方法。

我认为这意味着你需要定义两个名称不同的方法。例如:

<DllImport("user32.dll", EntryPoint:="SystemParametersInfo")>
Private Shared Sub SystemParametersInfoByValBoolean(
               ByVal uiAction As NativeMethods.SPI,
               ByVal uiParam As UInteger,
               ByVal pvParam As Boolean,
               ByVal fWinIni As NativeMethods.SPIF)

End Sub

<DllImport("user32.dll", EntryPoint:="SystemParametersInfo")>
Private Shared Sub SystemParametersInfoByRefBoolean(
               ByVal uiAction As NativeMethods.SPI,
               ByVal uiParam As UInteger,
               ByRef pvParam As Boolean,
               ByVal fWinIni As NativeMethods.SPIF)

End Sub