首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

JNI 實戰:Java 呼叫 Delphi 實現註冊表操作與系統服務註冊

     編輯:Java 程式設計入門

Java 原生 API 難以直接操作 Windows 註冊表、註冊系統服務。透過 JNI 橋接 Delphi(或 C/C++)實現平台特有功能,是跨平台語言與作業系統深度整合的經典路徑。

開發環境準備

  1. 下載 JNI.pas 置入 Delphi 專案。
  2. 編寫 Delphi DLL 導出符合 JNI 命名慣例的函式:
    Java_套件名_類名_方法名(JNIEnv*, jobject, ...),呼叫慣例 stdcall。
  3. 編譯產生 myDll.dll,置於 Java library path(如 java.library.path、專案根目錄或系統路徑)。

Delphi 關鍵實作片段

取得桌面路徑

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;

JNI 橋接函式

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;

Java 端宣告與載入

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());
    }
}

關鍵細節

  • 字串傳遞:Delphi 端用 UnicodeJStringToString / StringToJString 處理 UTF-16 ↔ UTF-8 轉換,避免中文亂碼。
  • 例外處理:Delphi 例外需自行捕獲轉為 JNI 錯誤碼,否則導致 JVM 崩潰。
  • 資源釋放:COM/OLE 初始化成對調用,JNI 區域參考手動管理。
JNI 讓 Java 擁抱作業系統原生能力,Delphi 開發者可快速產出高效能 DLL,是遷移舊系統功能的實用捷徑。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved