JAva呼び出しvc dll、vb dll(Comコンポーネント)


一、簡単な説明   JAva呼び出しダイナミックライブラリは、実際にはいくつかの補助コンポーネントを通過する必要があります.java呼び出しvcのダイナミックライブラリは一般的にJNIを使用しますが、java呼び出しvbのダイナミックライブラリは、より正確にはvbを呼び出すComコンポーネントがjacobを使用します.私もクラスのドアが斧を弄して、私を軽蔑したいなら軽蔑しましょう、ほほほ2、javaはvcダイナミックライブラリを呼び出します   1、まず、javaの呼び出しプログラムを書き出します.例コードは以下の通りです(javacall.java):
public class javacall
{
    static
    {
        System.loadLibrary("calldll");
    }

    public native static int callcount(int i);

    public static void main(String[] args)
    {
        javacall jc=new javacall();
        int j;
        j=jc.callcount(10);
        System.out.println(j);
    }
};

 
   2、javacall.javaファイルを利用してjavacall.classファイルとjavacall.hヘッダファイルを生成する.
 
D:\AdamSoft\batool-g\java_call_dll_for_example>javac javacall.java

D:\AdamSoft\batool-g\java_call_dll_for_example>javah javacall

D:\AdamSoft\batool-g\java_call_dll_for_example>

 
    3、次は生成したヘッダファイルを利用してvcのダイナミックライブラリを作成し、直接visual studioの上にWin 32 Application Wizardファイルを新規作成し、Application typeはDLLを選択し、完成をクリックすれば、sourceは以下の通りである.
 
// calldll.cpp : Defines the entry point for the DLL application.

//


#include "stdafx.h"
#include "javacall.h"

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    return TRUE;
}

JNIEXPORT jint JNICALL Java_javacall_callcount(JNIEnv *, jclass, jint p)
{
    
    int j = p * p;
    return j;
}



 
 
 
このときjavacall.hヘッダファイルをプロジェクトディレクトリにコピーするには、jni.hとjni_をコピーする必要があります.md.hヘッダファイルをプロジェクトディレクトリにコピーします.jni.hとjni_md.hヘッダファイルはjdkのincludeディレクトリにあります.最も重要なのは、コピーされた場合、javacall.hのヘッダファイルでヘッダファイルを参照する場所#includeを#include"jni.h"に変更し、ローカルのエンジニアリングディレクトリでヘッダファイルを検索することです.最後にコンパイルしてcallll.dllダイナミックライブラリをコンパイルしました.このダイナミックライブラリをjavacall.classが存在するディレクトリにコピーします.    4、最後にコンソールの下でjavacall.classを実行して、10の平方を計算できるかどうかを見てみましょう.
 
D:\AdamSoft\batool-g\java_call_dll_for_example>java javacall

100

D:\AdamSoft\batool-g\java_call_dll_for_example>
 

 
ここでjavaがvcダイナミックライブラリを呼び出すのは成功しました.注意:javaの環境構成のスクリプトファイルenv.batを貼り付けます.内容は次のとおりです.
color 0a

cd /D D:\AdamSoft\batool-g\java_call_dll_for_example

set JAVA_HOME=D:\Program Files\Java\jdk1.5.0_17

set PATH=%JAVA_HOME%\bin;%PATH%

set CLASSPATH=.;%JAVA_HOME%\lib\tools.jar

cmd.exe
 

 三、java呼び出しvbダイナミックライブラリ(comコンポーネント)    1、まずjacob.jarとjacob.dllの2つのファイルを用意する必要があります.ここは1.7バージョンです.直接ネット検索でダウンロード先を見つけることができます.ここでは提供しません.    2、まずjavaプログラムを作成します.ここで作成した名前はjavacallvb.javaです.内容は以下の通りです.
 
import com.jacob.com.*;
import com.jacob.activeX.*;

public class javacallvb
{
    public static String ShowMsg(String str){
        String res="";
        
        try {
            ActiveXComponent pp = new ActiveXComponent("DLLProject.VBDLL");
            Dispatch myCom = (Dispatch) pp.getObject();
            Variant result = Dispatch.call( myCom, "vbShowMsg", str) ;
            res=result.toString();
        }catch (Exception e) {
            res="";
            e.printStackTrace();
        }
        return res;
    }

