Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++][WinApi] Odczytywanie danych z pliku - działa tylko z poziomu aplikacji

Ostatnio zmodyfikowano 2014-05-30 21:55
Autor Wiadomość
barti2287
Temat założony przez niniejszego użytkownika
[C++][WinApi] Odczytywanie danych z pliku - działa tylko z poziomu aplikacji
» 2014-05-21 22:21:47
Witam,

Mam problem. W moim programi potrzebuję umieścić możliwość zapisywania i odczytywania danych z pliku. Wszystko działa bardzo dobrze, dopóki otwieram plik korzystając z mojego programu (Plik --> Otwórz). Jeśli próbuję otworzyć plik txt za pomocą mojego programu, który jest czymś w stylu notatnika, otwiera mi się mój program bez załadowanej treści.

W razie potrzeby mogę przesłać fragmenty kodu.

Proszę o w miarę możliwości szybką pomoc.
P-110608
MrPoxipol
» 2014-05-21 23:26:31
Code or it didn't happen.
P-110614
barti2287
Temat założony przez niniejszego użytkownika
Kod - odczyt pliku
» 2014-05-22 07:00:51
W poniższym kodzie znajduje się odczyt pliku.

C/C++
// Odczyt pliku.
if( LOWORD( wParam ) == 101 )
{
    // Ustalanie ścieżki pliku przez użytkownika.
    OPENFILENAME ofn;
    char n[ MAX_PATH ] = "";
   
    ZeroMemory( & ofn, sizeof( ofn ) );
    ofn.lStructSize = sizeof( ofn );
    ofn.lpstrFilter = "Pliki tekstowe (*.txt)\0*.txt\0Wszystkie pliki\0*.*\0";
    ofn.nMaxFile = MAX_PATH;
    ofn.lpstrFile = n;
    ofn.lpstrDefExt = "txt";
    ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
   
    // Sprawdzanie czy ustalanie ścieżki powiodło się.
    if( !GetOpenFileName( & ofn ) )
    {
        MessageBox( NULL, "Wystąpił błąd podczas ustalania ścieżki pliku! Program zostanie automatycznie zamknięty.", "Błąd!", MB_ICONERROR | MB_OK );
        PostQuitMessage( 0 );
    }
   
    // Stworzenie pliku.
    plk = CreateFile( n, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL );
   
    // Sprawdzenie czy plik został poprawnie stworzony.
    if( plk == INVALID_HANDLE_VALUE )
    {
        MessageBox( NULL, "Nie można otworzyć pliku. Program zostanie automatycznie zamknięty.", "Błąd!", MB_ICONERROR | MB_OK );
        PostQuitMessage( 0 );
    }
   
    // Sprawdzanie rozmiaru pliku.
    roz = GetFileSize( plk, NULL );
   
    // Sprawdzanie czy rozmiar pliku jest prawidłowy.
    if( roz == 0xFFFFFFFF )
    {
        MessageBox( NULL, "Nieprawidłowy rozmiar pliku! Program zostanie automatycznie zamknięty.", "Błąd!", MB_ICONERROR | MB_OK );
        PostQuitMessage( 0 );
    }
   
    // Alokacja bufora do którego będzie zapisany tekst.
    tk =( LPSTR ) GlobalAlloc( GPTR, roz + 1 );
   
    // Sprawdzenie czy pamięć jest wystarczająca.
    if( tk == NULL )
    {
        MessageBox( NULL, "Za mało pamięci! Program zostanie automatycznie zamknięty.", "Błąd!", MB_ICONERROR | MB_OK );
        PostQuitMessage( 0 );
    }
   
    // Sprawdzanie czy plik został poprawnie odczytany.
    if( !ReadFile( plk, tk, roz, & pct, NULL ) )
    {
        MessageBox( NULL, "Wystąpił błąd podczas odczytywania pliku! Program zostanie automatycznie zamknięty.", "Błąd!", MB_ICONERROR | MB_OK );
        PostQuitMessage( 0 );
    }
   
    // Dodawanie zera na końcu bufora.
    tk[ roz ] = 0;
   
    // Wyświetlenie pobranego tekstu.
    SetWindowText( pt, tk );
   
    // Zwalnianie bufora.
    GlobalFree( tk );
   
    // Zamykanie pliku.
    CloseHandle( plk );
}

break;
}
P-110633
DejaVu
» 2014-05-26 11:05:51
P-110897
DejaVu
» 2014-05-26 11:08:17
Wszystko działa bardzo dobrze, dopóki otwieram plik korzystając z mojego programu (Plik --> Otwórz). Jeśli próbuję otworzyć plik txt za pomocą mojego programu, który jest czymś w stylu notatnika, otwiera mi się mój program bez załadowanej treści.


Zdefiniuj problem. Z Twojego opisu nic nie wynika.
P-110898
libed
» 2014-05-27 11:56:10
Sprawdz rezultat funkcji SetWindowText albo
uzyj WM_SETTEXT
P-110936
barti2287
Temat założony przez niniejszego użytkownika
» 2014-05-28 16:08:57
Przepraszam, jeśli wyraziłem się niejasno.

Chodzi mi o to, że działa jeśli otworzę najpierw mój program, a potem plik używając "Plik --> Otwórz".

Nie działa, kiedy mój program jest zamknięty, a ja kliknę PPM na zapisanym wcześniej pliku i wybiorę opcję "Otwórz za pomocą --> Wybierz program domyślny --> nazwaprogramu.exe.
P-111012
Monika90
» 2014-05-28 16:22:54
Myślałeś, że to samo się zrobi? Musisz to oprogramować. Nazwa pliku do otwarcia jest przekazywana jako argument wiersza poleceń (3 parametr funkcji WinMain).
P-111013
« 1 » 2
  Strona 1 z 2 Następna strona