1

OS.getRegOpenKey(...)を使用するRCPプラグインを構築するときは、win32.x86アーキテクチャとwin32.x86_64アーキテクチャの両方をターゲットにする必要があります。メソッドの引数のタイプは、2つのアーキテクチャで異なります。

x86またはx86_64フラグメント(ビルドに応じて)をホストプラグインのメソッドでオーバーライドする簡単な方法がないことを理解しました。

ただし、この投稿から、フラグメントは、たとえば、ホスト内のクラスを拡張するクラスを追加できるように思われます。そして、ホストプラグインは、ClassLoaderを明示的に使用して、そのアーキテクチャのビルドに含まれるフラグメントから正しいサブクラスを見つけてインスタンス化できます。これはどのように見えますか?

4

1 に答える 1

1

リンク先の投稿に基づいて、これは私がこれまでに持っているものです(両方のアーキテクチャでエラーなしでビルドされ、ビルドされた64ビットアプリが64ビットWindowsで実行されるかどうかを確認する必要があります!):

Eclipseのフラグメントプラグインウィザードを使用して、x86およびx86_64フラグメントを作成します。マニフェストには、手動で追加された2行が追加されています。たとえば、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/,. 

次に、フラグメントにサブクラスを追加しました(ホストプラグインのスーパークラスと同じパッケージ名を使用しましたが、おそらくそれは必要ありません)。

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;

後でインスタンス化するものを選択するには、アーキテクチャシステムプロパティを使用する必要があります。

于 2010-07-07T16:22:33.670 に答える