当构建使用OS.GetRegopenkey(...)的RCP插件时,我需要针对Win32.x86和Win32.x86_64架构。对于两个架构,该方法的参数类型是不同的。

我现在知道,没有直接的方法可以使x86或x86_64片段(取决于构建)覆盖我的主机插件中的一种方法。

但是,来自 这个帖子 听起来像是片段可以添加一个在主机中扩展类的类。然后,主机插件可以显式使用ClassLoader查找并实例从该体系结构构建中包含的片段中的正确子类实例。这会是什么样?

有帮助吗?

解决方案

基于链接到帖子,这是我到目前为止所拥有的(现在两个架构都没有错误的构建,我只需要查看构建的64位应用程序是否会在64位Windows上运行!):):):

使用Eclipse的片段插件向导创建X86和X86_64片段。清单手动添加了几行。例如,x86_64 fragment的清单的重要位: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/,. 

然后,在片段中添加了子类(使用与主机插件中的超级类相同的软件包名称,但这可能不是必需的):

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类也相同。

将片段添加到功能.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;

我应该使用架构系统属性来选择该属性以稍后进行实例化。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top