Hace algún tiempo, utilicé Java para desarrollar un instalador para el entorno web construido por Tomcat MySQL. Durante el proceso de desarrollo, encontré problemas como escribir el registro y registrar servicios del sistema, etc., que fueron difíciles de resolver con el propio Java, por lo que pensé en usar JNI. C y Delphi desarrollan Jni.
Para desarrollar JNI con Delphi, primero descargue jni.pas de http://delphi-jedi.org, agréguelo al proyecto y puede desarrollar JNI.
Por ejemplo, cree un atajo de escritorio:
Código en Delphi:
biblioteca mydll
usos
JNI, Windows, Comobj, ActiveX, Shlobj, Sysutils, Registro;
// Obtener el directorio de escritorio
function getDeskTopPath (): string;
varilla
REG: Tregistry;
DesktoPpath: String;
Comenzar
Reg: = tregumistry.create;
intentar
Reg.rootkey: = hkey_current_user;
Reg.openkey ('Software/Microsoft/Windows/CurrentVersion/Explorer/Shell Carpetas', falso);
si reg.valueeExists ('escritorio') entonces escritorio: = reg.ReadString ('Desktop');
Resultado: = DesktoPpath;
Finalmente
Reg. Desde;
fin;
fin;
// Crear accesos directos de escritorio
Procedimiento creóSkToPlink (Programpath, Programarg, LinkName, Descr, IconPath: String);
varilla
Anobj: Iunknown;
ShellLink: Ishelllink;
Afile: ipersistfile;
Nombre de archivo: widestring;
LinkPath: String;
Comenzar
LinkPath: = getDeskTopPath ()+'/'+LinkName;
Si uppercase (extractFileExt (linkpath)) <> '. lnk' entonces // verifique si la extensión es correcta
Comenzar
elevar la excepción.create ('La extensión del atajo debe ser .lnk!');
fin;
intentar
Oleinitialize (nil); // Inicializar la biblioteca OLE, la inicialización debe llamarse antes de usar la función OLE.
Anobj: = createComObject (clsid_shelllink); // crea un objeto COM basado en el classid dado, aquí está el acceso directo
Shelllink: = anobj como ishelllink; // capt to atajo interfaz
Afile: = anobj como ipersistfile; // conversión cautiva a la interfaz de archivo
// Establecer propiedades de acceso directo, solo se establecen unas pocas propiedades de uso común aquí
Shelllink.setPath (PCHAR (programación));
ShellLink.SetArGuments (PCHAR (ProgramArg)); // Parámetros de archivo de destino
ShellLink.SetWorkingDirectory (PCHAR (ExtractFilePath (ProgramMath))); // Directorio de trabajo del archivo de destino
ShellLink.SetDescription (PCHAR (Descr)); // Descripción del archivo de destino
ShellLink.SeticOnLocation (PCHAR (IconPath), 0);
FileName: = LinkPath; // Convertir el nombre del archivo al tipo Widestring
Afile.save (pwchar (nombre de archivo), falso); // Guardar acceso directo
Finalmente
Oleuninitialize; // Cerrar la biblioteca Ole, esta función debe llamarse en pares con oleinitialize
fin;
fin;
// Crear un atajo de escritorio, este método se llama en JNI
// El nombramiento de este proceso es muy particular. Este método de nombres no puede ser incorrecto, de lo contrario, la clase Java no podrá corresponder al método NATIV con él. Al mismo tiempo, en las plataformas Win32, el método de llamadas de este proceso solo puede declararse como stdcall.
Procedimiento java_com_wpd_javawindows_createdesktoplink (penv: pjnienv; obj: jobject; programath, programarg, linkname, descr, iconpath: jString); stdcall;
varilla
JVM: tjnienv;
Ppath: cadena;
Parg: cadena;
Lname: cadena;
Descripción: cadena;
Ipath: cadena;
Comenzar
Jvm: = tjnienv.create (penv);
PPATH: = JVM.UniCodeJStringToString (programación);
Parg: = jvm.UniCodeJstringToString (Programarg);
Lname: = jvm.UniCodeJStringToString (LinkName);
Descripción: = jvm.UniCodeJstringToString (descr);
Ipath: = jvm.UniCodeJstringToString (iconPath);
CreateskToPlink (ppath, parg, lname, descripción, ipath);
JVM.Free;
fin;
// Envía un mensaje a Java
función java_com_wpd_javawindows_sendmessage (penv: pjnienv; obj: jobject): jobject; stdcall;
varilla
JVM: tjnienv;
Msg: Jobject;
m: cadena;
Comenzar
Jvm: = tjnienv.create (penv);
// ************** Si el mensaje enviado contiene caracteres chinos, primero debe ser trascodado a través de Utf8Encode, de lo contrario, se ganará en Java
m: = utf8Ecode ('chino');
msg: = jvm.StringToJString (pChar (m));
resultado: = msg;
fin;
{$ R *.res}
exportaciones
Java_com_wpd_javawindows_createdesktoplink,
Java_com_wpd_javawindows_sendmessage;
fin.
Coloque la compilación anterior para generar el archivo mydll.dll y colóquelo donde Java pueda encontrarlo.
Código en Java:
paquete com.wpd;
Javawindows de clase pública {
Public nation void createskToPlink (String Programpath, String Programarg, String LinkPath, String Descripción, String IconPath);
cadena pública nativa sendMessage ();
estático{
System.LoadLibrary ("myDll");
}
public static void main (String s []) {
new JavaWindows (). CreateSkToPlink ("c: /text.exe", "", "test.lnk", "", "c: /test.ico");
System.out.println (new JavaWindows (). SendMessage ());
}
}