2010-07-07 50 views
0

構建使用OS.getRegOpenKey(...)的RCP插件時,我需要同時針對win32.x86和win32.x86_64體系結構。這兩種體系結構的方法參數類型不同。體系結構特定的Eclipse插件片段

我現在明白,沒有直接的方法讓x86或x86_64片段(取決於構建)覆蓋我的主機插件中的方法。

但是,從this post這聽起來像一個片段可以,例如,添加一個類,在主機中擴展一個類。然後,主機插件可以顯式使用ClassLoader從包含在該體系結構構建中的片段中查找並實例化正確的子類。這看起來像什麼?

回答

0

基於鏈接到的帖子,這是我迄今爲止(兩種體系結構現在沒有錯誤構建,我只需要看看構建的64位應用程序是否可以在64位Windows上運行!) :

使用Eclipse的片段插件嚮導創建x86和x86_64片段。清單有一些額外的行手動添加。例如,x86_64的片段的manifest.mf的重要位:

... 
Bundle-SymbolicName: com.company.product.win32.x86_64;singleton:=true 
Fragment-Host: com.company.product.win32;bundle-version="1.0.0" 
Bundle-RequiredExecutionEnvironment: JavaSE-1.6 
Eclipse-PlatformFilter: (& (osgi.os=win32) (osgi.arch=x86_64)) 
Bundle-ClassPath: src/,. 

然後向子類的片段(使用相同的包名從主機插件中的超類,不過那可能ISN」 t必需):

package com.company.product.win32; 

import org.eclipse.swt.internal.win32.OS; 
import org.eclipse.swt.internal.win32.TCHAR; 

/** 
* Subclass the host's abstract OSUtilities 
*/ 
public class OSUtilities64 extends OSUtilities { 

    public String getRegKeyValue (String path, String key) { 
     long [] phkResult = new long [1]; 
     if (OS.RegOpenKeyEx ((long) OS.HKEY_LOCAL_MACHINE, new TCHAR(0, path, true), 
      0, OS.KEY_READ, phkResult) != 0) { 
    ... 

與OSUtilities32類相同。

加入含有主機插件中的片段與feature.xml的:

<plugin 
    id="com.company.product.win32" 
    os="win32" 
    download-size="0" 
    install-size="0" 
    version="0.0.0" 
    unpack="false"/> 
    <plugin 
    id="com.company.product.win32.x86" 
    os="win32" 
    arch="x86" 
    download-size="0" 
    install-size="0" 
    version="0.0.0" 
    fragment="true" 
    unpack="false"/> 
    <plugin 
    id="com.company.product.win32.x86_64" 
    os="win32" 
    arch="x86_64" 
    download-size="0" 
    install-size="0" 
    version="0.0.0" 
    fragment="true" 
    unpack="false"/> 

然後,主機插件可以靜態加載相應的,可用類:

/** 
* Get class from appropriate fragment 
*/ 
public static OSUtilities getOSUtilities() { 
    ClassLoader loader = OSUtilities.class.getClassLoader(); 
    try { 
     Class<?> cls; 
     try { 
      cls = loader.loadClass("com.company.product.win32.OSUtilities32"); 
     } catch (ClassNotFoundException e) { 
      cls = loader.loadClass("com.company.product.win32.OSUtilities64"); 
     } 
     OSUtilities util = (OSUtilities) cls.newInstance(); 
     return util; 

我應該稍後,使用體系結構系統屬性選擇要實例化的實體。