【问题标题】:Conflict with SystemParametersInfo signatures与 SystemParametersInfo 签名冲突
【发布时间】:2014-01-13 19:41:13
【问题描述】:

就这么简单,运行这条指令:

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)

...当然我需要通过引用布尔参数来检索值:

<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 参数,那么我该如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

    在 C# 中,您可以将两个版本都声明为重载方法。然后让编译器根据你是按值传递参数还是按引用传递参数来选择合适的。但是,VB 语法不允许您指定参数是按引用还是按值。在 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
    

    【讨论】:

    • @ElektroStudios 我刚刚修复了它。我对 VB 不熟练,所以语法错误。
    • 没问题,谢谢它按预期工作,我学到了这个有趣的东西
    • @ElektroStudios VB 还支持旧的 ALIAS 关键字:Declare Function getUserName Lib "advapi32.dll" Alias "GetUserNameA" ( ByVal lpBuffer As String, ByRef nSize As Integer) As Integer DeclareDLLImport 可以互换,但后者是首选,因为它提供了其他选项。编辑:很多信息! stackoverflow.com/a/8793709/1070452
    猜你喜欢
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多