[delphi] I/O error 105

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

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ę

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.

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.

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.

0

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

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.

0
wedrowiec napisał(a)

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

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:

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ą:

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ę...

1 użytkowników online, w tym zalogowanych: 0, gości: 1