2013-03-24 87 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爲整數型)。