tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
1
ZUGRIFFE
533
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    mcdroemmel mcdroemmel ist offline Mitglied Bronze
    Registriert seit
    Mar 2009
    Beiträge
    26
    Hallo zusammen,

    habe da wohl ein verzwicktes Problem wo ich echt Hilfe benötige.
    Zweck:

    Ich habe eine Java Anwendung, die SWT zur Visualisierung nutzt.
    Und zwar will ich von meinem Java-App-Server per RMI eine entfernte Anwendung rufen, die dann mit Hilfe von SWT und dem dort per OLE integrierten Internet-Explorer die Daten visualisiert. Die gefeuerte RMI Methode soll also quasi eine Aktivität in dem OLE-Objekt (Internet-Explorer) auslösen.

    Bisher ist das wie folgt realisiert:
    Mit SWT definiere ich einen OLE-Frame und steuere den Internet-Explorer als OLE-Objekt. Der IE startet einmalig eine URL. In dieser URL ist wiederum ein Active-X-Control eingebettet. Dieses Active-X-Control wird dann von meiner Java-Anwendung indirekt über Javascript der aufgerufenen HTML-Seite angesteuert.
    Dieses Active-X startet ein grafisches Tool im Explorer. Das Control ist leider nicht direkt per OLE ansteuerbar. Meine Java-Anwendung startet dann im IE wie gesagt eine Java-Script-Funktion die dann das Active-X veranlasst jeweils eine neue Grafik zu verarbeiten.
    Soweit so gut. Das ganze funktioniert mit unterschiedlichen Aufrufen der JS-Funktion wenn ich das z.B. von unterschiedlichen Buttons in SWT ansteuere.
    Jetzt kommt RMI ins Spiel.
    Nämlich die ganze Anwendung soll nämlich nicht interaktiv über Buttons, sondern von einem Java-App-Server aus getriggert werden (einer Bean um genau zu sein), der die zu visualisierenden Daten hält.
    Also Server ruft per RMI meine Java-Client-Anwendung (nur JRE). Eine Methode meines RMI-Objektes soll dann die Java-Methode meiner Visualisierung aufrufen, die ihrerseits dann im IE per OLE die Javascript-Funktion startet.
    RMI an sich funktioniert. Visualisierung in SWT mit OLE im IE auch.
    Aber wenn meine RMI-Methode (die als Parameter das Objekt erhält welches die UI steuert) dann die SWT-Visualisierungsmethode aufruft fliegt mir die JVM um die Ohren mit EXCEPTION_ACCESS_VIOLATION (0xc0000005)

    Jetzt hab ich schon gelesen das das wohl was mit Threads zu tun haben wird. Die Methode des RMI-Objekts läuft ja wohl in einem anderen Thread als dem, der das SWT-UI erzeugt hat.

    Wie kann ich das Problem lösen? Mit eigener Thread-Steuerung hab ich nicht so wahnsinnig viel Erfahrung bisher.

    So sieht der Quellcode (gekürzt) im wesentlichen aus (bitte keine Syntax-Fehler melden..können durch die Kürzung reingekommen sein):

    Vielen lieben Dank im Vorraus für Eure Unterstützung:
    McD

    Das Objekt mit meiner Main-Methode. Sie erzeugt das Objekt mit dem UI und erzeugt Registry und das Binding für das RMI-Objekt

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    
        private static final Logger log = Logger.getLogger( FpViewer.class.getName() );
        
        public static void main(String[] args) {
     
            Registry r;
     
            try
            {
                // UI aufbauen
                Display display = Display.getDefault();
                Shell shell = new Shell(display);
                FpViewerUI ui = new FpViewerUI(shell, SWT.NULL, log);
                Point size = ui.getSize();
                shell.setLayout(new FillLayout());
                shell.layout();
                if(size.x == 0 && size.y == 0) {
                    ui.pack();
                    shell.pack();
                } else {
                    Rectangle shellBounds = shell.computeTrim(0, 0, size.x, size.y);
                    shell.setSize(shellBounds.width, shellBounds.height);
                }
     
                RMISocketFactory.setSocketFactory(new FixedPortRMISocketFactory());
                    r = LocateRegistry.createRegistry(28000);
                // RemoteServer.setLog( System.out );
                System.out.println("Binde Klasse Kall2FpDevRMI an Server...");
                log.log(Level.INFO,"Binde Klasse Kall2FpDevRMI an Server...");
                r.bind("IKall2FpViewer", new Kall2FpViewer(log,ui));
                System.out.println("Starte UI-Loop");
     
                shell.open();
                // UI-Loop
                while (!shell.isDisposed()) {
                    if (!display.readAndDispatch())
                        display.sleep();
                }
            }
            catch (Exception ex)
            {
                ex.printStackTrace();
            }
        }

    meine RMI-Klasse Kall2FpViewer hier. Die Methode createJPG ist die Methode die vom App-Server aufgerufen wird:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    public class Kall2FpViewer extends UnicastRemoteObject implements IKall2FpViewer {
     
        public static final long serialVersionUID = 4711;
        private Logger log;
        private FpViewerUI ui;
        
        public Kall2FpViewer (Logger logger, FpViewerUI fpViewerUI) throws RemoteException
        {
            super ();
            // Daten im Objekt sichern
            log = logger;
            ui  = fpViewerUI;
        }
        
        public boolean createJPG(String fileName, String guid) {
            ui.startJPGRendering(fileName, guid);
            return false;
        }
     
    }

    meine Visualisierungs-Klasse (gekürzt, könnte sein das deshalb vielleicht mal ne Klammer oder so fehlt, aber vom Prinzip ****t es ja wenn das Teil per Buttons, die hier jetzt weggelassen wurden, getriggert wird)

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    
    public class FpViewerUI extends org.eclipse.swt.widgets.Composite {
     
     
        public FpViewerUI(Composite parent, int style, Logger) {
            super(parent, style);
            browserAvailable = false;
            initGUI();
            log = logger;
        }
        
        public boolean startJPGRendering (String fileName, String guid)
        {
            System.out.println("In startJPGRendering");
            boolean result = false;
            if (this.browserAvailable)
            {
                int[] htmlDocumentID = browser.getIDsOfNames(new String[] { "Document" });
                System.out.println("htmlDocumentID="+htmlDocumentID);  
                if (htmlDocumentID == null)
                  return result;
                Variant pVarResult = browser.getProperty(htmlDocumentID[0]);
                System.out.println("pVarResult="+pVarResult);  
                if (pVarResult == null || pVarResult.getType() == 0)
                  return result;
                // IHTMLDocument2
                OleAutomation htmlDocument = null;
                try {
                  htmlDocument = pVarResult.getAutomation();
                  pVarResult.dispose();
     
                  int[] scriptID = htmlDocument.getIDsOfNames(new String[] { "Script" });
                  System.out.println("scriptID="+scriptID);  
                  if (scriptID == null)
                    return result;
                  pVarResult = htmlDocument.getProperty(scriptID[0]);
                        System.out.println("pVarResult2="+pVarResult);  
                  if (pVarResult == null || pVarResult.getType() == 0)
                    return result;
                  OleAutomation htmlWindow = null;
                  try {
                    // IHTMLWindow2
                    htmlWindow = pVarResult.getAutomation();
                    pVarResult.dispose();
                    int[] evaluateID = htmlWindow.getIDsOfNames(new String[] { "testGenerate" });
                        System.out.println("testGenerateId="+evaluateID);  
                    if (evaluateID == null)
                      return result;
                    String expression = fileName;
                    Variant[] rgvarg = new Variant[] { new Variant(
                        fileName), new Variant(guid) };
                    pVarResult = htmlWindow.invoke(evaluateID[0], rgvarg,
                        null);
                    if (pVarResult == null || pVarResult.getType() == 0)
                      return result;
                    System.out.println(expression + " ="
                        + pVarResult.getString());
                    result = true;
                  } finally {
                    htmlWindow.dispose();
                  }
                } finally {
                  htmlDocument.dispose();
                }
            }
            System.out.println("Raus startJPGRendering");
            return result;
        }
        
        
        /**
        * Initializes the GUI.
        */
        private void initGUI() {
            try {
                    FormData composite1LData = new FormData();
                    composite1LData.width = 700;
                    composite1LData.height = 500;
                    composite1 = new Composite(this, SWT.NONE);
                    GridLayout composite1Layout = new GridLayout();
                    composite1Layout.makeColumnsEqualWidth = true;
                    composite1.setLayout(composite1Layout);
                    composite1.setLayoutData(composite1LData);
                    {
                        
                        
                        OleFrame frame = new OleFrame(composite1, SWT.NONE);
                        site = new OleControlSite(frame, SWT.NONE, "Shell.Explorer");
                        site.doVerb(OLE.OLEIVERB_INPLACEACTIVATE);
                        site.setBounds(5, 0, 700, 500);
                        browser = new OleAutomation(site);
                        
                        // When the document is loaded, access the document object for the new
                        // page
                        // and evalute expression using Script.
                        int DownloadComplete = 104;
                        site.addEventListener(DownloadComplete, new OleListener() {
                            public void handleEvent(OleEvent event) {
                                browserAvailable = true;
                                System.out.println("browserAvailable set");
                                int[] htmlDocumentID = browser.getIDsOfNames(new String[] { "Document" });
                                System.out.println("htmlDocumentID="+htmlDocumentID);  
                                if (htmlDocumentID == null)
                                    return;
                                Variant pVarResult = browser.getProperty(htmlDocumentID[0]);
                                System.out.println("pVarResult="+pVarResult);  
                                if (pVarResult == null || pVarResult.getType() == 0)
                                    return ;
                                // IHTMLDocument2
                                OleAutomation htmlDocument = null;
                                try {
                                    htmlDocument = pVarResult.getAutomation();
                                    pVarResult.dispose();
                                } finally {
                                    htmlDocument.dispose();
                                }
                            }
                        });   
                        
                        int[] ids = browser.getIDsOfNames(new String[] { "Navigate", "URL" });
                        Variant[] rgvarg = new Variant[] { new Variant("file://myhtml.html") };
                        int[] rgdispidNamedArgs = new int[] { ids[1] };
                        browser.invoke(ids[0], rgvarg, rgdispidNamedArgs);
                        System.out.println("Nach brower.invoke");
                        
                    }
                    this.layout();
                }           }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
        
    }
     

  2. #2
    mcdroemmel mcdroemmel ist offline Mitglied Bronze
    Registriert seit
    Mar 2009
    Beiträge
    26
    Hallo,

    hat keiner eine Idee?
     

Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 17.08.10, 10:40
  2. InDesign: Textumlauf um Objekt, dennoch gleichzeitig Schrift ÜBER Objekt
    Von LaurenWoo im Forum Desktop Publishing (DTP)
    Antworten: 1
    Letzter Beitrag: 22.10.08, 09:54
  3. Aktualisierung Key
    Von daniel94ver im Forum .NET Datenverwaltung
    Antworten: 1
    Letzter Beitrag: 10.07.07, 22:38
  4. Antworten: 2
    Letzter Beitrag: 21.07.04, 22:42
  5. Antworten: 1
    Letzter Beitrag: 03.01.04, 12:44

Stichworte