質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.86%

  • Java

    12810questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • COM

    33questions

    COM(Component Object Model)はMicrosoftによるコンポーネントテクノロジーであり、 ソフトウェアの再利用を目的とした技術を指します。

  • JNI

    22questions

    JNI(Java Native Interface)は、Javaプラットフォームにおいて、Javaで記述されたプログラムと、他の言語で書かれたネイティブコードを連携するためのインタフェース仕様である

COMを読み込み、ByRef引数のメソッドを呼び出す。

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 142

ytsk

score 2

com.sun.jna.platform.win32.COM.COMLateBindingObject を使用して、COMのメソッドをコールしたいと思っています。
ByVal型の引数であれば特に問題はありませんが、ByRef型の引数に値がセットされるようなメソッドをコールした際に、期待通りに値がセットされません。

Variant.VARIANT var = new VARIANT.ByReference();
var.setValue(VT_I4, new WinDef.LONG(0L));

//varに値がセットされる..はず
Variant.VARIANT result = this.invoke(methodName, var);

正しい呼び出し方のご教示をお願いします。

また、JNAでの実現を目指しています。JacobやJcom等は使用しないつもりです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • KoichiSugiyama

    2018/01/06 11:29 編集

    期待どおりに値がセットされないということは、違う値がセットされている、ということでしょうか?どういう値が期待通りで、取得できた値が何か、という具体的なところ書いていただいたほうがアドバイスを得られやすいのではないかと思います。

    キャンセル

  • ytsk

    2018/01/06 12:03 編集

    ご助言いただきありがとうございます。「期待通りに値がセットされない」の通り何も設定されません(コードの0Lを初期値にしているため、0Lのまま)。期待値は1以上の整数となります。ちなみに、同条件でPythonのwin32comを使用してコールした場合は、期待通りの値を取得できました(引数自体に変化はなく、副作用のあった引数のみタプルで返却されましたが..) DLLのI/F仕様上はメソッド内部で引数自体を上書きするものです。

    キャンセル

回答 1

+1

曖昧なコメントで申し訳ないですが

VT_I4

ではなくて

VT_BYREF|VT_I4

などとしないといけないということはないでしょうか?

同一空間上のメソッド呼び出しにVARIANT構造体のアドレスを渡すようなことをすれば値渡しでも参照渡しでも自由に行えますが、空間や言語をまたがるCOMメソッド呼び出しを考えると全ての値は空間(プロセス間とかホスト間とか)の移動や言語間での形式変換のためマーシャリングが行われると思います。参照渡しと値渡しの区別のため「参照です」という指定をしないと参照渡しとしてのマーシャリングをしてくれなかったように思います。

ただ、Pythonではできたとのことなのでやり方自体は正しくてCOMサポートライブラリーの動作がおかしいのか、COMラッパーの違いによる仕様の差異なのかどちらも考えられるような気はします。

もしPythonとJNAでの仕様の違いだったと仮定すると・・・jnaで用意されているメソッドを具体的にどう使えばよいかまではわかりませんが、いくつかサンプルを眺めていると低水準のIDispatchインターフェースを直接起動するようなコードの中に

Variant.VARIANT.ByReference result = new Variant.VARIANT.ByReference();

のようなコードを見かけました。

https://github.com/java-native-access/jna/blob/master/contrib/platform/test/com/sun/jna/platform/win32/COM/util/HybdridCOMInvocationTest.java

これが上記に関係するのかも知れません。上記は低水準インターフェースであるIDispatchインターフェースを用いているらしき箇所で見かけましたが、IDispatchではメソッドの戻り値も引数として渡すためByReferenceを用いているのだろうと思いました。なおVARIANT.ByValueというクラスもありこちらが値渡し用と思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.86%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    Javaでtar.gzファイルの解凍

    Javaでtar.gzファイルの解凍を行いたいのですが、可能でしょうか? 可能であれば参考となるサイトや資料、サンプルなどいただけるとありがたいです。

  • 解決済

    非同期処理 wait,notifyAllの使い方

    import java.util.Collections; import java.util.LinkedList; import java.util.List; import j

  • 受付中

    フォルダの中にあるファイルを1つずつ読み込む

    最近Javaで開発を始めました。 複数のファイルが入っているフォルダがあります。 このフォルダから1ファイルずつ開き中身をバッファか配列に読み込むコードを書きたいです。

  • 解決済

    Java

    public class Sk{ public static void main(String[] args){ int a = subtract(9,1); System.

  • 解決済

    ファイル読み込み、ソート

    前提・実現したいこと avaを使用しております。 プログラムの引数で入力ファイルを読み込む。ただし、入力ファイルにはコンマ区切りで学生番号、氏名、国語の点、英語の点、数学の点が

  • 解決済

    Java 与えられた文字列の中に特定の文字列がいくつあるか数えたいです

    表題の通りです。 例えば「dogddg」という文字列が与えられた場合、「dog」がいくつあるか数えるプログラムを作りたいです。(例なら”1”を出力) //作成したコード(簡

  • 解決済

    JFrameでのJPanelの切り替えについて

    前提・実現したいこと (例)Java(UIはJFrame)でゲームを作っているのですが、JPanelの切り替えをJFrameで行おうとしています。 しかし、JPanelの切り替

  • 解決済

    ArrayListで取得したクラスへの代入について

    前提・実現したいこと ある物体が動くシミュレーションを作ろうとしています. その際に,障害物として柱(Pillar)を設置し,ある時にその柱の半径や座標を動かしたいとします.

同じタグがついた質問を見る

  • Java

    12810questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • COM

    33questions

    COM(Component Object Model)はMicrosoftによるコンポーネントテクノロジーであり、 ソフトウェアの再利用を目的とした技術を指します。

  • JNI

    22questions

    JNI(Java Native Interface)は、Javaプラットフォームにおいて、Javaで記述されたプログラムと、他の言語で書かれたネイティブコードを連携するためのインタフェース仕様である