2014-12-24 37 views
0

Java 응용 프로그램에서 Office 응용 프로그램의 VBA 코드에 액세스해야하는데, VisualBasic DLL을 통해 JNI를 통해 VBA 코드에 액세스 할 수 있다고 대답 한 THIS이 발견되었습니다. 필요하지 않다면 COM-bridge를 사용하고 싶지는 않지만 DLL-solution으로 갈 것입니다. 내가 만든Java에서 VisualBasic DLL 사용

Public Class Test1 
    Public Function box() 
     MsgBox("boxtest!") 
    End Function 
End Class 

이 릴리스로하고 내 자바 프로젝트에 넣고 :

public class Test1 { 
    static{ 
     System.loadLibrary("Test1"); 
    } 
    public native void box(); 
} 

나는 (작동하는지 테스트하기 위해 간단한 예) 비주얼 스튜디오 2013을 비주얼 베이직 클래스 라이브러리를 생성 이 함수는 new Test1().box();에 의해 호출됩니다. Exception in thread "main" java.lang.UnsatisfiedLinkError: test.Test1.box()V

나는 또한 DLL에 액세스 할 수 JNA를 사용

하지만 난 그것을가 비주얼 베이직 DLL을 사용할 수 없습니다 것을 (나는 또한 읽기 동작하지 않습니다 수있는 노력의 시간 후 :

나는 다음과 같은 예외가 발생). 내 src 폴더의 네이티브 라이브러리 폴더를 DLL이 들어있는 폴더로 설정했습니다.

질문 : Java에서 VisualBasic DLL을 사용할 수 있습니까? 그렇다면 JNA 또는 JNI (또는 둘 다)로 VisualBasic DLL을 사용할 수 있습니까? 그렇다면 무엇이 잘못 되었습니까? 어떻게 제대로 함수에 액세스 할 수 있습니까? (나는 돌아오고 나머지는 매개 변수가 쉽다는 것을 짐작할 것입니다 ...)

여러분 모두에게 진심으로 감사드립니다. :)

+0

이제 웹 2.0이 생겼으니 PC 2.0이 필요합니다. .net 프레임 워크에서는 주요 언어에서 라이브러리를 쉽게 호출 할 수 있어야합니다 ... btw .net은 CLI를 사용하므로 기본적으로 VS C++ 코드가 다른 "표준"컴파일러의 코드와 동일하게 작동하지 않을 수 있습니다. –

답변

1

왜 귀하의 도서관을 찾을 수 없습니까. JNI의 기억에서, 네이티브 루틴을 호출하기위한 JNI 설정을 수행 한 것처럼 보이지 않지만 오류 메시지는 단지 찾을 수 없다고 말합니다. 라이브러리로드 명령문이 작동하는지 알아 내려고 시도해보십시오.

DLL은 특정 규칙 및 규칙을 따르는 라이브러리입니다. "Visual Basic DLL"과 다른 종류의 차이점을 잘 모릅니다. Windows 프로그램은 다른 언어, afaik로 작성된 DLL을 구별하지 못하기 때문에 어느 정도는 같아야합니다. VB에서 "이 코드는 다음과 같이 사용할 수 있습니다."라는 설명서를 보지 못했습니다. VB가 아니라 다른 언어에서 "등

일하는 JNI/JNA 물건을 얻는 것은 까다 롭고 지루합니다. 이 경우 언어 런타임에서 알려주는 정상적인 기능, 특히 Java 런타임은 사용자를 위해 존재하지 않습니다. 모든 문서, 패스하는 모든 매개 변수, 가치 대 참조 사용 등 모든 라인을 고심하게 거쳐야합니다.

예전에는 GitHub 라이브러리 here을 사용할 수있었습니다.

행운을 비네.

+0

답변 해 주셔서 감사합니다. 'System.loadLibrary ([...])'가 작동했습니다. 라이브러리 내의 메소드를 찾을 수 없습니다. 연구의 몇 일 후에 VB DLL에서 메서드를 호출하는 방법에 대한 단 한 가지를 찾지 못했습니다. C++ DLL (및 VB) 호출시 문제가 발견되었지만 C++ 래퍼를 통해 VB DLL을 호출하는 몇 가지 예가 있습니다. – shagrinar

0

Java에서 직접 VB DLL을 호출하는 방법에 대한 답을 찾지 못했지만 조사를 한 후 C++ 래퍼를 사용하여 VB DLL을 호출 할 수 있다는 것을 알게되었습니다.

VB DLL 메서드를 JNI와 호출 할 수는 있지만이를 수행하는 방법에 대한 문서는 없습니다. JNI specifications from Oracle에서 JNI와 통신 할 수있는 C++ 라이브러리를 만드는 방법에 대해 많이 알게되었습니다.

이 특수한 경우 (Java로 Office 응용 프로그램 제어) C++로 Office 응용 프로그램에 액세스하고 DLL을 만드는 코드를 작성하는 것이 좋습니다.

JNI와 상호 작용할 수있는 C++ DLL을 만드는 방법에 대한 기본적인 접근 방식은 다음과 같습니다 당신이 C++로 만들려는 방법과 .DLL 이름 [NAME]의 이름의

  1. 생각해은

    을 .DLL

    static{ 
        System.loadLibrary([NAME].dll); 
    } 
    

    네이티브 라이브러리 경로는 이클립스 (설정해야합니다는 마우스 오른쪽 버튼으로 클릭 :

  2. 로드는 DLL의 라이브러리를 자바 클래스를 생성 클래스가 포함 된 폴더를 클릭하고 빌드 - 경로 클릭).

  3. public native void [methodname]();을 포함하십시오.

  4. javac.exe를 사용하여 .java 파일을 컴파일하십시오 (예 : Eclipse에서 작업하게하십시오).

  5. -jni 매개 변수와 함께 javah.exe를 사용하여 C++ 헤더 파일을 만듭니다.

  6. Visual Studio (Visual C++ MFC DLL)에서 새 프로젝트를 만듭니다.

  7. 복사를 생성 된 헤더 파일 (자바 프로젝트)의 jni.h (JDK)와 jni_md.h (JDK)

  8. 는 ++은 Visual C에서 세 개의 헤더 파일을 포함 - 프로젝트 헤더 -file [프로젝트 이름] .h

  9. [프로젝트 이름] .cpp에 생성 된 헤더 파일과 jni.h 파일을 포함시킵니다.

  10. [프로젝트 이름] .cpp에 원하는 코드를 작성하십시오.

  11. DLL을 빌드하고 네이티브 라이브러리의 정의 된 경로 (2에 기울임 꼴 참조) 안에 넣습니다.

  12. 실행하고 행복해!

실수로 불편을 끼쳐 드려 죄송합니다.

Visual Basic-DLL 및 JNI를 사용한 예는 1HERE과 google "classle"및 "JNI"(링크 2 개를 게시 할 수 없음)라는 다른 곳에서 찾을 수 있습니다.