Cansisti utworzono 4 września 2012 utworzono 4 września 2012 Piszę sobie własny notatnik i niedawno się spostrzegłem że gdy plik otwieram za pomocą mojego notatnika to... notatnik po prostu się otwiera ale ani śladu pliku. To normalne, czy coś źle zrobiłem? Co trzeba może dodać aby tak działał? [color=#808080]P.S.[/color] [color=#808080]Nie widzę potrzeby zamieszczania kodu więc na razie tego nie robię[/color]
leggo komentarz 4 września 2012 komentarz 4 września 2012 Musisz go samodzielnie otworzyć. Adres pliku który został otwarty za pomocą Twojego programu przekazywany jest do programu jako parametr wejściowy. Aby pobrać parametry możesz użyć funkcji [b]GetCommandLine[/b]. W jej rezultacie dostaniesz całą linię z konsoli: adres i nazwę uruchomionego programu i parametry z jakimi został wywołany. Żeby dostać się do adresu pliku który został otwarty przy pomocy programu potrzebujesz jeszcze funkcji [b]CommandLineToArgvW[/b], która podzieli Ci cały ten łańcuch na odpowiednie fragmenty. Nazwa otwartego pliku znajduje się pod indeksem 1 (czyli na drugim miejscu). Mam nadzieję, że opisałem to jasno
Cansisti komentarz 5 września 2012 Autor komentarz 5 września 2012 Jasno, ale jak tych funkcji używać? Jak obsłużyć if-a który by sprawdzał czy taki argument podano czy nie, i w momencie gdy podano, otwierał plik i w odpowiednie pola wpisywał odpowiednie rzeczy? (tekst w pole do tekstu i nazwę w pole na nazwę?) Z góry dziękuję
leggo komentarz 5 września 2012 komentarz 5 września 2012 Jak używać? Najlepiej poprawnie i zgodnie z zastosowaniem. Fragment poglądowy: [CODE] ... LPWSTR *listaArg; int iloscArg; listaArg = CommandLineToArgvW(GetCommandLineW(), &iloscArg); if(iloscArg!=1) { listaArg[1] //tutaj jest adres pliku, który musisz otworzyć } ... [/CODE] Uruchamiając program sprawdzasz to, i jeśli warunek w if-ie jest spełniony to otwierasz plik z tamtego adresu. Jak otworzyć ten plik? Tak samo jak otwierasz plik gdy użytkownik wybierze z manu programu opcję "Otwórz". Ty, jako główny projektant i programista tworzący ten program, już powinieneś wiedzieć co z tym adresem dalej zrobić. Uprzedzając pytanie "dlaczego te funkcje wywalają błąd?" dodam, że musisz dołączyć nagłówki [b]Winbase.h[/b] i [b]Shellapi.h[/b] (możliwe, że wystarczy tylko ten drugi).
leggo komentarz 6 września 2012 komentarz 6 września 2012 Zwróć jeszcze uwagę na fakt, że może trafić się jakiś pomysłowy dowcipniś, który uruchomi twój program z konsoli podając parametr, nie będący adresem pliku. Dlatego musisz być przygotowany na to, że plik o podanym adresie może nie istnieć.
Cansisti komentarz 8 września 2012 Autor komentarz 8 września 2012 (edytowane) Ok, wcześniej zostawiłem sobię tą opcję i zająłem się innym problemem, teraz ją napisałem i zauważyłem taki problem, że ta funkcja czyta mi tylko pierwszą literę nazwy, czyli zamiast "Text.txt" czyta "T". Ja to napisałem tak: [CODE] // OTWÓRZ ZA POMOCĄ... LPWSTR *Arg; int iloscArg; Arg = CommandLineToArgvW(GetCommandLineW(), &iloscArg); if(iloscArg!=1) { hPlik = CreateFile( (LPSTR) Arg[1], GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL ); if( hPlik == INVALID_HANDLE_VALUE ) { pl.msg(9); allfree(); return 0; } Name[ nameRozmiar ] = 0; dwRozmiar = GetFileSize( hPlik, NULL ); if( dwRozmiar == 0xFFFFFFFF ) { pl.msg(10); allfree(); return 0; } Bufor =( LPSTR ) GlobalAlloc( GPTR, dwRozmiar + 1 ); if( Bufor == NULL ) { pl.msg(11); allfree(); return 0; } if( !ReadFile( hPlik, Bufor, dwRozmiar, & dwPrzeczyt, NULL ) ) { pl.msg(12); allfree(); return 0; } Bufor[ dwRozmiar ] = 0; // dodaj zero na końcu stringa SetWindowText( hText, Bufor ); // zrób coś z tekstem, np. wyświetl go allfree(); } //TWORZENIE OKNA [/CODE] Coś źle zrobiłem że nie chce mi całej nazwy sczytać? Pierwsza litera jest wtedy gdy uruchamiam plik z konsoli, a jak daję PPM i Otwórz za pomocą... to daje mi literę C (zapewne wtedy podaje ścieżkę, a plik znajduje się na dysku C).
leggo komentarz 10 września 2012 komentarz 10 września 2012 Nie do końca rozumiem gdzie pojawia się problem. Na pewno powinieneś wyrzucić [b](LPSTR)[/b] z funkcji [b]CreateFile[/b] [CODE] hPlik = CreateFile(Arg[1], GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); [/CODE] Reszt kodu wygląda ok. Chyba że pojawia się jakiś problem z powodu nieodpowiednich typów, ale tradycyjnie nie wrzuciłeś wszystkich deklaracji, a ja nie mam przy sobie aktualnie żądnych świeżych fusów, więc nie jestem w stanie tego wywróżyć.
Cansisti komentarz 10 września 2012 Autor komentarz 10 września 2012 (edytowane) Jak nie ma [b](LPSTR) [/b]nie kompiluje się i daje błąd[CODE] ||=== Debug ===| main.cpp||In function 'int WinMain(HINSTANCE__*, HINSTANCE__*, CHAR*, int)':| main.cpp|104|error: cannot convert 'WCHAR*' to 'const CHAR*' for argument '1' to 'void* CreateFileA(const CHAR*, DWORD, DWORD, _SECURITY_ATTRIBUTES*, DWORD, DWORD, void*)'| ||=== Build finished: 1 errors, 0 warnings ===| [/CODE]
leggo komentarz 11 września 2012 komentarz 11 września 2012 W takim razie pochwal się jakiego używasz kompilatora.
leggo komentarz 18 września 2012 komentarz 18 września 2012 W visual-u działa poprawnie. W takim razie przerób [b]Arg[1][/b] na [b]char *[/b] zanim będziesz go dalej używał. Możesz to zrobić używając [b]wcstombs[/b].
Wciąż szukasz rozwiązania problemu? Napisz teraz na forum!
Możesz zadać pytanie bez konieczności rejestracji - wystarczy, że wypełnisz formularz.