2013-03-24 37 views
0

http://www.codeguru.com/cpp/w-p/win32/tutorials/article.php/c10849/Setting-a-System-Environment-Variable.htmJNA呼叫PostMessage的〜传递字符串 “环境”

的SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,(LPARAM) “环境”);

JNA和Windows XP:电话通知说,环境已经改变

见链接:twall.github.com/jna/3.5.1/javadoc/

见链接:twall.github.com /jna/3.5.1/javadoc/com/sun/jna/platform/win32/User32.html

PostMessage的(WinDef.HWND的HWND,INT味精,WinDef.WPARAM wParam中,WinDef.LPARAM LPARAM)

该函数将消息放入与创建指定wi的线程关联的消息队列中ndow然后返回而不等待线程处理消息。

import com.sun.jna.*; 
import com.sun.jna.win32.*; 
import com.sun.jna.platform.win32.*; 
import com.sun.jna.ptr.*; 

public class MainJNA { 

public static void main (String [] args){ 

String myString = "Environment"; 
Pointer myPointer = new Memory(myString.length()+1); 
    myPointer.setString(0,myString); 

Pointer HWND_BROADCAST = new Pointer(0xFFFF); 

int   msg = 0x001A; // WM_SETTINGCHANGE = WM_WININICHANGE = 0x001A 
WinDef.HWND hWnd = new WinDef.HWND(HWND_BROADCAST); 
WinDef.WPARAM wParam = new WinDef.WPARAM(0); 
WinDef.LPARAM lParam = new WinDef.LPARAM(myPointer.getLong(0)); 
// Exception in thread "main" java.lang.IllegalArgumentException: 
// Argument value 0x6d6e6f7269766e45 exceeds native capacity (4 bytes) 
// mask=0xffffffff00000000 

User32 user32 = (User32) Native.loadLibrary(
"user32" , User32.class , W32APIOptions.DEFAULT_OPTIONS); 
user32.PostMessage(hWnd , msg , wParam , lParam); 

} 

} // end of class MainJNA 

如何通过字符串参数 “环境” user32.PostMessage ???

,而不是获得线程异常 “主” java.lang.IllegalArgumentException异常:参数值0x6d6e6f7269766e45超过本机容量(4个字节)=面膜0xffffffff00000000

THX

回答

2

你得到错误,因为您要将64位值(myPointer.getLong(0))写入32位容器(LPARAM)。

您已经拥有LPARAM所需的指针值myPointer;将“指针”“投”到LPARAM的推荐方式是简单地声明PostMessage的版本,该版本采用适当类型的第四参数,例如,

void PostMessage(WinDef.HWND hWnd, int msg, WinDef.WPARAM wParam, Pointer lParam); 
void PostMessage(WinDef.HWND hWnd, int msg, WinDef.WPARAM wParam, String lParam); 

这是优选的,更类型安全比不同类型之间进行手动转换(即,从StringPointer为整数型)。