しばらく前に、Javaを使用して、Tomcat MySQLによって構築されたWeb環境向けのインストーラーを開発しました。開発プロセス中に、レジストリの作成やシステムサービスなどの登録などの問題が発生しました。これは、Java自体を使用することが困難だったため、JNIの使用を考えました。 CとDelphiはJNIを開発しました。
Delphiを使用してJNIを開発するには、http://delphi-jedi.orgからJNI.PASを最初にダウンロードし、プロジェクトに追加するとJNIを開発できます。
たとえば、デスクトップショートカットを作成します。
Delphiのコード:
図書館mydll
用途
JNI、Windows、comobj、Activex、shlobj、sysutils、レジストリ。
//デスクトップディレクトリを取得します
関数getDeskTopPath():string;
var
Reg:Tregistry;
desktoppath:string;
始める
reg:= tregistry.create;
試す
Reg.RootKey:= hkey_current_user;
Reg.Openkey( 'Software/Microsoft/Windows/CurrentVersion/Explorer/Shell Folders'、false);
reg.ValueExists( 'desktop')の場合、desktoppath:= reg.readstring( 'desktop');
結果:= desktoppath;
ついに
reg.free;
終わり;
終わり;
//デスクトップショートカットを作成します
手順CreatedEsKtoplink(Programpath、ProgramArg、LinkName、Descr、IconPath:String);
var
anobj:iunknown;
shelllink:ishelllink;
存在:IpersistFile;
ファイル名:widestring;
LinkPath:文字列;
始める
LinkPath:= getDeskTopPath()+'/'+linkName;
大文字(extractfileext(linkpath))<> '。lnk'の場合、//拡張機能が正しいかどうかを確認します
始める
rease exception.create( 'ショートカットの拡張は.lnk!'でなければなりません);
終わり;
試す
oleInitialize(nil); // oleライブラリを初期化するには、OLE関数を使用する前に初期化を呼び出す必要があります。
anobj:= createcomobject(clsid_shelllink); //指定されたClassIDに基づいてcomオブジェクトを作成します。ここにショートカットがあります
shelllink:= anobj as ishelllink; // captからショートカットインターフェイス
距離:= ipersistfileとしてのanobj; //ファイルインターフェイスへのキャプティブ変換
//ショートカットプロパティを設定すると、一般的に使用されているプロパティがいくつか設定されているのはここで設定されています
shelllink.setpath(pchar(programpath)); //ショートカットのターゲットファイル、一般的に実行可能ファイル
shelllink.setarguments(pchar(programarg)); //ターゲットファイルパラメーター
shelllink.setWorkingDirectory(PCHAR(EXTRACTFILEPATH(PROGRAMPATH))); //ターゲットファイルの作業ディレクトリ
shelllink.setdescription(pchar(descr)); //ターゲットファイルの説明
shelllink.seticonlocation(pchar(iconpath)、0);
ファイル名:= linkpath; //ファイル名をWidestringタイプに変換します
afile.save(pwchar(filename)、false); //ショートカットを保存します
ついに
oleunInitialize; // oleライブラリを閉じる、この関数はoleinitializeとペアで呼び出される必要があります
終わり;
終わり;
//デスクトップショートカットを作成する、この方法はJNIで呼び出されます
//このプロセスの命名は非常に特別です。この命名方法は間違っていない場合があります。そうしないと、JavaクラスはNATIVメソッドに対応することができません。同時に、Win32プラットフォームでは、このプロセスの呼び出し方法はstdcallとしてのみ宣言できます。
手順java_com_wpd_javawindows_createdesktoplink(penv:pjnienv; obj:jobject; programpath、programarg、linkname、descr、iconpath:jstring); stdcall;
var
JVM:Tjnienv;
PPATH:文字列;
PARG:文字列;
lname:string;
説明:文字列;
ipath:string;
始める
jvm:= tjnienv.create(penv);
PPATH:= JVM.UNICODEJSTRINGTOSTRING(PROGRAMPATH);
parg:= jvm.unicodejstringtostring(programarg);
lname:= jvm.unicodejstringtostring(linkname);
説明:= jvm.unicodejstringtostring(descr);
ipath:= jvm.unicodejstringtostring(iconpath);
createdesktoplink(ppath、parg、lname、description、ipath);
jvm.free;
終わり;
// Javaにメッセージを送信します
関数java_com_wpd_javawindows_sendmessage(penv:pjnienv; obj:jobject):jobject; stdcall;
var
JVM:Tjnienv;
MSG:jobject;
M:文字列;
始める
jvm:= tjnienv.create(penv);
// ************送信されたメッセージに漢字が含まれている場合、最初にutf8encodeを介してトランスコードする必要があります。
m:= utf8Encode( 'bishen');
msg:= jvm.stringtojstring(pchar(m));
結果:= msg;
終わり;
{$ r *.res}
輸出
java_com_wpd_javawindows_createdesktoplink、
java_com_wpd_javawindows_sendmessage;
終わり。
上記のコンピレーションを入れてmydll.dllファイルを生成し、Javaが見つけられる場所に配置します。
Javaのコード:
パッケージcom.wpd;
パブリッククラスJavawindows {
public Native void createdesktoplink(string programpath、string programarg、string linkpath、string description、string iconpath);
パブリックネイティブストリングsendmessage();
静的{
System.LoadLibrary( "mydll");
}
public static void main(string s []){
new JavaWindows()。createdesktoplink( "c:/text.exe"、 ""、 "test.lnk"、 ""、 "c:/test.ico");
System.out.println(new Javawindows()。sendMessage());
}
}