    public static void main(String[] args)
    {
        javacallvb jcv=new javacallvb();
        String strRet = jcv.ShowMsg("welcome weigongwan!");
        System.out.println(strRet);
    }
}

 
ここではDLProjectライブラリのVBDLLクラスのvbShowMsg関数を呼び出し、まずパラメータを渡し、戻ってきた値を受信してコンソールに印刷します.    3、vbのダイナミックライブラリの作成を開始します.より正確には、vbのActivex dllコンポーネントの作成を開始します.ここで注意したいのは、visual studioで作成されたClass Libraryはvbの動的ライブラリではなくvb.netのライブラリです.Microsoft Visual BasicソフトウェアでActivex dllライブラリをコンパイルする必要があります.ソフトウェアを開いたらActiveX DLLをクリックし、エンジニアリングウィンドウでClass 1(Class 1)をクリックし、プロパティで名前をVBDLLに変更します.プロジェクト1(プロジェクト1)をクリックして、中の名前をDLProjectに変更します.この时、私达は振り返ってVBDLLのファイルの中で私达の実现したい関数を入力して、私のここの関数の内容は以下の通りです:
Public Function vbShowMsg(ByVal str As String) As String
    MsgBox str
    vbShowMsg = "VB:" + str
End Function


 

Public Function vbCount(ByVal i As Integer) As Integer
    vbCount = i * i
End Function

 
最後に、プログラムを保存し、メニューのファイルをクリックして->DLProject.dll(K)...、動的ライブラリをjavacallvb.javaプログラムがあるディレクトリに生成します.    4、javacallvb.javaプログラムのコンパイルを開始します.まず、現在のディレクトリにDLProject.dll、DLProject.exp、DLProject.lib、jacob.dll、jacob.jar、javacallvb.javaがあることを確認します.これらのファイルがすでに存在していることを確認して、私たちはコンソールを開けて、私のところはいくつかのスクリプトenv.batで、直接ダブルクリックすればいいです.実行の効果は次のとおりです.
D:\AdamSoft\batool-g\java_call_dll_for_example>javac -classpath

jacob.jar javacallvb.java

D:\AdamSoft\batool-g\java_call_dll_for_example>java -cp jacob.jar;. javacallvb

VB:welcome weigongwan!

D:\AdamSoft\batool-g\java_call_dll_for_example>
 

 
これで、javaがvbダイナミックライブラリを呼び出すのは成功しました.四、javaはvcダイナミックライブラリを呼び出し、vcダイナミックライブラリからvbダイナミックライブラリを呼び出す    1、まずjavaプログラムを作成します.私のところはjavacall.javaです.内容は以下の通りです.
 
public class javacall
{
    static
    {
        System.loadLibrary("calldll");
    }

    public native static int callcount(int i);

    public static void main(String[] args)
    {
        javacall jc=new javacall();
        int j;
        j=jc.callcount(10);
        System.out.println(j);
    }
};

 
このファイルはjava呼び出しvcダイナミックライブラリであることが一目でわかりますが、java呼び出しvcダイナミックライブラリについてはあまり言いません.最初に紹介したからです.    2、vbダイナミックライブラリもあまり言わないで、私はここでDLProject.dllダイナミックライブラリを使います.    3、vcダイナミックライブラリの内容は以下のように直接貼り付けます.
 
// calldll.cpp : Defines the entry point for the DLL application.

//


#include "stdafx.h"
#include "javacall.h"
#include <stdio.h>


//      vb    ,      
#import "D:\AdamSoft\batool-g\java_call_dll_for_example\DLLProject.dll" no_namespace

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    return TRUE;
}

short CallFun(short i)
{
    short sRet = 0;

    BSTR bstrDesc;

    try

    {
      CoInitialize(NULL);
     _VBDLLPtr ptr;
     ptr.CreateInstance(__uuidof(VBDLL)); 
     sRet = ptr->vbCount(i);

    } catch(_com_error e) 
    { 
        bstrDesc = e.Description(); 
    } 
    CoUninitialize();
    return sRet;
}

JNIEXPORT jint JNICALL Java_javacall_callcount(JNIEnv *, jclass, jint p)
{
    
    int j = (int)CallFun(p);
    return j;
}


 
以上のファイルはvcダイナミックライブラリの内容です.    4、最後に、vbダイナミックライブラリ、vcダイナミックライブラリ、javacall.javaプログラムを同意ディレクトリに配置します.実行効果は次のとおりです.
 
D:\AdamSoft\batool-g\java_call_dll_for_example>javac javacall.java D:\AdamSoft\batool-g\java_call_dll_for_example>java javacall

100

D:\AdamSoft\batool-g\java_call_dll_for_example>
 

 
呼び出しに成功し、10の平方が表示されました.