x-kom hosting

[ WinAPI, C++ ]Obsługiwanie opcji otwórz za pomocą...

Cansisti
utworzono
utworzono

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. :slabe: 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
komentarz

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
komentarz

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
komentarz

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

Cansisti
komentarz
komentarz

Ok, dzięki bardzo :gobi:

leggo
komentarz
komentarz

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
komentarz (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
komentarz

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
komentarz (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
komentarz

W takim razie pochwal się jakiego używasz kompilatora.

Cansisti
komentarz
komentarz

GNU CCC Compiler

Pomoże ktoś?

leggo
komentarz
komentarz

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.

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Strona wykorzystuje pliki cookies w celu prawidłowego świadczenia usług i wygody użytkowników. Warunki przechowywania i dostępu do plików cookies możesz zmienić w ustawieniach przeglądarki.