in src/main/cpp/jnilib/windows/src/jni_WindowsNativeUtils.c [174:280]
JNIEXPORT void JNICALL Java_org_netbeans_installer_utils_system_WindowsNativeUtils_createShortcut0(JNIEnv* jEnv, jobject jObject, jobject jShortcut) {
unsigned short *shortcutPath = getWideStringFromMethod(jEnv, jShortcut, "getPath");
unsigned short *targetPath = getWideStringFromMethod(jEnv, jShortcut, "getTargetPath");
unsigned short *description = getWideStringFromMethod(jEnv, jShortcut, "getDescription");
unsigned short *iconPath = getWideStringFromMethod(jEnv, jShortcut, "getIconPath");
jint iconIndex = getIntFromMethod (jEnv, jShortcut, "getIconIndex");
unsigned short *workingDirectory = getWideStringFromMethod(jEnv, jShortcut, "getWorkingDirectoryPath");
unsigned short *arguments = getWideStringFromMethod(jEnv, jShortcut, "getArgumentsString");
HRESULT tempResult;
IShellLinkW* shell;
HRESULT comStart = CoInitialize(NULL);
int errorCode = 0;
tempResult = CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &IID_IShellLinkW, (void **) &shell);
if (SUCCEEDED(tempResult)) {
IPersistFile *persistFile;
// we will save the shell link in persistent storage
tempResult = shell->lpVtbl->QueryInterface(shell, &IID_IPersistFile, (void **) &persistFile);
if (SUCCEEDED(tempResult)) {
tempResult = shell->lpVtbl->SetPath(shell, targetPath);
if (!SUCCEEDED(tempResult)) {
throwException(jEnv, "Native error (-2)");
errorCode = -2;
}
// make sure description length is less than MAX_PATH
if ((errorCode == 0) && (description != NULL)) {
if (WCSLEN(description) < MAX_PATH) {
if (!SUCCEEDED(shell->lpVtbl->SetDescription(shell, description))) {
throwException(jEnv, "Native error (-3)");
errorCode = -3;
}
} else {
unsigned short *desc = (unsigned short *) MALLOC(sizeof(unsigned short) * MAX_PATH);
ZERO(desc, sizeof(unsigned short) * MAX_PATH);
desc = WCSNCPY(desc, description, MAX_PATH);
if (!SUCCEEDED(shell->lpVtbl->SetDescription(shell, desc))) {
throwException(jEnv, "Native error (-4)");
errorCode = -4;
}
FREE(desc);
}
}
if ((errorCode == 0) && (arguments != NULL)) {
if (!SUCCEEDED(shell->lpVtbl->SetArguments(shell, arguments))) {
throwException(jEnv, "Native error (-5)");
errorCode = -5;
}
}
if ((errorCode == 0) && (workingDirectory != NULL)) {
if (!SUCCEEDED(shell->lpVtbl->SetWorkingDirectory(shell, workingDirectory))) {
throwException(jEnv, "Native error (-6)");
errorCode = -6;
}
}
if ((errorCode == 0) && (iconPath != NULL)) {
if (!SUCCEEDED(shell->lpVtbl->SetIconLocation(shell, iconPath, iconIndex))) {
throwException(jEnv, "Native error (-7)");
errorCode = -7;
}
}
// use normal window.
if (errorCode == 0) {
if (!SUCCEEDED(shell->lpVtbl->SetShowCmd(shell, SW_NORMAL))) {
throwException(jEnv, "Native error (-8)");
errorCode = -8;
}
}
if (errorCode == 0) {
if (mkdirsW(jEnv, shortcutPath)) {
if (!SUCCEEDED(persistFile->lpVtbl->Save(persistFile, shortcutPath, TRUE))) {
throwException(jEnv, "Native error (-9)");
errorCode = -9;
}
} else {
throwException(jEnv, "Native error (-10)");
errorCode = -10;
}
}
if (errorCode == 0) {
persistFile->lpVtbl->Release(persistFile);
}
} else {
throwException(jEnv, "Native error (-11)");
errorCode = -11;
}
shell->lpVtbl->Release(shell);
} else {
throwException(jEnv, "Native error (-12)");
errorCode = -12;
}
if (comStart == S_OK) {
CoUninitialize();
}
FREE(shortcutPath);
FREE(targetPath);
FREE(description);
FREE(iconPath);
FREE(workingDirectory);
FREE(arguments);
}