Java+;JNA,正在寻找运行ShellExecuteW的方法

Java+;JNA,正在寻找运行ShellExecuteW的方法,java,winapi,unicode,jna,shellexecute,Java,Winapi,Unicode,Jna,Shellexecute,我正在尝试使用JNA从java运行ShellExecute函数。 在非unicode文件夹上运行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 Shel

我正在尝试使用JNA从java运行ShellExecute函数。 在非unicode文件夹上运行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而不是版本,但不知道如何运行。每次我运行下面的代码时,它只是完成执行,没有执行任何操作或显示任何错误

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。 任何帮助都将不胜感激


谢谢。

因为这是我在这里重复@technomage对问题的评论的答案:


如果要显式使用宽字符串,通常需要将其用于所有函数参数。W32API通常会为所有C字符串提供LPTCSTR,这意味着ascii字符串和unicode的WString

因此,工作守则是:

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);
    }
}

你不检查错误,为什么你会期望有错误?阅读所调用函数的文档,了解如何测试错误。如果要显式使用宽字符串,通常需要对所有函数参数使用宽字符串。w32 API通常会为所有C字符串设置
LPTCSTR
,这意味着对于ascii来说是
String
,对于unicode来说是
WString
。@technomage谢谢,将所有字符串更改为WString是有效的。