Na forum 4programmers.net korzystamy z plików cookies. Część z nich jest niezbędna do funkcjonowania
naszego forum, natomiast wykorzystanie pozostałych zależy od Twojej dobrowolnej zgody, którą możesz
wyrazić poniżej. Klikając „Zaakceptuj Wszystkie” zgadzasz się na wykorzystywanie przez nas plików cookies
analitycznych oraz reklamowych, jeżeli nie chcesz udzielić nam swojej zgody kliknij „Tylko niezbędne”.
Możesz także wyrazić swoją zgodę odrębnie dla plików cookies analitycznych lub reklamowych. W tym celu
ustaw odpowiednio pola wyboru i kliknij „Zaakceptuj Zaznaczone”. Więcej informacji o technologii cookie
znajduje się w naszej polityce prywatności.
Spróbuj dać ścieżki (głównie tą pierwszą) w podwójnym cudzysłowie. Jak jest spacja w ścieżce to dalszą część interpretowana jest jako kolejny parametr.
Wpisywałeś tą komendę normalnie w wierszu poleceń? Jeżeli coś jest nie tak to może będzie jakieś sensowne info. Poza tym nie wiem czy to ma znaczenie ale https://www.firebirdsql.org/file/documentation/html/en/firebirddocs/gbak/firebird-gbak.html
Masz gbak -b <db set> <backup set> [backup options] [general options]
a więc zgodnie z tym raczej powinno być gbak.exe -b C:\AppName\data.fdb c:\AppName\data.fbk -USER SYSDBA -PAS masterkey
Utworzyłem tymczasowy katalog c:xxx (aby pozbyć się ewentualnych spacji) , przekopiowałem do niego gabak.exe oraz data.fdb i niestety nic to nie dało.
W wierszu poleceń zadanie wykonuje się bez problemu !
W przypadku c:\program files ... należy użyć pdwójny cudzysłów (sugestia kolegi Clark), Co ciekawe , format zapisu jak u mnie czy u kolegi (kAzek) nie ma znaczenia.
Bez względu na to jaki program się odpala, jeśli przyjmuje ścieżkę w parametrze, to taką ścieżkę zawsze należy objąć cudzysłowami. Te nie przeszkadzają w przypadku ścieżek pozbawionych białych znaków, natomiast jeśli ścieżka zawiera białe znaki, to brak cudzysłowów spowoduje, że fragmenty ścieżki zostaną uznane za osobne parametry — argc będzie miał większą wartość niż się spodziewasz, natomiast kawałki ścieżki zostaną rozrzucone po kilku sąsiadujących komórkach argv.
System nie zna intencji użytkownika, więc nie domyśli się, że ma kilka ciągów zbić w jeden ciąg ścieżki (i nawet zgadywać nie próbuje). Przy poprawnie przekazanych ścieżkach, nie ma powodu, aby tak odpalony program nie zadziałał, bo nieistotne czy uruchomi się go z dysku, czy z konsoli, czy za pomocą ShellExecute, system zrobi dokładnie to samo w każdym z tych przypadków.
@jurkowojc a czy przypadkiem problemem nie jest brak uprawnienia do zapisu plików w podanych przez ciebie ścieżkach? Spróbuj uruchomić aplikację z uprawnieniami administratora i sprawdź, czy to nie rozwiąże problemu.
@jurkowojc a czy przypadkiem problemem nie jest brak uprawnienia do zapisu plików w podanych przez ciebie ścieżkach? Spróbuj uruchomić aplikację z uprawnieniami administratora i sprawdź, czy to nie rozwiąże problemu.
Próbowałem również jako administrator. Nie pomogło.
Ponieważ apetyt rośnie w miarę jedzenia to z czystej ciekawości krótkie pytanko :
jakiego polecenia należy użyć aby móc podejrzeć to co proces aktualnie wykonuje i kiedy się zakończy.
Czytałem o createprocess ale nie wiem czy spełni moje ewentualne oczekiwania.
jakiego polecenia należy użyć aby móc podejrzeć to co proces aktualnie wykonuje i kiedy się zakończy.
Zadajesz pytania bardzo nieprecyzyjnie, więc trudno cokolwiek sensownego doradzić. Żeby można było podglądać co proces robi i wiedzieć kiedy skończy, ten proces musiałby się w jakiś sposób komunikować z otoczeniem, np. wypisywać stan postępu na standardowe wyjście, uzupełniać file mapping, rozsyłać komunikaty do pozostałych okien (message broadcasting) itd. Jeśli tego nie robi, to niczego się o postępie nie dowiesz — możesz tylko wykryć moment zakończenia jego działania.
Podglądanie standardowego wyjścia procesu jest dość łatwe w Lazarusie — pozwala na to np. standardowa klasa TProcess. Za jej pomocą można wygodnie odpalić dowolny program z dysku, przekazać mu parametry, podglądać standardowe wyjście, a także czekać (lub nie) na zakończenie jego działania. W dodatku wszystko wieloplatformowe.
Dla Delphi jest port, na razie tylko na Windows. W razie czego, klasa TProcess pod Windows tak czy siak używa funkcji z Win32 API, więc równie dobrze możesz popatrzeć na to jak jest zaimplementowana, wyciągnąć z niego tylko to co cię interesuje i napisać sobie własną, małą klasę, która spełni twoje wymagania. Albo po prostu zaimplementować rozwiązanie w czystym Win32 API, jeśli tak wolisz.
Dziękuję wszystkim za pomoc !
Zainteresowałem się TProcess gdyż przy jego pomocy mogę zrobić wszystko co potrzebuję, a jestem pewien, że również znacznie więcej !
Na razie informacja o zakończeniu procesu wraz z informacją o statusie zakończenia mnie satysfakcjonuje. Przy odrobinie wolnego czasu
zgłębię temat bardziej gdyż na pewno warto.
Niestety powyższa konstrukcja nie działa i nie mam pojęcia dlaczego. Może ktoś bieglejszy w temacie pomoże ?.
Zamiast Handle wpisz 0, wszystkie stringi zamień na Pchar('.........') no i rozdziel ścieżkę do programu gbak.exe jako oddzielny parametr, -B......... jako następny, nil, SW_NORMAL
powinno to wyglądać tak:
Rzutowanie na PChar jest konieczne tylko wtedy, gdy ciąg znaków znajduje się w zmiennej typu String. Ale też niekoniecznie, bo równie dobrze można podać adres pierwszego znaku i wyjdzie na to samo. Literał znakowy podany bezpośrednio w parametrze jest traktowany przez kompilator jako pointer na ciąg znaków, a więc rzutowanie jest nadmiarowe.
Dodałbym jeszcze, że jeśli już podaje się jakiekolwiek ścieżki do ShellExecute, to warto jest je obejmować w cudzysłowy. W przykładach wyżej co prawda wszystkie ścieżki są hardkodowane i żadna z nich nie zawiera białych znaków, ale jeśli mamy ścieżki określane dynamicznie i przechowywane w zmiennych, to lepiej te cudzysłowy dodać.