Arhn - архитектура программирования

Java + JNA, ищем способ запустить ShellExecuteW

Я пытаюсь запустить функцию ShellExecute из java с помощью JNA. У меня нет проблем с запуском ShellExecuteA в папках, не поддерживающих Юникод.

import com.sun.jna.*;
import com.sun.jna.platform.win32.ShellAPI;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.win32.*;

public class Main {
    public interface Shell32 extends ShellAPI, StdCallLibrary {
        Shell32 INSTANCE = (Shell32)Native.loadLibrary("shell32", Shell32.class);

        WinDef.HINSTANCE ShellExecuteA(WinDef.HWND hwnd,
                                      String lpOperation,
                                      String lpFile,
                                      String lpParameters,
                                      String lpDirectory,
                                      int nShowCmd);
    }

    public static void main(String[] args) {
        WinDef.HWND h = null;
        WString st = new WString("D:");
        Shell32.INSTANCE.ShellExecuteA(h, "open", st.toString(), null, null, 1);

    }
}

Но поскольку я хочу иметь возможность использовать его в папках Unicode, я действительно хочу запустить ShellExecuteW вместо версии A, но не могу понять, как это сделать. Каждый раз, когда я запускаю следующий код, он просто завершает выполнение, ничего не делая и не показывая никаких ошибок.

import com.sun.jna.*;
import com.sun.jna.platform.win32.ShellAPI;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.win32.*;

public class Main {
    public interface Shell32 extends ShellAPI, StdCallLibrary {
        Shell32 INSTANCE = (Shell32)Native.loadLibrary("shell32", Shell32.class);

        WinDef.HINSTANCE ShellExecuteW(WinDef.HWND hwnd,
                                      String lpOperation,
                                      WString lpFile,
                                      String lpParameters,
                                      String lpDirectory,
                                      int nShowCmd);
    }

    public static void main(String[] args) {
        WinDef.HWND h = null;
        WString st = new WString("D:\\日本語");
        Shell32.INSTANCE.ShellExecuteW(h, "open", st, null, null, 1);

    }
}

Я предполагаю, что проблема заключается в третьем параметре lpFile - я пробовал использовать String, WString все равно. Любая помощь будет оценена.

Спасибо.


  • Вы не проверяете наличие ошибок, так зачем их ожидать? Прочтите документацию вызываемой функции, чтобы узнать, как проверять ошибки. 10.06.2015
  • Если вы собираетесь явно использовать широкие строки, вам обычно нужно использовать их для всех параметров функции. w32 API обычно будет иметь LPTCSTR для всех строк C, что означает String для ascii и WString для Unicode. 10.06.2015
  • @technomage Спасибо, изменение всех строк на WString сработало. 11.06.2015

Ответы:


1

Поскольку это ответ, я повторяю комментарий @technomage к вопросу здесь:

Если вы собираетесь явно использовать широкие строки, вам обычно нужно использовать их для всех параметров функции. API w32 обычно имеет LPTCSTR для всех строк C, что означает String для ascii и WString для Unicode.

Таким образом, рабочий код:

import com.sun.jna.*;
import com.sun.jna.platform.win32.ShellAPI;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.win32.*;

public class Main {
    public interface Shell32 extends ShellAPI, StdCallLibrary {
        Shell32 INSTANCE = (Shell32)Native.loadLibrary("shell32", Shell32.class);

        WinDef.HINSTANCE ShellExecuteW(WinDef.HWND hwnd,
                                      WString lpOperation,
                                      WString lpFile,
                                      WString lpParameters,
                                      WString lpDirectory,
                                      int nShowCmd);
    }

    public static void main(String[] args) {
        WinDef.HWND h = null;
        WString file = new WString("D:\\日本語");
        Shell32.INSTANCE.ShellExecuteW(h, new WString("open"), file, null, null, 1);
    }
}
01.09.2018
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..