問題のコードは、以前のリリースのWindowsとほぼ同じ構成で機能しましたが、Windows7で実行されたことがまだわかっていません。それが私が今解決する必要があることです。
簡単に言うと、一部のCコードは、Javaプログラムを起動する前に構成とセキュリティのチェックを実行し、Javaでは簡単に実行できないデータを渡します。次に、Javaは適切なタイミングで同じCコードを起動し、それ自体が別のJavaプログラムを起動します。2回目のプログラムの起動は完全に独立している必要があります(nohupと考えてください)。したがって、2回目の起動です。
現在、Cプログラムは通常の方法でJavaプログラムを起動しますが、JavaがCプログラムを起動しようとすると、次のようにエラーが発生します。
/cygdrive/c/opt/ST/v3.3/bin/ST.exe:共有ライブラリのロード中にエラーが発生しました:?:共有オブジェクトファイルを開くことができません:そのようなファイルまたはディレクトリはありません
Windowsは何年にもわたってそのような弱点であったため、CコードはCygwinのposix環境で記述されていますが、実際に行われるのは通常のCタイプのものだけです(Cygwinに固有のものはなく、実際、過去にはMicrosoftの開発ツールを使用して構築されていますが、その環境は現在利用できません)。Cygwin環境は、サービスのコマンドライン管理(cygrunsrv)や完全なnixのような環境(bashなど)など、他にも多くの大きな利点を追加します。実際、WindowsはJavaからプログラムを起動する方法を何度も変更したため、CygwinはJava起動コードの標準化を支援します。抜粋は次のとおりです。
if (ClientOS.indexOf("Windows") != -1)
{
if (ClientOS.equals("Windows 95"))
{
cmd = "command.com /C ";
} else if (ClientOS.equals("Windows 98"))
{
cmd = "command.com /C ";
//cmd = "cmd.exe /C ";
} else if (ClientOS.equals("Windows NT"))
{
cmd = "cmd.exe /C ";
} else if (ClientOS.equals("Windows 2000"))
{
cmd = "cmd.exe /C ";
} else if (ClientOS.equals("Windows XP"))
{
cmd = "cmd.exe /C ";
} else {
cmd = "cmd.exe /C ";
}
if (cygwin)
{
cmd += Shell+" '"+Command+"'";
} else {
cmd += Command;
}
} else {
cmd = Command;
}
(はい、if構造をより適切に最適化できます。)
この場合、「シェル」は次のようになります。
Shell=C:/cygwin/bin/bash -c
そして、上記とサポートコードが正常に機能することを確認するためのテストプログラムがあります-それは少しのシェルプログラムを実行し、それが本来あるべきと思ったものを取り戻すことを保証します。それは言う:
シェルを使用してプログラムを実行する機能を確認しています...はい、シェルプログラムは正常に動作します。
cmdの最終的な内容は次のようになります。
cmd.exe / CC:/cygwin/bin/bash -c'/cygdrive/c/opt/ST/v3.3/bin/ST.exe'
私が疑うこと:
Cygwin1.DLLファイルが正しく見つからないことが原因だと思います。C:/cygwin/bin/cygwin1.dllにあります
システムレベルのPATHとCygwinPATHの両方に、cygwin.dllファイルへのパスが含まれていることに注意してください。cygwin1.dllのコピーをターゲット実行可能ファイルが存在するbinディレクトリに移動することも機能しませんでした。
LD_LIBRARY_PATHはここで何か助けになりますか?もしそうなら、それがどのように設定されるかについて何か考えはありますか?
他のアイデア?
ありがとう。