سؤال

أحتاج إلى استهداف كل من بنيات Win32.x86 و Win32.x86_64 عند إنشاء مكون إضافي RCP يستخدم OS.GetRegopenKey (...). تختلف أنواع الوسائط الخاصة بالطريقة للبنية.

أنا أفهم الآن أنه لا توجد طريقة مباشرة للحصول على جزء X86 أو X86_64 (اعتمادًا على البناء) ، تجاوز طريقة في المكون الإضافي المضيف.

ومع ذلك ، من هذا المشنور يبدو أن الشظية يمكن ، على سبيل المثال ، إضافة فصل يمتد فئة في المضيف. ويمكن للمكون الإضافي المضيف استخدام جهاز تحميل ClassLoader بشكل صريح للعثور على الفئة الفرعية الصحيحة من الشظية المدرجة في بناء هذا البنية. كيف سيكون هذا؟

هل كانت مفيدة؟

المحلول

استنادًا إلى النشر المرتبط ، هذا ما لدي حتى الآن (يبني بدون خطأ الآن لكلا البنية ، وأحتاج فقط إلى معرفة ما إذا كان التطبيق 64 بت سيعمل على النوافذ 64 بت!):

استخدم معالج المكونات الإضافية لشظية Eclipse لإنشاء شظايا X86 و X86_64. تحتوي البيان على بضعة خطوط إضافية تمت إضافتها يدويًا. على سبيل المثال ، البتات المهمة من عرض جزء X86_64.

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

نفس الشيء بالنسبة لفئة الانكسار 32.

تمت إضافة الشظايا إلى الميزة. 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