Java 原生 API 難以直接操作 Windows 註冊表、註冊系統服務。透過 JNI 橋接 Delphi(或 C/C++)實現平台特有功能,是跨平台語言與作業系統深度整合的經典路徑。
Java_套件名_類名_方法名(JNIEnv*, jobject, ...),呼叫慣例 stdcall。myDll.dll,置於 Java library path(如 java.library.path、專案根目錄或系統路徑)。function getDesktopPath: String;
var Reg: TRegistry;
begin
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_CURRENT_USER;
Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders', False);
if Reg.ValueExists('Desktop') then Result := Reg.ReadString('Desktop');
finally Reg.Free; end;
end;
procedure CreateDesktopLink(ProgramPath, ProgramArg, LinkName, Descr, IconPath: String);
var
AnObj: IUnknown; ShellLink: IShellLink; AFile: IPersistFile;
FileName: WideString; LinkPath: String;
begin
LinkPath := getDesktopPath + '\' + LinkName;
if UpperCase(ExtractFileExt(LinkPath)) <> '.LNK' then raise Exception.Create('副檔名必須為 .lnk');
OleInitialize(nil);
try
AnObj := CreateComObject(CLSID_ShellLink);
ShellLink := AnObj as IShellLink;
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;
AFile.Save(PWChar(FileName), False);
finally OleUninitialize; end;
end;
procedure Java_com_wpd_JavaWindows_createDesktopLink(PEnv: PJNIEnv; Obj: JObject;
ProgramPath, ProgramArg, LinkName, Descr, IconPath: JString); stdcall;
var JVM: TJNIEnv; PPath, PArg, LName, Desc, IPath: String;
begin
JVM := TJNIEnv.Create(PEnv);
PPath := JVM.UnicodeJStringToString(ProgramPath);
PArg := JVM.UnicodeJStringToString(ProgramArg);
LName := JVM.UnicodeJStringToString(LinkName);
Desc := JVM.UnicodeJStringToString(Descr);
IPath := JVM.UnicodeJStringToString(IconPath);
CreateDesktopLink(PPath, PArg, LName, Desc, IPath);
JVM.Free;
end;
package com.wpd;
public class JavaWindows {
public native void createDesktopLink(String programPath, String programArg,
String linkName, String description, String iconPath);
public native String sendMessage(); // 示範回傳 UTF-8 字串
static { System.loadLibrary("myDll"); }
public static void main(String[] args) {
new JavaWindows().createDesktopLink("c:\\test.exe", "", "測試.lnk", "", "c:\\test.ico");
System.out.println(new JavaWindows().sendMessage());
}
}
UnicodeJStringToString / StringToJString 處理 UTF-16 ↔ UTF-8 轉換,避免中文亂碼。JNI 讓 Java 擁抱作業系統原生能力,Delphi 開發者可快速產出高效能 DLL,是遷移舊系統功能的實用捷徑。