Uruchomienie pliku Java .jar wewnątrz Mql

O jezykach programowania w platformach i nie tylko.
green7
Maniak
Maniak
Posty: 2060
Rejestracja: 16 sty 2008, 18:44

Nieprzeczytany post autor: green7 »

MkubuxK pisze:Jakbyś mógł pokazać dokładniej Green jak wykorzystać curl.exe wraz z parametrem, który mu się podaje ( strona www i miejscem na dysku ) to również pochwała się będzie należeć. Narazie jako laik z C nie potrafię tego obsłużyć.
Pełen opis parametrów znajdziesz w sieci, curl ma ich mnóstwo obsługuje zarówno http jak i ftp Nie musisz używać C - masz gotową wersję skompilowaną, którą po prostu wołasz z parametrami (sposób już znasz: np. przez Shell32)
Np. pobranie pliku ftp wywołasz przez:
curl.exe ftp://adres.com/sciezka/nazwa_pliku_zdalnego --user nazwa_uzytkownika:haslo -o nazwa_pliku_lokalnego

upload pliku na serwer ftp:

curl.exe -T nazwa_pliku_lokalnego --user nazwa_uzytkownika:haslo ftp://adres.com/
Green
Obrazek
Obrazek

MkubuxK
Pasjonat
Pasjonat
Posty: 1051
Rejestracja: 20 maja 2009, 18:27

Nieprzeczytany post autor: MkubuxK »

Esco pisze:

Kod: Zaznacz cały

#import "shell32.dll"
int ShellExecuteA(int hWnd,int lpVerb,string lpFile,int lpParameters,int lpDirectory,int nCmdShow);
#import

Kod: Zaznacz cały

ShellExecuteA(0,0,"path+"\experts\files\ftp.jar"",0,0,5);
Spróbuj powyższego kodu. Wywołanie odpowiada dokładnie podwójnemu kliknięciu.

Jeszcze o ostatnią poradę bym prosił. Teraz jak wiem że plik już działa zrobiłem pierwotną wersję z parametrem, której nie mogę uruchomić.

Przeczytałem w dokumentacji że ShellExecuteA zwraca Int z błędem więc użyłem takiego kodu:

string b=ShellExecuteA(0,0,path+"\experts\files\ftp.jar "+path+"\experts\files",1,0,5); - w tym przypadku zwraca 0 czyli outofmemory - ale co to oznacza ?


string b=ShellExecuteA(0,0,path+"\experts\files\ftp.jar "+path+"\experts\files",0,0,5); - zwraca błąd 2 czyli wrong file name


string b=ShellExecuteA(0,0,path+"\experts\files\ftp.jar",path+"\experts\files",0,5); - w tym wypadku błąd numer 42 - kompletnie nie wiem co to oznacza


Byłbym bardzo wdzięczny za pomoc.



*UPDATE*

Rozszyfrowałem. Błąd numer 42 oznacza brak błędu. Plik zapisał się ale kompletnie nie tam gdzie trzeba. Teraz muszę znaleźć błąd.

Ta konstrukcja jest poprawna:

Kod: Zaznacz cały

string b=ShellExecuteA(0,0,path+"\experts\files\ftp.jar",path+"\experts\files",0,5); 
Błędnie w pierwszym poście pokazywałeś Esco użycie z parametrem.

Kod: Zaznacz cały

