2014-01-13 42 views
0

簡單,因爲這,運行這個指令:的衝突SystemParametersInfo簽名

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布爾參數來檢索值:

<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 

那麼我需要如何管理這些簽名?我不能只選一個。

有一種方法可以將兩個簽名保持爲布爾值,以便不將其中一個更改爲Integer?

是的,第一條指令不能與ByRef參數一起工作,那我該如何解決這個問題?

回答

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 
+0

@ElektroStudios我剛修好了。我不太流利的VB,所以我的語法錯了。 –

+0

沒問題,thankyou它按預期工作,我學到了這個有趣的東西 – ElektroStudios

+1

@ElektroStudios VB還支持舊的ALIAS關鍵字:'Declare Function getUserName Lib「advapi32.dll」Alias「GetUserNameA」( ByVal lpBuffer As String,ByRef nSize As Integer)Integer' Declare'和'DLLImport'可以互換,但後者是首選,因爲它提供了其他選項。編輯:很多信息! http://stackoverflow.com/a/8793709/1070452 – Plutonix