4

C#では、これがあります:

[DllImport("user32.dll", EntryPoint = "GetDesktopWindow")]
    public static extern IntPtr GetDesktopWindow();

したがって、VB.NETに変換しようとしました:

<DllImport("user32.dll", EntryPoint:="GetDesktopWindow")>
Function GetDesktopWindow() As IntPtr
End Function

しかし、エラーが表示されます...「インポート System.Runtime.InteropServices.DllImportAttribute をインスタンス メソッドに適用できません。」

これを修正するために何をする必要があるかを説明できますか?さらに良いのは、理由を教えてください。

ありがとう!

4

1 に答える 1

14

staticキーワードを C# 宣言から VB.NETに変換するのを忘れました。それがエラーメッセージが伝えていることです。静的メソッドがない限り、インスタンス メソッドを宣言しており、インスタンス メソッドDllImportAttributeに適用することはできません。

に相当する VB.NETstaticShared. したがって、宣言は次のようになります。

<DllImport("user32.dll", EntryPoint:="GetDesktopWindow")>
Shared Function GetDesktopWindow() As IntPtr
End Function

他にもいくつか指摘しておきたいことがあります。

  • EntryPoint関数宣言が同じ名前の場合は指定する必要はありません。とにかくそうしても害はありませんが、重複を抑え、省略した場合のエラーの可能性を減らすと思います.
  • このような P/Invoke 宣言は、通常、次のような名前の静的クラスに入れる必要がありますNativeMethods(StyleCop はこのガイドラインを強制します)。VB.NET では、静的クラスはモジュールと呼ばれます。したがって、次のようになります。

    Module NativeMethods
        <DllImport("user32.dll")>
        Shared Function GetDesktopWindow() As IntPtr
        End Function
    End Module
    
  • 古いバージョンの VB (VB 10 より前、VS 2010 に同梱) では、関数宣言を複数行に分割するために行継続文字が必要でした。これらのいぼは、次のように見えます。

    Module NativeMethods
        <DllImport("user32.dll")> _
        Shared Function GetDesktopWindow() As IntPtr
        End Function
    End Module
    

最後に、関数によって返されるデスクトップ ウィンドウの使用方法には十分注意してください。多くの人がそれを悪用しており、ほとんどの場合、人々がハンドルを取得しようとしているのを見ると、それは彼らがすでに間違ったことをしている兆候です. (あなたがそうだとは言いません。あなたのコードの残りの部分を見ることができないので、注意が必要です!)GetDesktopWindow

于 2012-07-24T00:22:08.387 に答える