使用JNA示例
2015-08-10 18:38
330 查看
使用JNA访问advapi32.dll中的GetUserNameA获得系统用户名
1、根据MSDN中关于GetUserNameA这个API函数的描述
[cpp] view
plaincopy
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接口
[java] view
plaincopy
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示例
[java] view
plaincopy
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类型对照表
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.csdn.net/password318/article/details/4392536
1、根据MSDN中关于GetUserNameA这个API函数的描述
[cpp] view
plaincopy
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接口
[java] view
plaincopy
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示例
[java] view
plaincopy
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 |
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.csdn.net/password318/article/details/4392536
相关文章推荐
- 【暑期基础3】E HDU 2057 A + B Again
- Cocos2d-x中 SimpleAudioEngine的音频引擎
- POJ3274----Gold Balanced Lineup(黄金平衡)
- Linux搭建web服务器
- jna 解决乱码 GBK
- AC自动机算法详解
- 次小生成树 【总结】
- Day1_HTML_总结
- JNA调用C语言动态链接库学习实践总结
- Enumeration与Iterator的对比,ArrayList与Vector的比较
- find、locate、whereis、which和type
- leetcode Remove Duplicates from Sorted Array
- 信息化的十年
- hdu 5351 规律+大数
- Myeclipse2015去空格和等号的代码补全
- DEVOPS 技能列表
- 直接部署java项目到tomcat服务器
- 【暑期基础3】D HDU 2056 Rectangles (几何)
- I - In Touch-Gym 100492I-水题
- Hadoop和大数据:60款顶级开源工具