使用JNA访问advapi32.dll中的GetUserNameA获得系统用户名
1、根据MSDN中关于GetUserNameA这个API函数的描述
- BOOL GetUserName(
- LPTSTR lpBuffer, // address of name buffer
- LPDWORD nSize // address of size of name buffer
- );
GetUserName函数需要两个参数,这两个参数都是指针,第一个指向一个C字符缓存的字符串(C char buffer),第二个指向一个DWORD,根据JNA文档描述,DWORD可以用int对应,而不是long,对于LPDOWD,就应该使用IntByReference类型来对应,byte[] 来映射LPTSTR类型
2、创建Advapi32接口
- import com.sun.jna.Library;
- import com.sun.jna.Native;
- import com.sun.jna.ptr.IntByReference;
- import com.sun.jna.win32.StdCallLibrary;
- public interface Advapi32 extends StdCallLibrary {
- Advapi32 INSTANCE = (Advapi32) Native.loadLibrary("advapi32",
- Advapi32.class);
- boolean GetUserNameA( byte[] name ,IntByReference size);
- }
3、创建Demo示例
- import java.util.Iterator;
- import com.sun.jna.Native;
- import com.sun.jna.ptr.IntByReference;
- import com.sun.jna.win32.StdCallLibrary;
- public class Demo {
- public static void main(String[] args) {
- try {
- byte userName[] = new byte[100];
- IntByReference size=new IntByReference(100);
- boolean bool = Advapi32.INSTANCE.GetUserNameA(userName, size);
- System.out.println("Result:"+bool);
- String uName = new String(userName);
- System.out.println(uName);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
4、补充说明
很多本地函数中需要以两种方式提供字符串,一个版本以A结尾(A表示仅为ASCII文本,支持字符char),另一个版本以W(16位Unicode,支持WCHAR)。如果函数没有其中的一个,则通常以宏的形式代表了他们中某一个,具体是哪个就取决于平台了。通常我们一直选择A版本,直到你真正需要unicode支持,那么你就可以选择W版本,通过显式地指定A或W,你就可以得到你所期望的数据。
本地类型和Window类型对照表
Native Type | Size | Java Type | Common Windows Types |
char | 8-bit integer | byte | BYTE, TCHAR |
short | 16-bit integer | short | WORD |
wchar_t | 16/32-bit character | char | TCHAR |
int | 32-bit integer | int | DWORD |
int | boolean value | boolean | BOOL |
long | 32/64-bit integer | NativeLong | LONG |
long long | 64-bit integer | long | __int64 |
float | 32-bit FP | float | |
double | 64-bit FP | double | |
char* | C string | String | LPTCSTR |
void* | pointer | Pointer | LPVOID, HANDLE, LPXXX |
5、相关链接
- JNA官方网址https://jna.dev.java.net/
- JavaWorld中相关文章
- http://www.coderanch.com/t/274642/Other-JSE-JEE-APIs/java/JNA-call-advapi-GetUserName-function
- WindowAPI信息
- 类型对照表
转载于:http://blog.youkuaiyun.com/password318/article/details/4392536