【J2SE綜合】java通過JNI與delphi交互

發表于:2007-05-25來源:作者:點擊數: 標簽:java通過綜合JNIj2se
前一段時間,用 java 開發一個安裝程序,適用于 tomcat mysql 構建的web環境。在開發的過程中遇到與寫注冊表,注冊系統服務等問題用java本身很難解決,于是想到用JNI。C與delphi兩者開發JNI,我是從delphi轉到java上來的,我選擇了delphi。 用delphi開發JNI
前一段時間,用java開發一個安裝程序,適用于tomcat mysql構建的web環境。在開發的過程中遇到與寫注冊表,注冊系統服務等問題用java本身很難解決,于是想到用JNI。C與delphi兩者開發JNI,我是從delphi轉到java上來的,我選擇了delphi。
     用delphi開發JNI,首先從http://delphi-jedi.org 下載JNI.pas,把它加入到工程中就可以開發JNI了。
例如創建桌面快捷方式:
Delphi中的代碼:
  library myDll
  
  uses
  JNI,windows,ComObj,ActiveX,ShlObj,SysUtils,Registry;
  //取得桌面目錄
  function getDesktopPath():String;
  var
      Reg:TRegistry;
      DesktopPath:String;
   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 DesktopPath:=Reg.ReadString('Desktop');
        Result:= DesktopPath;
       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 //檢查擴展名是否正確
        begin
         raise Exception.Create('快捷方式的擴展名必須是.lnk!');
        end;
        try
         OleInitialize(nil);//初始化OLE庫,在使用OLE函數前必須調用初始化
         AnObj := CreateComObject(CLSID_ShellLink);//根據給定的ClassID生成一個COM對象,此處是快捷方式
         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;//把文件名轉換為WideString類型
         AFile.Save(PWChar(FileName), False);//保存快捷方式
       
       finally
         OleUninitialize;//關閉OLE庫,此函數必須與OleInitialize成對調用
       end;
     end;
     
     //創建桌面快捷方式,在JNI中調用的就是這個方法
     //這個過程的命名很有講究,它以 Java 開頭,用下劃線將 Java 類的包名、類名和方法名連起來。這個命名方法不能有誤,否則, Java 類將無法將 nativ 方法與它對應起來。同時,在 Win32 平臺上,此過程的調用方式只能聲明為 stdcall 。
     procedure Java_com_wpd_JavaWindows_createDesktopLink(PEnv: PJNIEnv; Obj: JObject;ProgramPath,ProgramArg,LinkName,Descr,iconPath:JString);stdcall;
      var
      JVM:TJNIEnv;
      PPath:String;
      PArg:String;
      LName:String;
      Description:String;
      IPath:String;
     begin
          JVM := TJNIEnv.Create(PEnv);
          PPath:=JVM.UnicodeJStringToString(ProgramPath);
          PArg:=JVM.UnicodeJStringToString(ProgramArg);
          LName:=JVM.UnicodeJStringToString(LinkName);
          Description:=JVM.UnicodeJStringToString(Descr);
          IPath:=JVM.UnicodeJStringToString(IconPath);
          CreateDesktopLink(PPath,PArg,LName,Description,IPath);
          JVM.Free;
     end;
     
     {$R *.res}
exports
    Java_com_wpd_JavaWindows_createDesktopLink;
    
end.
把上面的編譯生成myDll.dll文件,放到java能夠找到的地方。
java中的代碼:
package com.wpd;

public class JavaWindows {
   public native void createDesktopLink(String programPath,String programArg,String linkPath,String description,String iconPath);
   static{
       System.loadLibrary("myDll");
   }
   public static void main(String s[]){
       new JavaWindows().createDesktopLink("c:\text.exe","","測試.LNK","","c:\test.ico");
   }
}
http://wyit.spaces.live.com

原文轉自:http://www.anti-gravitydesign.com

評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97