얼마 전에 Java를 사용하여 Tomcat MySQL이 구축 한 웹 환경을위한 설치 프로그램을 개발했습니다. 개발 과정에서 Java 자체를 사용하여 해결하기 어려운 레지스트리 작성 및 시스템 서비스 등록 등과 같은 문제를 겪었으므로 JNI 사용을 생각했습니다. C와 Delphi는 JNI를 개발했습니다.
델파이로 JNI를 개발하려면 먼저 http://delphi-jedi.org에서 jni.pas를 다운로드하고 프로젝트에 추가하면 JNI를 개발할 수 있습니다.
예를 들어, 데스크탑 단축키를 만듭니다.
델파이 코드 :
도서관 mydll
용도
Jni, Windows, Comobj, ActiveX, Shlobj, Sysutils, Registry;
// 데스크탑 디렉토리를 가져옵니다
함수 getDeskTopPath () : 문자열;
var
Reg : Tregistry;
DesktopPath : 문자열;
시작하다
Reg : = tregistry.create;
노력하다
reg.rootkey : = hkey_current_user;
reg.openkey ( 'Software/Microsoft/Windows/CurrentVersion/Explorer/Shell Polders', False);
reg.ValueExists ( 'Desktop') 인 경우 DesktOppath : = Reg.ReadString ( 'Desktop');
결과 : = goodtoppath;
마지막으로
Reg.free;
끝;
끝;
// 데스크탑 바로 가기를 만듭니다
프로 시저 CreadeSkTopLink (Programpath, Programarg, LinkName, Descr, IconPath : String);
var
Anobj : iunknown;
쉘 링크 : ishelllink;
afile : ipersistfile;
파일 이름 : widestring;
LinkPath : 문자열;
시작하다
linkpath : = getDeskTopPath ()+'/'+linkName;
대문자 (ExtractFileExt (LinkPath)) <> '. lnk'인 경우 // 확장자가 올바른지 확인하십시오
시작하다
예외를 높이십시오.
끝;
노력하다
Oleinitialize (nil); // OLE 라이브러리 초기화 OLE 기능을 사용하기 전에 초기화를 호출해야합니다.
anobj : = createcomobject (clsid_shelllink); // 주어진 classid를 기반으로 com 객체를 만듭니다. 여기 바로 가기가 있습니다.
shelllink : = ashelllink as as ashelllink; // 바로 가기 인터페이스로 capt
afile : = anobj as ipersistfile; // 파일 인터페이스로의 캡 티브 변환
// 바로 가기 속성을 설정하면 일반적으로 사용되는 몇 가지 속성 만 여기에 설정됩니다.
shelllink.setpath (pchar (programpath)); // 바로 가기의 대상 파일, 일반적으로 실행 파일
shelllink.setarguments (pchar (programarg)); // 파일 매개 변수를 대상으로합니다
Shelllink.setWorkingDirectory (pchar (extractfilepath (programpath)); // 대상 파일의 작업 디렉토리
shelllink.setDescription (pchar (descr)); // 대상 파일의 설명
shelllink.seticonlocation (pchar (iconpath), 0);
filename : = linkpath; // 파일 이름을 widestring 유형으로 변환합니다
afile.save (pwchar (filename), false); // 바로 가기 저장
마지막으로
Oleuninitialize; // 올레 라이브러리를 닫으십시오.이 함수는 Oleinitialize와 쌍으로 호출되어야합니다.
끝;
끝;
// 데스크탑 바로 가기 생성,이 메소드는 JNI에서 호출됩니다.
//이 프로세스의 이름은 Java로 시작하여 밑줄을 사용하여 패키지 이름, 클래스 이름 및 Java 클래스의 메소드 이름을 연결합니다. 이 이름 지정 방법은 틀릴 수 없습니다. 그렇지 않으면 Java 클래스가 NATIV 메소드에 해당 할 수 없습니다. 동시에 Win32 플랫폼 에서이 프로세스의 호출 방법은 STDCALL로만 선언 할 수 있습니다.
절차 java_com_wpd_javawindows_createdesktoplink (penv : pjnienv; obj : jobject; programpath, programarg, linkname, descr, iconpath : jstring); stdcall;
var
JVM : tjnienv;
ppath : 문자열;
parg : 문자열;
lname : 문자열;
설명 : 문자열;
iPath : 문자열;
시작하다
jvm : = tjnienv.create (penv);
ppath : = jvm.UnicodejstringToString (Programpath);
PARG : = JVM.UNICODEJSTRINGTOSTRING (programarg);
lname : = jvm.UnicodeJstringToString (linkName);
설명 : = jvm.UnicodeJstringToString (DESCR);
iPath : = jvm.UnicodejstringToString (iconpath);
CreateSkTopLink (ppath, parg, lname, description, ipath);
JVM.Free;
끝;
// Java에게 메시지를 보냅니다
함수 java_com_wpd_javawindows_sendmessage (penv : pjnienv; obj : jobject) : jobject; stdcall;
var
JVM : tjnienv;
MSG : Jobject;
M : 문자열;
시작하다
jvm : = tjnienv.create (penv);
// ************** 전송 된 메시지에 중국어가 포함 된 경우 우선 UTF8encode를 통해 트랜스 코딩해야합니다.
m : = utf8encode ( '중국어');
msg : = jvm.stringtojstring (pchar (m));
결과 : = MSG;
끝;
{$ r *.res}
수출
java_com_wpd_javawindows_createdesktoplink,
java_com_wpd_javawindows_sendmessage;
끝.
MyDll.dll 파일을 생성하려면 위의 컴파일을 넣고 Java가 찾을 수있는 곳에 넣으십시오.
Java의 코드 :
패키지 com.wpd;
공개 클래스 javawindows {
public avior void createSkTopLink (String Programpath, String Programarg, String LinkPath, String Description, String IconPath);
공개 기본 문자열 sendMessage ();
공전{
System.LoadLibrary ( "mydll");
}
public static void main (String s []) {
new JavaWindows (). createSkTopLink ( "c :/rext.exe", "", "test.lnk", "", "c : /test.ico");
System.out.println (New JavaWindows (). sendMessage ());
}
}