เมื่อไม่นานมานี้ฉันใช้ Java เพื่อพัฒนาตัวติดตั้งสำหรับสภาพแวดล้อมเว็บที่สร้างโดย Tomcat MySQL ในระหว่างกระบวนการพัฒนาฉันพบปัญหาเช่นการเขียนรีจิสทรีและการลงทะเบียนบริการระบบ ฯลฯ ซึ่งยากต่อการแก้ปัญหาโดยใช้ Java เองดังนั้นฉันจึงคิดว่าจะใช้ JNI C และ Delphi พัฒนา JNI
ในการพัฒนา JNI ด้วย Delphi ให้ดาวน์โหลด jni.pas ครั้งแรกจาก http://delphi-jedi.org เพิ่มลงในโครงการและคุณสามารถพัฒนา JNI ได้
ตัวอย่างเช่นสร้างทางลัดเดสก์ท็อป:
รหัสใน Delphi:
ห้องสมุด mydll
ใช้
Jni, Windows, Comobj, Activex, Shlobj, Sysutils, รีจิสทรี;
// รับไดเรกทอรีเดสก์ท็อป
ฟังก์ชั่น getDesktoppath (): สตริง;
วาจา
Reg: Tregistry;
Desktoppath: String;
เริ่ม
reg: = tregistry.create;
พยายาม
reg.rootkey: = hkey_current_user;
reg.openkey ('ซอฟต์แวร์/microsoft/windows/currentversion/explorer/shell โฟลเดอร์', false);
ถ้า reg.valueexists ('เดสก์ท็อป') Desktoppath: = reg.readstring ('เดสก์ท็อป');
ผลลัพธ์: = Desktoppath;
ในที่สุด
Reg.Free;
จบ;
จบ;
// สร้างทางลัดเดสก์ท็อป
โพรซีเดอร์ที่สร้างขึ้น KTOPLINK (Programpath, ProgramArg, LinkName, DESCR, ICONPATH: String);
วาจา
Anobj: iunknown;
ShellLink: Ishelllink;
Afile: ipersistfile;
ชื่อไฟล์: กว้างที่สุด;
LinkPath: String;
เริ่ม
linkpath: = getDesktoppath ()+'/'+linkName;
ถ้า uppercase (ExtractFileExt (linkPath)) <> '. lnk' แล้ว // ตรวจสอบว่าส่วนขยายนั้นถูกต้อง
เริ่ม
เพิ่มข้อยกเว้นสร้าง ('ส่วนขยายของทางลัดจะต้องเป็น. lnk!');
จบ;
พยายาม
Oleinitialize (NIL); // เริ่มต้นไลบรารี OLE การเริ่มต้นจะต้องเรียกก่อนใช้ฟังก์ชัน OLE
anobj: = createComobject (clsid_shelllink); // สร้างวัตถุ com ตาม classid ที่กำหนดนี่คือทางลัด
ShellLink: = anobj as ishelllink; // capt ไปยังอินเตอร์เฟสทางลัด
afile: = anobj เป็น ipersistfile; // การแปลง captive เป็นอินเทอร์เฟซไฟล์
// ตั้งค่าคุณสมบัติทางลัดมีเพียงไม่กี่คุณสมบัติที่ใช้กันทั่วไปเท่านั้นที่ตั้งไว้ที่นี่
shelllink.setpath (pchar (programpath));
shelllink.setarguments (pchar (programarg)); // พารามิเตอร์ไฟล์เป้าหมาย
shelllink.setworkingDirectory (PCHAR (ExtractFilePath (programpath))); // ไดเรกทอรีการทำงานของไฟล์เป้าหมาย
shelllink.setdescription (pchar (descr)); // คำอธิบายของไฟล์เป้าหมาย
ShellLink.SeticOnLocation (PCHAR (ICONPATH), 0);
ชื่อไฟล์: = linkpath; // แปลงชื่อไฟล์เป็นประเภทที่กว้างที่สุด
afile.save (pwchar (ชื่อไฟล์), false); // บันทึกทางลัด
ในที่สุด
oleuninitialize; // ปิดไลบรารี OLE ฟังก์ชั่นนี้จะต้องเรียกเป็นคู่กับ oleinitialize
จบ;
จบ;
// สร้างทางลัดเดสก์ท็อปวิธีนี้เรียกว่าใน JNI
// การตั้งชื่อของกระบวนการนี้มีความเฉพาะเจาะจงมาก วิธีการตั้งชื่อนี้ไม่สามารถไม่ถูกต้องมิฉะนั้นคลาส Java จะไม่สามารถสอดคล้องกับวิธี Nativ ด้วย ในเวลาเดียวกันบนแพลตฟอร์ม Win32 วิธีการเรียกของกระบวนการนี้สามารถประกาศได้ว่าเป็น stdcall เท่านั้น
ขั้นตอน JAVA_COM_WPD_JAVAWINDOWS_CREATEDESKTOPLINK (PENV: PJNIENV; OBJ: JOBJECT; PROGRAMPATH, ProgramArg, LinkName, Descr, IconPath: JString); stdcall;
วาจา
JVM: tjnienv;
ppath: สตริง;
PARG: สตริง;
lname: สตริง;
คำอธิบาย: สตริง;
IPATH: String;
เริ่ม
jvm: = tjnienv.create (penv);
pPath: = jvm.unicodejstringToString (programpath);
PARG: = jvm.unicodejstringToString (programArg);
lname: = jvm.unicodejstringToString (linkName);
คำอธิบาย: = jvm.unicodejstringtoString (descr);
iPath: = jvm.unicodejstringToString (iconpath);
Createdesktoplink (ppath, parg, lname, คำอธิบาย, ipath);
JVM.Free;
จบ;
// ส่งข้อความถึง Java
ฟังก์ชั่น JAVA_COM_WPD_JAVAWINDOWS_SENDMESSAGE (PENV: PJNIENV; OBJ: JOBJECT): JOBJECT; stdCall;
วาจา
JVM: tjnienv;
ผงชูรส: Jobject;
M: สตริง;
เริ่ม
jvm: = tjnienv.create (penv);
// ************ หากข้อความที่ส่งมีอักขระจีนจะต้องถูกแปลงรหัสผ่าน UTF8ENCODE ก่อนมิฉะนั้นจะถูกอ่านไม่ออกเมื่อได้รับใน Java
M: = UTF8ENCODE ('จีน');
ผงชูรส: = jvm.stringtojstring (pchar (m));
ผลลัพธ์: = msg;
จบ;
{$ r *.res}
การส่งออก
java_com_wpd_javawindows_createdesktoplink
java_com_wpd_javawindows_sendmessage;
จบ.
ใส่การรวบรวมด้านบนเพื่อสร้างไฟล์ mydll.dll และวางไว้ในที่ที่ Java สามารถค้นหาได้
รหัสใน Java:
แพ็คเกจ com.wpd;
Javawindows ชั้นเรียนสาธารณะ {
โมฆะดั้งเดิมสาธารณะ CreateSktoplink (String Programpath, String ProgramArg, String LinkPath, คำอธิบายสตริง, ไอคอนสตริง);
SendMessage String สาธารณะ ();
คงที่ {
System.loadLibrary ("Mydll");
-
โมฆะคงที่สาธารณะหลัก (สตริง s []) {
ใหม่ Javawindows (). Createdesktoplink ("C:/text.exe", "", "test.lnk", "", "c: /test.ico");
System.out.println (Javawindows ใหม่ (). SendMessage ());
-
-