2010-07-07 48 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; 

我应该稍后,使用体系结构系统属性选择要实例化的实体。