Kod:
ShellExecute(NULL, "open", "javaw.exe sciezka/program.jar komenda1 komenda2',[b] NULL[/b], NULL, SW_SHOW) )
- tak jest błędnie

int lpParameters jest odpowiedzialne za przekazanie parametru i tam nie można wstawić wtedy 0. 0 oznacza brak parametru.
Dziękuję mimo wszystko za poświęcony czas. Wspólnymi siłami udało mi się uruchomić co trzeba.

Dodano po 1 godzinach 8 minutach:

Znalazłem błąd. Tak na przyszłośc jakby ktoś przekazywał ścieżkę dostępu w Javie a w Mql.

TerminalPath() zwraca ścieżkę w formacie

C:\ProgramFiles\Terminal

podając taki adres w funkcji dostępu do pliku Jar jest wszystko ok.


I teraz: jak podajemy ścieżkę do pliku w Javie ( jako parametr ) trzeba ją już podać w następującym formacie:

C://ProgramFiles/Terminal

Tak więc jeśli nie zmienię ścieżki dostępu z "/" na "//" plik zapisuje mi na dysku C z przedrostkiem ProgramFiles w nazwie pliku. Drobny błąd a musiałem poświęcić mnóstwo czasu na znalezienie go.

Dodano po 1 godzinach 47 minutach:

Problem finalnie naprawiony. Kolejne dwie godziny poświęciłem ale plik zgrywa już z parametrem tam gdzie trzeba.

Problem leżał jednak jeszcze gdzie indziej a mianowicie w lokalizacji.

Platformę mam zainstalowaną w folderze Program(spacja)Files(spacja)(x86)

TerminalPath() zwracał do Stringa te wartość a następnie przekazywał jako parametr do pliku Jar. Mimo że przekazywał go w jednym stringu to sam program java odbierał go już jako 3 parametry. Przez spacje w nazwie.

Dopiero taki zabiegł pomógł i właściwie czyta parametr:

Kod: Zaznacz cały

 public static void main(String[] args) throws Exception{
 
    int length=args.length;	
    	String path = "";
   
    for(int a=0;a<length;a++){
    	path=path+args[a]+" ";
    	
    }
(...)
}

fx-forum

green7
Maniak
Maniak
Posty: 2060
Rejestracja: 16 sty 2008, 18:44

Nieprzeczytany post autor: green7 »

Oj ogólnie to strasznie namotałeś i niewiele z tego można zrozumieć.
Popełniasz tu szereg błędów.

Może naprostuję co nieco:
1. Ścieżkę w Windows można separować zarówno korzystając ze znaku \ jak i /
Nie miał racji Esco pisząc, że / to tylko na linuxie. Windows obsługuje oba standardy.

2. Używając jednak znaku "\" w mqlu musisz pamiętać, że podobnie jak w C i Javie zapisywany w ciągach znakowych ma on znaczenie specjalne. Wpisując więc ścieżkę na sztywno w kod programu musisz więc zapisywać \ jak \\
Czyli np:

Kod: Zaznacz cały

"c:\\program files\\itd"
Również java może mieć kłopot jeśli podasz jej jako parametr nazwę pliku z pojedynczymi backslashami.

3. Jeśli podajesz nazwę pliku jako parametr do programu a w nazwie tej masz spację to całą nazwę musisz zawrzeć w nazwach cudzysłowu.
Spacja oddziela parametry. Więc jeśli wywołasz program np tak:

program.exe c:\program files\plik

to program.exe dostanie nie jeden a 2 parametry. Musisz więc wołać program tak:
program.exe "c:\program files\plik"
Rozwiązałeś to wprawdzie dodając do siebie parametry - ale nie rozwiązujesz tym problemu tylko leczysz jego objawy.


4. ShellExcecute zwróci Ci błąd 2 jeśli brak pliku do uruchomienia. Jeśli natomiast program zostanie uruchomiony to zwrócony zostanie kod zakończenia programu. Kod zakończenia programu możesz ustalić sam (choć akurat nie znam "zaklęcia" dla Javy - ale na pewno się da)
Umożliwia to komunikację między programami: uruchamiasz program, a dalej postępujesz w zależności od zwróconego kodu zakończenia programu.
Green
Obrazek
Obrazek

MkubuxK
Pasjonat
Pasjonat
Posty: 1051
Rejestracja: 20 maja 2009, 18:27

Nieprzeczytany post autor: MkubuxK »

Dziekuję za poprawki. Człowiek uczy sie na błędach. Po prostu kiedy wydawało mi się, że błąd zniknął okazywało się, że leży zupełnie gdzie indziej. Późna pora była a zawziąłem się by skończyć :)
fx-forum

Awatar użytkownika
Esco
Przyjaciel Forum
Przyjaciel Forum
Posty: 2603
Rejestracja: 11 kwie 2010, 20:56

Nieprzeczytany post autor: Esco »

Ja jeszcze dodam że tam w drugim parametrze jest int po to żeby przekazać w prosty sposób pusty wskaźnik zamiast wskaźnika na string.

Normalnie można w ShellExecute używać rożnych funkcji "open", "print" itd.

ODPOWIEDZ