誰も使ってくれない、可哀想な J#...... (;´・ω・`)σ[J#]
...... あ、すみません、J# で Windows API (Win32 API) 関数を呼ぶ方法を何となく紹介します。
Windows API (Win32 API) を呼ぶ方法というよりは「J# だって属性が使えますよ」が正しいです。
ちなみに、XML コメントだって使えるわけですから、ちょっと見直してあげてくださいw
さて、C# や VB.NET では、API 関数を PInvoke するために System.Runtime.Interlop.DllImport 属性を使っていました。
J# でも属性は使えるわけですから、同様の方法で PInvoke ができます。
ただ、J# での属性の書き方は、NCL っぽい記法ではなく J っぽい記法です。
とりあえず、C#、VB.NET、J#、3 つとも書いてみましょう。
C#
public class TClass1 {
// FindWindow 関数
[System.Runtime.Interlop.DllImport("USER32.DLL", CharSet=System.Runtime.Interlop.CharSet.Auto)]
private static extern System.IntPtr FindWindow(
string lpClassName,
string lpWindowName
);
}
VB.NET
Public Class TClass1
' FindWindow 関数
<System.Runtime.Interlop.DllImport("USER32.DLL", CharSet:=System.Runtime.Interlop.CharSet.Auto)> _
Private Shared Function FindWindow( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As System.IntPtr
End Function
End Class
J#
public class TClass1 {
// FindWindow 関数
/** @attribute System.Runtime.Interlop.DllImport("USER32.DLL", CharSet=System.Runtime.Interlop.CharSet.Auto) */
private static final native System.IntPtr FindWindow(
System.String lpClassName,
System.String lpWindowName
);
}
J# で属性を付与するには、/** ~ */ の間に、@ から続く属性名を書くことになります。
Java をやっている人には、(/** ~ */ は) お馴染みのスタイルですが、一見コメントに見えてしまいますね。
しかも、XML コメントも同じ要領で書くわけで、コメントとの区別がさらに付きにくいです。(;_ _)
API の 宣言部は、C# の extern の代わりに native キーワードを付ける必要があります。
まあ、native は extern より制限が多いわけで「代わり」という表現には語弊がありますがw
J# の場合、System.Runtime.Interlop.DllImport 属性を使う代わりに、@dll.import を使うこともできます。
J#
public class TClass1 {
// FindWindow 関数
/** @dll.import("USER32.DLL", auto) */
private static final native System.IntPtr FindWindow(
System.String lpClassName,
System.String lpWindowName
);
}
-いじょ。