じゃんぬのどっとてきすと

雑記とネタと時々プログラミング

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  982  : 記事  4  : コメント  16085  : トラックバック  277

ニュース

My Website

初心者向けのサイトです。

C# と VB.NET の入門サイト

最近のできごと

少し前に女のコが生まれました。家事と育児と仕事にと奮起しています。めちゃくちゃかわいいです。あと Blog の更新は全然してませんが、Twitter とかでアホなこと呟いています。見つけることができたら、ぜひフォローしてあげてください。けっこう喜びます。

Sponsored Link1

Sponsored Link2

Archive

書庫

誰も使ってくれない、可哀想な 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
    );

}

-いじょ。

投稿日時 : 2006年4月13日 10:33

コメント

# re: J# で Windows API 関数を呼ぶ方法 2006/04/13 13:01 シャノン
Java についてはあまり知らないので、的外れなことを言ってたら申し訳ないんですが。

Java で /** で始まるコメントは、JavaDoc という一ツールが採用している形式に過ぎないのではないでしょうか?
それとも、Java の言語規格において、/** は単なるコメントではないと定められているのでしょうか?

規格上意味を持っているのなら構いませんが、そうでなく、コメントの一形式でしかないとしたら…
今回の J# の例を見た瞬間、「うわ気持ち悪っ」と思ってしまいました。

# re: J# で Windows API 関数を呼ぶ方法 2006/04/13 13:57 じゃんぬ
 /**
  *  ~を取得する
  */
 public java.lang.String getHogeHoge() {

# re: J# で Windows API 関数を呼ぶ方法 2006/04/13 15:06 シャノン
んー…何を意図されてのレスでしょう?

俺の言いたかったのは、引用して言えば、

> 一見コメントに見えてしまいますね。
> コメントとの区別がさらに付きにくいです。(;_ _)

ってのが嫌だなぁ、ということ。
コメントではないものをコメントの書式を使って書くということに生理的嫌悪が。

# re: J# で Windows API 関数を呼ぶ方法 2006/04/13 15:14 ぽぴ王子
こんにちは。

えー、私もJavaに詳しいわけではないので間違いを含んでいること
が予想されますが。
/** の形式は確かにJavaDocが採用しているコメント形式ですが、J
avaDoc自体がsunオフィシャルのツールですし、/** 自体はJavaの
コーディング規約として決められていたと思います。

それはそれとして、確かに「うわ気持ち悪っ」は私も思いました(笑)

"/**" でGoogle先生にお伺いを立てたら、なぜか慶應義塾大学のペ
ージばかりヒットするのは謎。


# re: J# で Windows API 関数を呼ぶ方法 2006/04/13 17:44 シャノン
> /** 自体はJavaのコーディング規約として決められていたと思います。

コーディング規約で決められているのは別に構わないんです。コーディング規約と言語規格は違いますからね。
言語規格で決められているっていうことは、コンパイラがそれを解釈して、吐き出すバイナリに影響を与えるってことですから。
で、J# はそれをやってしまっているわけですね。一見コメントにしか見えないものが、バイナリに影響を与える有意なコードになっているということで。

というか、Java 5.0 から取り入れられたアノテーションの形を取ればいいのに…MS は J# を進化させる気は無いんですかのぉ。

# re: J# で Windows API 関数を呼ぶ方法 2006/04/13 17:46 シャノン
> "/**" でGoogle先生にお伺いを立てたら、なぜか慶應義塾大学のページばかりヒットするのは謎。

ぐぐる先生は記号を理解してくれません。

# re: J# で Windows API 関数を呼ぶ方法 2006/04/14 10:22 名無しぃシャープ
>んー…何を意図されてのレスでしょう?
みんなこういう風に書いてるでしょ。
規約でカバーしてるでしょ。ってことかと。
Javaは言語仕様はシンプルに。狭めるものは規約サポートばかりだし。
MSみたく構文サポートしてくれと思うことはあるね。

っていうか、一括コメントアウトできなくなるのがうざい。/**~*/
VS上だと色の区別をさせることもできないし。

> MS は J# を進化させる気は無いんですかのぉ。
J#を進化させるとC#にしかならない。
JVM問題を考えると多分ないでしょ。

> ぐぐる先生は記号を理解してくれません
そんなことはありません。
アンカーテキストでそういう風(/**)にリンクされちゃってるんでしょ。
linkで全部調べないと何とも言えないけど。

# re: J# で Windows API 関数を呼ぶ方法 2006/04/14 11:08 じゃんぬ
> んー…何を意図されてのレスでしょう?

すみません、どうも思い違いをしていたようです。

私としてはコメントの一種という意味では、
C# の XML コメントも同レベルと見ることができるので、

> > しかも、XML コメントも同じ要領で書くわけで、

コメントの一種だからではなく、
 「現状区別がつきにくいことを問題視していますよ」
という意味合いで書きました。
せめて C# のように色で区別できていればなぁなんて...

ただ、色を変えても記法があのままだと、
XML コメントと区別が付きにくいというのがちょっとダメかなぁってところですね。

J っぽくしたかったのかなぁ。> @attribute
確かに、[@attribute DllImport()] だとちょっと違和感が...

# re: J# で Windows API 関数を呼ぶ方法 2006/04/14 16:11 シャノン
> J#を進化させるとC#にしかならない。

そんなことは無いと思う一方で、そんなことを言うのは今さらでしょうとも思う。
アノテーションもそうだけれど、Java 5.0 から取り入れられた新記法に対応するならば、それなりに面白いものになると思います。
ただし、そうしても、見た目が違うだけで根本は C# と同じだと言えるかもしれません。
が、それを理由に J# の進化を拒否するならば、VB.NET の存在意義がありません。

# re: J# で Windows API 関数を呼ぶ方法 2006/04/14 16:22 シャノン
> C# の XML コメントも同レベルと見ることができるので、

まったく同レベルだと思います。ただのコメントも XML コメントも JavaDoc 用のコメントも。コンパイラから見ればね。
ここで「コンパイラ」とは狭義のコンパイラ、つまり、ソースコードをからバイナリを出力するという最低限の責務を負うものを指します。csc.exe なんかはXML ドキュメントジェネレータも兼ねていますが、個人的な好みを言えば、コンパイラとドキュメントジェネレータは別のツールになっていて欲しいです。
そうすれば、コンパイラは /** や /// で始まっているかといった特殊なケースを意識せずに、/* か // で始まっていれば一律無視できます。
csc.exe はドキュメントジェネレータを兼任するため、コメントを一律に無視できません。J# は輪をかけて複雑で、ドキュメントジェネレータを切り離してコンパイラに専念してもなお無視できなくなっています。
そのへんが醜悪に見えてならないのです。

# re: J# で Windows API 関数を呼ぶ方法 2006/04/14 17:00 名無しぃシャープ
>それを理由に J# の進化を拒否するならば、VB.NET の存在意義がありません
VBの存在意義はおおありでしょ。
VBプログラマは多いわけで、VBの構文をサポートしたdotNet言語が欲しいという意味で。
実際、VBはdotNET言語をC#と共に背負ってます。

J#の存在意義もJavaプログラマを少しでも取り込みたいというのがあると思う。
構文レベルだとVBに比べればそう差はないんでそのレベルだとVB未満の存在価値。
実際そうだから流行らないんだし。。。> J#(J++もかw)

で、手を加えたところで価値を見出せないと判断して、手を加えないんだと思う。
Java→J#→C#と足がかりにしておくれ利用じゃダメかな?

# re: J# で Windows API 関数を呼ぶ方法 2006/04/14 17:09 名無しぃシャープ
属性については僕もC#みたいに[]内にかけた方がええと思う。

 /**
  *  ○○を返すメソッドです。
  *
  * @param  paramName1  xxを指定します。
  * @param  paramName2  yyを指定します。
  * @return  ○○を返します。
  *
  * @attribute ~
  * @attribute ~
  */
 private void getHoge() {

 }

こんなんやだー。

# re: J# で Windows API 関数を呼ぶ方法 2006/04/14 19:18 じゃんぬ
一括コメントアウトできないのが... orz

# re: J# で Windows API 関数を呼ぶ方法 2006/04/14 20:27 シャノン
> Java→J#→C#と足がかりにしておくれ利用じゃダメかな?

MS の意図はそうかもしれない。
VS2005 インストールするときに、C# のインストールオプションの中に、Java からの移行ツールみたいなもんがあったから(俺はインストールしてない)。

Java 5.0 に準拠した、本格的な CLR 向け Java VM ってあるんかな。

# re: J# で Windows API 関数を呼ぶ方法 2006/04/15 12:27 中博俊
MicrosoftはVMを出せないですから。ありえないですね。

それより/**/なんかつかうな!!!
いっかつこめんとあうと~~~~ (^^

# re: J# で Windows API 関数を呼ぶ方法 2006/04/15 12:42 じゃんぬ
> MicrosoftはVMを出せないですから。ありえないですね。

はい、NFC に特化した進化しかできないのですから、
進化させるとすると、それこそ C# になるのですね。

移行でサポートというのも、あんまり意味がないように思えます。
いっぱしの Java プログラマなら C# なんて朝飯前ですよ。
実際、半人前の私でも簡単に移行できましたから。

> それより/**/なんかつかうな!!!

正しくは /** */ ですよ。
最初は 2 回以上のアスタリスクがないと無効なんですよw

> いっかつこめんとあうと~~~~

VS に限れば、全選択して // を付けるしかないですね。

# re: J# で Windows API 関数を呼ぶ方法 2006/04/15 23:32 中博俊
NO
/** */
のことを言っているんじゃなくって、
/* */
すらあすたーあすたすらのことを言っている(w

# re: J# で Windows API 関数を呼ぶ方法 2006/04/16 11:22 シャノン
>> Java 5.0 に準拠した、本格的な CLR 向け Java VM ってあるんかな。
> MicrosoftはVMを出せないですから。ありえないですね。

MS 以外が出さないかな、ということ。
あるいは、Sun の認定する VM でなくとも、CLR を対象とした Java 5.0 処理系。これなら、Sun の許可は要らんでしょう。

# re: J# で Windows API 関数を呼ぶ方法 2006/04/16 11:23 シャノン
> すらあすたーあすたすらのことを言っている(w

J# で属性表記に /** を使うなということではなく、一般のプログラミングでも /* なんて使うなということ?

# FJRgwsUfppdfIBWh 2014/08/28 12:51 http://crorkz.com/
I5fO63 I'm not sure exactly why but this blog is loading very slow for me. Is anyone else having this issue or is it a problem on my end? I'll check back later on and see if the problem still exists.

# womensdjbcj 2015/11/05 9:49 womensujsna
http://astarastrology.com/macmakeupcourse/ mac make up course, http://astarastrology.com/images/ mac make up bag, http://styro-lite.com/macmakeupbritomart.htm mac makeup britomart, http://styro-lite.com/macmakeupfrance/ mac makeup france,http://styro-lite.com/images/ mac makeup edinburgh, http://smithdesign-construction.com/beautymacmakeup/ beauty mac make up, http://smithdesign-construction.com/buymaccosmetics.htm buy mac cosmetics, http://smithdesign-construction.com/images/ mac cosmetics online shopping, http://treasuresoftomorrow.org/freemaccosmetics/ free mac cosmetics, http://treasuresoftomorrow.org/macmakeup.htm mac makeup, http://treasuresoftomorrow.org/images/ mac make up doos, http://dentaldesignsavannah.com/maccosmeticsfoundation/ mac cosmetics foundation, http://dentaldesignsavannah.com/maccosmetics.htm iman cosmetics, http://dentaldesignsavannah.com/images/ mac makeup brisbane, http://ibas.co.nz/buymaccosmetics.html buy mac cosmetics, http://ibas.co.nz/beautymacmakeup/ beauty mac makeup, http://ibas.co.nz/images/ mac cosmetics online shopping, http://instalacionesredondo.com/maccosmeticsstores/ mac cosmetics stores, http://instalacionesredondo.com/macmakeupbagset.htm mac makeup bag set, http://instalacionesredondo.com/images/ gosh mac cosmetics, http://mgimt.org/macmakeupforprom/ mac makeup for prom, http://mgimt.org/macmakeupcoupon.htm mac makeup coupon, http://mgimt.org/img/ mac makeup edinburgh, http://punishersnational.com/macmakeupdublin.htm mac makeup dublin, http://punishersnational.com/macmakeupparty/ mac makeup party, http://punishersnational.com/images/ mac makeup liverpool, http://cyclesquad.net/macmakeupsydney/ mac makeup sydney, http://cyclesquad.net/images/ mac makeup free delivery, http://cyclesquad.net/macmakeupprimer.htm mac makeup primer


# re: J# で Windows API 関数を呼ぶ方法 2017/07/06 21:53 Thomas
画面は、写真が撮られた後、データ入力ページ上の歯車アイコンを介してアクセスされる。 http://getfilesplease.us私たちはUIを完全に再設計し、新しい機能を追加しました。

# re: J# で Windows API 関数を呼ぶ方法 2017/07/19 20:25 Callum
With three holidays to play, there are over 100 prizes to collect. http://essaysmajors.com BOOKMARKSSave your favorite locations with just a tap.

# re: J# で Windows API 関数を呼ぶ方法 2017/10/18 15:15 Hugo
You can find the notes from the appointment of a day.http://downloadthefilenow.top For example, receive immediate notification when any user or computer attempts to logon to your network more than 3 times within 10 minutes.

Post Feedback

タイトル
名前
Url:
コメント: