J'ai créé un exécutable 64 bits à l'aide de Visual Studio 2015, destiné à être exécuté sur Windows 7. L'exécutable est un wrapper C++ qui appelle la méthode main d'une application Java via JNI. L'application s'exécute comme prévu, mais dans le gestionnaire des tâches de Windows, dans l'onglet "Processus", le nom de mon application a été précédé de 16 chiffres hexadécimaux. Ainsi, même si mon application se compile sous le nom de "someapp.exe", elle est répertoriée sous le nom de "80005b29594d4a91someapp.exe" dans la liste des processus lorsque je l'exécute. Quelqu'un sait-il pourquoi cela se produit et comment faire en sorte qu'elle apparaisse sous le nom de "someapp.exe" dans le gestionnaire des tâches ?
EDIT 1 :
Je dois noter que la chaîne hexagonale est toujours la même lorsqu'elle apparaît dans le nom. Cependant, dans un faible pourcentage des cas où je lance mon application, celle-ci porte le nom attendu de "someapp.exe". Je n'ai pas été en mesure de déterminer quand la chaîne hexadécimale est ajoutée et quand elle ne l'est pas, mais j'estime que la chaîne hexadécimale apparaît 98 % du temps d'exécution.
EDIT 2 :
Cela semble être lié d'une manière ou d'une autre à l'utilisation de JNI. Lorsque je supprime les appels JNI, le problème cesse complètement de se produire. Ce qui suit représente l'intégralité du code C++ qui compose l'application "someapp" :
#include <jni.h>
#include <Windows.h>
#define STRING_CLASS "java/lang/String"
int main(size_t const argc, char const *const argv[]) {
// Modify the DLL search path
SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_SYSTEM32 |
LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | LOAD_LIBRARY_SEARCH_USER_DIRS);
SetDllDirectoryA(R"(C:\Program Files\Java\jdk1.8.0_112\jre\bin\server)");
// Create and populate the JVM input arguments
JavaVMInitArgs vm_args;
vm_args.version = JNI_VERSION_1_8;
vm_args.ignoreUnrecognized = JNI_FALSE;
vm_args.nOptions = 2;
vm_args.options = new JavaVMOption[vm_args.nOptions];
// Set command-line options
vm_args.options[0].optionString = "-Dfile.encoding=UTF-8";
vm_args.options[1].optionString = "-Djava.class.path=someapp.jar";
// Create the JVM instance
JavaVM *jvm;
JNIEnv *env;
JNI_CreateJavaVM(&jvm, reinterpret_cast<void**>(&env), &vm_args);
// Get the main entry point of the Java application
jclass mainClass = env->FindClass("myNamespace/MainClass");
jmethodID mainMethod = env->GetStaticMethodID(
mainClass, "main", "([L" STRING_CLASS ";)V");
// Create the arguments passed to the JVM
jclass stringClass = env->FindClass(STRING_CLASS);
jobjectArray mainArgs = env->NewObjectArray(
static_cast<jsize>(argc - 1), stringClass, NULL);
for (size_t i(1); i < argc; ++i) {
env->SetObjectArrayElement(mainArgs,
static_cast<jsize>(i - 1), env->NewStringUTF(argv[i]));
}
env->CallStaticVoidMethod(mainClass, mainMethod, mainArgs);
// Free the JVM, and return
jvm->DestroyJavaVM();
delete[] vm_args.options;
return 0;
}
J'ai essayé de supprimer les arguments passés à la méthode Java main, mais cela n'a eu aucun effet sur le résultat.
EDIT 3 :
Grâce à la suggestion de 1201ProgramAlarm, j'ai réalisé que cela était en fait lié à l'exécution à partir d'une vue ClearCase dynamique. La colonne "Nom du chemin d'accès à l'image" dans le Gestionnaire des tâches avait l'une des valeurs suivantes, ce qui est en corrélation directe avec le symptôme du "Nom de l'image" incorrect que j'observais :
\view\view -name \someapp -chemin \someapp.exe
\view -serveur \views\domain\username\view -nom.vws.s \00035\8 0005b29594d4a91someapp.exe
J'aimerais toujours savoir pourquoi cela se produit, mais comme cela n'affecte que notre environnement de développement, la résolution de ce problème n'est plus une priorité. Pour tous ceux qui rencontrent ce problème, voici les logiciels installés dans mon environnement :
- Windows 7 Enterprise x64 SP1
- Rational ClearCase Explorer 7.1.2.8
- Visual Studio 2015 Update 3
- Java x64 JDK 8u112