[delphi] I/O error 105

[delphi] I/O error 105
wedrowiec
  • Rejestracja:około 18 lat
  • Ostatnio:około 15 lat
0

witam

Piszę program do automatycznej instalacji pewnej aplikacji.
Pierwszą część instalacji mój program wykonuje bez problemów.
Natomiast w drugiej części pojawia się błąd wspomniany w temacie.

instalator wywołuję przez

Kopiuj
ShellExecute(0, 'open', PChar(SciezkaDoInstalatora), nil, nil, SW_SHOW);

następnie pobieram tytuł aktywnego okna do momentu, aż tytuł ma odpowiednią wartość.
Wtedy wywołuję

Kopiuj
keybd_event(13, 0, 0, 0);    //enter

Przycisk w instalatorze pozostaje wciśnięty (wklęsły) i pojawia się wyżej wspomniany błąd.
Nie rozumiem dlaczego...we wcześniejszej części instalacji wszystko robiłem w taki sam sposób i było ok.
Próbowałem również dodawać odpowiednie opóźnienia przez WaitMS, lecz nie pomogło.

any ideas?
pzdr.


<span style="color: darkblue">Wielki majestat wielkiego gmachu,
Wybrany przez inkwizytora struktur. </span>

- Wallace Stevens
Misiekd
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 13 lat
  • Postów:7923
0
  1. jesteś pewny, że to błąd Twojej aplikacjia a nie tej drugiej?
  2. ten błąd występuje gdy

Reported by Write or Writeln on a text file if you do not generate a Console application.

You're trying to use Write or WriteLn on a text file without first opening the file.


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij
wedrowiec
  • Rejestracja:około 18 lat
  • Ostatnio:około 15 lat
0
Misiekd napisał(a)
  1. jesteś pewny, że to błąd Twojej aplikacjia a nie tej drugiej?

Gdy sam nacisnę enter przechodzi dalej...

Misiekd napisał(a)
  1. ten błąd występuje gdy

Reported by Write or Writeln on a text file if you do not generate a Console application.

You're trying to use Write or WriteLn on a text file without first opening the file.

Też to znalazłem..ale jakoś nie znalazłem powiązania...
W ogóle to chodzi o instalację OpenOffice'a, a dokładniej o 'czynności poinstalacyjne' ... Imię, Nazwisko...etc.

pzdr.


<span style="color: darkblue">Wielki majestat wielkiego gmachu,
Wybrany przez inkwizytora struktur. </span>

- Wallace Stevens
Misiekd
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 13 lat
  • Postów:7923
0

uruchom pod debugerem i zobacz na czym się wywala. Możesz też puścić jeszcze raz z flagą KEYEVENTF_KEYUP


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij
LE
  • Rejestracja:około 13 lat
  • Ostatnio:około 8 lat
  • Postów:5
0

Sorry za odgrzanie kotleta, ale sam szukałem przyczyn i tu trafiłem, więc może komuś się przyda.

Taki błąd wywala także wtedy, gdy zainicjowany plik ma błędnie podaną ścieżkę. Dla przykładu u mnie było tak:
Assign(PlikIteracji, ObecnaSciezkaIteracji);
if FileExists(ObecnaSciezkaIteracji)
then begin
NadajKomunikat('Błąd! Plik już istnieje', True);
Exit;
end;
Rewrite(PlikIteracji); <======== a tu mi wywalał błąd I/O 105.
WriteLn(PlikIteracji, WersjaIteracji);

Się zastanawiałem jakim prawem, skoro Rewrite to właściwie utworzenie pliku? Odpowiedź jest prosta - zmienna pod którą był inicjowany plik (ObecnaSciezkaIteracji) nie była przydzielana, stąd błąd mimo poprawności algorytmu. Proponuję sprawdzić czy plik na początku jest dobrze inicjowany.


Tylko czasami.
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:minuta
  • Lokalizacja:Tuchów
  • Postów:12175
0
wedrowiec napisał(a)

następnie pobieram tytuł aktywnego okna do momentu, aż tytuł ma odpowiednią wartość.
Wtedy wywołuję

Kopiuj
keybd_event(13, 0, 0, 0);    //enter

Wszystko fajnie, ale jeśli symulujesz wciśnięcie danego klawisza, to także pamiętaj o zasymulowaniu jego puszczenia:

Kopiuj
keybd_event(13, 0, 0, 0);
keybd_event(13, 0, KEYEVENTF_KEYUP, 0);

chyba, że potrzebujesz mieć go cały czas wciśniętego;

@leburaque, Twój kod jest dobry, ale polecam zamienić kolejność instrukcji na taką:

Kopiuj
if FileExists(ObecnaSciezkaIteracji) then
  begin
    NadajKomunikat('Błąd! Plik już istnieje', True);
    Exit;
  end
else
  begin
    Assign(PlikIteracji, ObecnaSciezkaIteracji);
    Rewrite(PlikIteracji);

    WriteLn(PlikIteracji, WersjaIteracji);

    CloseFile(PlikIteracji);
  end;

bo jeśli plik o nazwie ObecnaSciezkaIteracji istnieje, to po co przypisywać zmienną plikową? No nie ma sensu;

@leburaque, nie spolszczaj delphi - nie uda Ci się...


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.