就像这样,运行这条指令:
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参数,那么我该如何解决这个问题?
答案 0 :(得分:2)
在C#中,您会将两个版本声明为重载方法。然后让编译器根据您是通过值还是通过ref传递参数来选择合适的一个。但是,VB语法不允许您指定参数是ref还是值。在C#中,您必须包含ref
或out
,因此重载解析程序可以使用该信息来选择适当的方法。
我认为这意味着你需要定义两个名称不同的方法。例如:
<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