Há algum tempo, usei o Java para desenvolver um instalador para o ambiente da web criado pelo Tomcat MySQL. Durante o processo de desenvolvimento, encontrei problemas como escrever registro e registrar serviços do sistema etc., que eram difíceis de resolver usando o próprio Java, então pensei em usar o JNI. C e Delphi desenvolvem JNI.
Para desenvolver o JNI com o Delphi, faça o download do JNI.PAS de http://delphi-jedi.org, adicione-o ao projeto e você pode desenvolver o JNI.
Por exemplo, crie um atalho de mesa:
Código em Delphi:
biblioteca mydll
usos
JNI, Windows, Comobj, ActiveX, Shlobj, Sysutils, Registry;
// Obtenha o diretório da área de trabalho
função getDesktopPath (): string;
var
Reg: Tregistry;
DesktopPath: String;
Começar
Reg: = Tregistry.create;
tentar
Reg.rootkey: = hkey_current_user;
Reg.openkey ('Software/Microsoft/Windows/CurrentVersion/Explorer/Shell Pastas', false);
se reg.valueExists ('Desktop') então desktopPath: = reg.readstring ('desktop');
Resultado: = DesktopPath;
Finalmente
Reg.Free;
fim;
fim;
// Crie atalhos de mesa
Procedimento CreatedESkToplink (ProgramAmath, ProgramArg, LinkName, Descr, IconPath: String);
var
Anobj: Iunknown;
ShellLink: Ishelllink;
AFILE: IPERSISTFILE;
Nome do arquivo: wideestring;
LinkPath: string;
Começar
LinkPath: = getDesktopPath ()+'/'+linkName;
Se uppercase (ExtractFileExt (LinkPath)) <>. lnk 'então // verifique se a extensão está correta
Começar
levantar exceção.Create ('A extensão do atalho deve ser .lnk!');
fim;
tentar
Oleinitialize (NIL); // Inicialize a biblioteca OLE, a inicialização deve ser chamada antes de usar a função OLE.
Anobj: = createComObject (clsid_shelllink); // Crie um objeto COM baseado no Classid dado, aqui está o atalho
ShellLink: = anobj como ishelllink; // Capt para interface de atalho
AFILE: = ANOBJ como IPERSISTFILE; // Conversão em cativeiro em interface de arquivo
// Defina propriedades de atalho, apenas algumas propriedades comumente usadas são definidas aqui
Shelllink.setpath (pchar (programath));
Shelllink.setArguments (PChar (programarg)); // parâmetros de arquivo de destino
Shelllink.setWorkingDirectory (PCHA (ExtractFilePath (Programmatath))); // Diretório de trabalho do arquivo de destino
Shelllink.setDescription (PChar (descr)); // Descrição do arquivo de destino
ShellLink.SeticOnLocation (PChar (ICONPATH), 0);
Nome do arquivo: = linkPath; // Converter o nome do arquivo em tipo widestring
Afile.Save (PWCHAR (nome do arquivo), false); // Salvar atalho
Finalmente
Oleuninitialize; // Fechar a biblioteca OLE, essa função deve ser chamada em pares com oleinitializar
fim;
fim;
// Crie um atalho de mesa, esse método é chamado no JNI
// A nomeação desse processo é muito particular. Esse método de nomeação não pode estar incorreto; caso contrário, a classe Java não poderá corresponder ao método Nativ com ele. Ao mesmo tempo, nas plataformas Win32, o método de chamada desse processo só pode ser declarado como stdcall.
Procedimento java_com_wpd_javawindows_createsktoplink (Penv: pjnienv; obj: jobject; programath, programarg, linkname, descr, iconpath: jstring); stdcall;
var
JVM: tjnienv;
Ppath: string;
PARG: String;
Lname: string;
Descrição: string;
Ipath: string;
Começar
JVM: = tjnienv.create (Penv);
Ppath: = jvm.unicodejstringToString (ProgrampAth);
PARG: = JVM.UnicodeJStringToString (ProgramArg);
Lname: = jvm.unicodejstringToString (linkName);
Descrição: = jvm.unicodejstringToString (descr);
Ipath: = jvm.unicodejstringToString (iconpath);
CreatedeskToplink (PPath, Parg, Lname, Descrição, Ipath);
JVM.Free;
fim;
// Envie uma mensagem para Java
função java_com_wpd_javawindows_sendMessage (Penv: pjnienv; obj: jobject): jobject; stdcall;
var
JVM: tjnienv;
msg: Jobject;
m: string;
Começar
JVM: = tjnienv.create (Penv);
// ************ Se a mensagem enviada contiver caracteres chineses, ela deve primeiro ser transcodificada através do UTF8ENCODE, caso contrário, ela será fechada quando obtida em java
m: = utf8Encode ('chinês');
msg: = jvm.stringTojString (PChar (m));
resultado: = msg;
fim;
{$ R *.res}
exportações
Java_com_wpd_javawindows_createsktoplink,
Java_com_wpd_javawindows_sendMessage;
fim.
Coloque a compilação acima para gerar o arquivo mydll.dll e coloque -o onde Java pode encontrá -lo.
Código em Java:
pacote com.wpd;
classe pública Javawindows {
public native void CreateSkToplink (String ProgramAdath, String ProgramArg, String LinkPath, String Descrição, String IConPath);
public nativo string sendMessage ();
estático{
System.LoadLibrary ("mydll");
}
public static void main (strings s []) {
New Javawindows (). Createdesktoplink ("c: /text.exe", "", "test.lnk", "", "c: /test.ico");
System.out.println (New Javawindows (). SendMessage ());
}
}