Frage

Ich brauche beide win32.x86 und win32.x86_64 Architekturen zum Ziel, wenn ein RCP Plug-in Gebäuden, das Anwendung OS.getRegOpenKey (...). Die Typen der Argumente für die Methode sind für die beiden Architekturen.

Ich verstehe jetzt, dass es keine einfache Möglichkeit ist es, ein x86 oder x86_64-Fragment haben (in Abhängigkeit von der Build) außer Kraft gesetzt, ein Verfahren in meinem Host-Plug-in.

Doch von diesen Beitrag es wie ein Fragment kann klingt, zum Beispiel, fügen Sie eine Klasse, die erstreckt, um eine Klasse in dem Host. Und die Host-Plugin kann dann explizit die Classloader verwenden zu finden und die richtige Unterklasse aus dem Fragmente in dieser Architektur Build enthielt instanziiert. Was würde das aussehen?

War es hilfreich?

Lösung

Basierend auf den verlinkten Post, das ist, was ich bisher (baut ohne Fehler nun für beide Architekturen, und ich brauchte nur um zu sehen, ob die integrierte 64-Bit-Anwendung auf 64-Bit-Windows ausgeführt werden!):

Mit Eclipse Fragment Plug-in-Assistenten, um die x86 und x86_64-Fragmente zu erstellen. Die Manifeste haben ein paar zusätzliche Zeilen manuell hinzugefügt. Zum Beispiel können die wichtigen Bits des Manifest.mf des x86_64-Fragment:

...
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/,. 

Dann hinzugefügt Unterklasse mit dem Fragmente (die gleichen Paket Namen wie die Superklasse von der Host-Plug-in verwendet, aber das ist wahrscheinlich nicht notwendig):

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) {
    ...

Das Gleiche gilt für die OSUtilities32 Klasse.

Hinzugefügt die Fragmente an das feature.xml der Host-Plug-in, enthaltend:

   <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"/>

Dann wird die Host-Plug-In kann die entsprechende statisch geladen werden, zur Verfügung Klasse:

/**
 * 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;

soll ich die Architektur Systemeigenschaft verwenden, um auszuwählen, welche zu instanziiert -. Später

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top