Некоторое время назад я использовал 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, реестр;
// Получить каталог рабочего стола
function getDesktopPath (): string;
вар
Рег: Tregistry;
Desktoppath: String;
Начинать
Reg: = tregistry.create;
пытаться
Reg.rootkey: = hkey_current_user;
Reg.openkey ('Software/Microsoft/Windows/CurrentVersion/Explorer/Shell папки, false);
Если Reg.valueExists ('Desktop'), то Desktoppath: = Reg.ReadString ('Desktop');
Результат: = Desktoppath;
Окончательно
Reg.free;
конец;
конец;
// Создание ярлыков на рабочем столе
Процедура создана дляктоплинки (Programpath, ProgramArg, LinkName, descr, ICONPATH: String);
вар
Anobj: iunknown;
Shelllink: Ishelllink;
Afile: ipersistfile;
Имя файла: вдовство;
LinkPath: String;
Начинать
Linkpath: = getDesktoppath ()+'/'+linkname;
Если верхний регистр (Extractfileext (linkpath)) <> '.
Начинать
поднять исключение. Create ('расширение ярлыка должно быть .lnk!');
конец;
пытаться
Oleinitialize (NIL); // Инициализировать библиотеку OLE, инициализация должна быть вызвана перед использованием функции OLE.
Anobj: = createComobject (clSID_SHELLLINK); // Создать объект COM на основе данной классики, вот ярлык
Shelllink: = anobj как ishelllink; // capt to ortkcut interface
Afile: = anobj как ipersistfile; // преобразование в пленке в интерфейс файла
// Установить свойства ярлыка, здесь установлены лишь несколько часто используемых свойств
Shelllink.setpath (pchar (programpath));
Shelllink.setarguments (pchar (ProgramArg)); // Целевые параметры файла
Shelllink.setworkingDirectory (pchar (ExtractFilePath (Programpath))); // Рабочий каталог целевого файла
Shelllink.setdescription (pchar (descr)); // Описание целевого файла
Shelllink.seTicOnLocation (pchar (ICONPATH), 0);
Имя файла: = linkpath; // конвертировать имя файла в тип WideString
Afile.save (pwchar (имя файла), false); // Сохранить ярлык
Окончательно
Олеунинитиализация; // Закрыть библиотеку OLE, эта функция должна быть вызвана парами с олеинициализацией
конец;
конец;
// Создать сочетание рабочего стола, этот метод вызывается в JNI
// Наименование этого процесса очень специфично. Этот метод именования не может быть неверным, в противном случае класс Java не сможет соответствовать методу NATIV с ним. В то же время, на платформах Win32, вызывающий метод этого процесса может быть объявлен только STDCALL.
Процедура java_com_wpd_javawindows_createdesktoplink (penv: pjnienv; obj: jobject; programpath, programarg, linkname, descr, iconpath: jstring); stdcall;
вар
JVM: tjnienv;
Ppath: String;
PARG: String;
Lname: String;
Описание: строка;
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, description, ipath);
Jvm.free;
конец;
// Отправить сообщение на Java
функция java_com_wpd_javawindows_sendmessage (penv: pjnienv; obj: jobject): jobject; stdcall;
вар
JVM: tjnienv;
MSG: Jobject;
М: Строка;
Начинать
Jvm: = tjnienv.create (penv);
// ************ Если отправленное сообщение содержит китайские символы, оно должно быть транскодировано через UTF8encode, в противном случае оно будет искажено, когда будет получено на Java
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 Native void CreateSktoplink (String Programpath, String ProgramArg, String LinkPath, String Description, String Iconpath);
публичная собственная строка sendmessage ();
статический {
System.loadlibrary ("mydll");
}
public static void main (string s []) {
new javawindows (). Creationesktoplink ("c: /txt.exe", "", "test.lnk", "", "c: /test.ico");
System.out.println (new javawindows (). Sendmessage ());
}
}