Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [Java] Lancio al system startup...si, ma problemi

    Allora, premetto che ho faticato molto per arrivare a creare questo jar (ok molto è dovuto al fatto che non sono espertissimo per le tecnologie usate, ma ci sono riuscito...), quindi non ditemi "cambia linguaggio" perfavore.

    Fatto sta che ho creato un programma java per una associazione, questo programma permette di interfacciarmi col sito ricavando delle informazioni da un file xml corredato di xsd per la validazione, legge le informazioni dall'xml e riempie una tabella, poi se è stato appena avviato (l'operazione di parsing del file xml viene avviata per forza una volta al lancio, in aggiunta l'utente la può ripetere manualmente cliccando su una voce del menu), viene visualizzato un messaggio sulla system tray (il programma ha un'icona che risiede li) che avvisa se ci sta qualcosa nella tabella, altrimenti non viene mostrato nessun messaggio e stop, il programma resta in esecuzione da solo.
    Detto questo, ho aggiunto una particolare feature che consentissie al programma di avviarsi allo startup dell'intero sistema (o meglio: al login di un utente... anche perchè sennò testare diventava un omicidio): sfruttando la JNI ho creato una dll che mi consentisse di creare/leggere chiavi di registro (il programma java è fatto per girare solo sotto windows, anche perchè gli utenti finali si avvalgono solo di roba microsoft e non usano linux... se dovessero convertirsi, provvederò a creare una libreria pure per linux che tanto mi basta solo quello, non devo riscrivere tutto), il miracolo è stato che ci sono riuscito (eh si!)... ora con una simpatica checkbox, quando viene selezionata viene scritta la chiave di registro, se viene deselezionata viene rimossa (semplice no?) in aggiunta c'è una funzione per controllare se tale chiave esiste (mi serve per impostare la checkbox su selezionata o meno, all'avvio del programma).

    Queste son le caratteristiche... ora il programma intero è "wrappato" usando launch4j, che crea un simpatico exe che mi avvia il file jar, mi consente di impostare un paio di cose... niente di particolare, fondamentalmente lancia il jar e basta (non mi serve che controlli la virtual machine né niente altro, a quello ci penso in fase di installazione avvalendomi di NSIS che mi pare piu che eccellente), quindi io ho messo quello come file da avviare allo startup (per intenderci nella chiave di registro è scritto il percorso all'exe, non al file jar)

    Se doppioclicco sull'exe, il programma fa tutto quel che deve... è anche molto piacevole nell'insieme :P

    Il problema sorge all'avvio: l'exe viene lanciato (se vado nel task manager ho sia javaw avviato che l'exe, si il wrapper si suddivide in due processi... non è assolutamente un problema per me)... l'applicazione però ha dei problemi: se provo a leggere file (mi serve per leggere le opzioni, uso le normali librerie java per questo) oppure uso la mia dll famosa, compare la finestra corredata solo della barra del titolo e dei contorni... al centro è come se fosse trasparente (si vedo quel che c'è dietro) e ovviamente non c'è nessun componente su quella trasparenza, come fosse in crash.
    Provando a disattivare il lettore di opzioni e quello di chiavi di registro (sia tutti e due insieme che solo uno dei due), mi sono accorto che ENTRAMBI hanno problemi: infatti se li disattivo entrambi il programma si avvia senza il benchè minimo problema (dopodiché posso pure fare operazioni di lettura... è allo startup che non gli piace)... (se lascio attiva la parte di codice riguardo alle chiavi di registro nello stacktrace noto pure che non riesce a caricare la dll)

    La cosa importante è che se chiudo il programma mentre è in questa situazione di "semicrash" e lo riapro, funziona benissimo...
    La prima cosa che mi è venuta in mente è che qualcosa non venisse caricato... ho provato a mettere dei lunghi sleep (anche 40 secondi) ma niente, ho provato perfino a fare un while che ciclicamente lanciava il frame principale (se veniva rilevata un'eccezione, aspettava un secondo e provava a rilanciarlo)... dopo 1343 cicli non è successo nulla e java è andato in overhead :P

    Ho provato a fare anche un'altra cosa: un exe che aspettava 40 secondi, avviava l'exe "wrapper" che avviava il file java... anche qui, stessi identici problemi di prima

    Qualcuno ha idea di che può essere e se c'è un modo per ovviare a tutto ciò?

    P.S.
    Mi viene restituito il seguente errore se provo ad avviare il programma allo startup (La lettura delle configurazioni disabilitata, mantengo invece la possibilità di interfacciarmi con la dll)
    Codice PHP:
    Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkErrorno AutoSt
    artChecker in java
    .library.path
            at java
    .lang.ClassLoader.loadLibrary(Unknown Source)
            
    at java.lang.Runtime.loadLibrary0(Unknown Source)
            
    at java.lang.System.loadLibrary(Unknown Source)
            
    at core.AutoStartChecker.<clinit>(AutoStartChecker.java:35)
            
    at gui.Home.<init>(Home.java:72)
            
    at cittanascostauc.Main$1.run(Main.java:22)
            
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
            
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
            
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
            
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
            
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
            
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
            
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
            
    at java.awt.EventDispatchThread.run(Unknown Source
    Sottolineo che AutoStartChecker sta felicemente all'altezza del jar, tant'è che se poi lo avvio "a mano" funziona tutto bene...

    P.P.S.
    Questo succede invece se tengo il programma con tutte le sue funzionalità (compresa la lettura file)
    Da un errore... ma suppongo che semplicemente sia la conseguenza di una catena di errori (Sembrerebbe come se non venissero caricate le dll dalla jvm, difatti tutto ciò che si interfaccia con metodi "native" non funziona (compresa scrittura file)

    Codice PHP:
    Problemi nella creazione della GUInull
    java
    .lang.NumberFormatExceptionnull
            at java
    .lang.Integer.parseInt(Unknown Source)
            
    at java.lang.Integer.<init>(Unknown Source)
            
    at gui.Home.<init>(Home.java:52)
            
    at cittanascostauc.Main$1.run(Main.java:22)
            
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
            
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
            
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
            
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
            
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
            
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
            
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
            
    at java.awt.EventDispatchThread.run(Unknown Source
    La tua vita appartiene a te e basta. Alzati e vivila.
    Richard Rahl

  2. #2
    Aggiungo una nuova informazione:
    Ho costruito questo file batch:
    Codice PHP:
    cd "C:\Documents and Settings\Administrator\Desktop"
    MyWrapperForApp.exe 
    E tutto funziona se lo metto allo startup, quindi ho dedotto che il problema è la "dir" da cui viene lanciato l'exe, probabilmente dalla directory di java o anche da system32... qualcosa di simile...

    volevo provare magari lanciato l'applicativo (la main viene lanciata e posso pure lanciare qualche println, ovvero posso fare qualcosa "prima del crash"...), a cambiare la current working directory (non mi viene un altro modo per farmi capire xD) del file jar... nella speranza che funzioni tutto... qualcuno sa dirmi come si fa?
    La tua vita appartiene a te e basta. Alzati e vivila.
    Richard Rahl

  3. #3
    Per tutti gli interessati, sono riuscito a risolvere lanciando un piccolo exe che lancia l'exe wrapper (ma poteva benissimo lanciare il jar, è stata una mia scelta questa)

    Non sono riuscito (o meglio, sono riuscito a far cambiare la current working directory ma comunque dava problemi... è un problema di directory DA DOVE viene lanciato java) a risolvere attraverso java...mi sono avvalso di un piccolo programmino in c++

    il codice dell'exe è il seguente

    Codice PHP:
    #include <cstdlib>
    #include <windows.h>
    #include <cstring>
    #include <direct.h>
    #include <process.h>
    #include <iostream>

    using namespace std;

    int WINAPI WinMain (HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nFunsterStil) {    
        
    TCHAR buffer[MAX_PATH];//always use MAX_PATH for filepaths
        
    char filename[MAX_PATH];
        
    strcpy_s(filename,"bootstrap.exe");
        if (
    __argc>2) {
            
    strcpy_s(filename,__argv[2]);
        }
        
    GetModuleFileName(NULL,buffer,sizeof(buffer));
        
    string tmpfilename=string("");
        
    string tmppath=string("");
        
    string finalpath=string("");
        
    tmppath=buffer;
        
    tmpfilename=filename;
        
    finalpath=tmppath.substr(0,tmppath.length()-(tmpfilename.length()+1));
        
    /*MessageBox(NULL,tmpfilename.c_str(),titolo,MB_OK);
        MessageBox(NULL,tmppath.c_str(),titolo,MB_OK);
        MessageBox(NULL,finalpath.c_str(),titolo,MB_OK);*/
        
    _chdir(finalpath.c_str());
        
    _execv(__argv[1],__argv);
        return 
    0;


    (Le messagebox le ho usate per testare)

    L'exe funziona cosi:
    Accetta 2 parametri:
    NomeDell'ExeDaAvviare NomeDell'ExeCorrente

    Il nome dell'exe corrente sarebbe il vostro mini exe compilato, mi serve per fare un veloce string parsing (avrei potuto fare qualcosa tipo "torna indietro fino al primo \\"), ma sinceramente non ne avevo voglia e ho optato per la prima opzione che mi è venuta in mente... quindi se il vostro exe non si chiama bootstrap.exe, DOVETE passare il secondo parametro col nome del vostro exe (estensione compresa) o non funziona niente :P

    Il programma usa winmain cosi non compare console (e execv, perchè con system ne apriva una)... spero torni utile a qualcuno che come me ha fatto il folle e ha voluto lanciare il proprio jar all'avvio... senza installarlo come servizio ovviamente
    La tua vita appartiene a te e basta. Alzati e vivila.
    Richard Rahl

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.