[WinApi, C++] Włączenie pliku przez program


(Autologo) #1

Witam!

Robię program juz od dawna, zrobiłem wiec do niego rozszeżenie wszystko dobrze oprócz tego ,że nie można włączyć pliku gdy nie znajduje się w katalogu z aplikacją (Jak nie ma wyświetlą się błędy że nie ma plików żeby odpalić program), i drugi problem program ma okna MDI i jak już jest ten plik w katalogu to włącza się tylko aplikacja a plik się nie otwiera.

Pozdrawiam Kamzar


([alex]) #2

Wyjaśnij, proszę, pojęcie "Włączenie pliku".


(Autologo) #3

Że nie chce się załadowac w programie innymi słowy popeostu otworzyć


([alex]) #4

To pokaż fragment kodu odpowiedzialny za otwarcie pliku.

Czy dobrze rozumiem że:

jak pliku niema w katalogu z aplikacją to się nie otwiera ,

a jak już jest to się nie otwiera?


(Autologo) #5

Tak jak nie ma pliku w katalogu to sie nawet program nie włącza (Wyskakuja błędy)

a gdy juz jest w folderze to włącza sie sam program a plik sie nie otwiera.Tak czy siak nie działa

case CM_PLIK_OTWORZ:

            { 

               HWND hChild;

               char szFileName[MAX_PATH];


               if(!GetFileName(hwnd, szFileName, FALSE))

                  break;


               WyczytajPlik.szTitle = szFileName;

               WyczytajPlik.szClass = g_szChild;

               WyczytajPlik.hOwner = g_hInst; 

               WyczytajPlik.x = WyczytajPlik.cx = CW_USEDEFAULT;

               WyczytajPlik.y = WyczytajPlik.cy = CW_USEDEFAULT; 

               WyczytajPlik.style = MDIS_ALLCHILDSTYLES;


               hChild = (HWND)SendMessage(g_hMDIClient, WM_MDICREATE,

                  0, (LONG)&WyczytajPlik);


               if(!hChild)

               {

                  MessageBox(hwnd, R1, error,MB_ICONEXCLAMATION | MB_OK);

               }

            }     

            break;

[EDIT]

Jeżeli jakbyś mógł polecić jakiś dobry kurs o tworzeniu formatu bardzo byłbym wdzięczny w ogóle nie mogę znaleśc jakiegos dobrego kursiku.


(Grzegorz) #6

Skąd masz ten kod? Co on ma robić? Co robi funkcja GetFileName? Zwraca pełną ścieżkę do pliku? Co to jest WyczytajPlik? Obiekt reprezentujący okno? Gdzie masz kod otwierający plik? szFileName widać tylko przy ustawianiu tytułu okna, nie widać aby ta zmienna była używana dalej. Jakiego typu w ogóle plik chcesz otworzyć? Tekstowy? Co rozumiesz przez tworzenie formatu? Formatki czyli okienka? Do tego służy np. CreateWindowEx().


(Autologo) #7

Skąd mam ten kod? Ukradłem :stuck_out_tongue: z tutka... Chodzi o format pliku (np. *.dff *.txd *.txt *.bmp *.jpg). Jaki plik otworzyć? Tak tekstowy. Co rozumiem przez tworzenie formatu? To że robi się nowy plik (nowe rozszeżenie). gdzie jest kod otwierający plik? To jest właśnie ten kod...

Mi ten kod działa jedynie gdy wezme "Plik->Otwórz" ale jak otworze plik z eksploratora to takie problemy jak wyżej. GetFileName powinnieneś wiedzieć... Jeżeli nie to masz tu GetFileName... Tak jakbys sie jeszcze nie skapnął to jest procedura dialogowa.

BOOL GetFileName(HWND hwnd, LPSTR pszFileName, BOOL bSave)

{

   OPENFILENAME ofn;


   ZeroMemory(&ofn, sizeof(ofn));

   pszFileName[0] = 0;


   ofn.lStructSize = sizeof(ofn);

   ofn.hwndOwner = hwnd;

   ofn.lpstrFilter = "Pliki tekstowe (*.ter)\0*.ter\0Pliki tekstowe (*.txt)\0*.txt\0Wszystkie pliki (*.*)\0*.*\0";

   ofn.lpstrFile = pszFileName;

   ofn.nMaxFile = MAX_PATH;

   ofn.lpstrDefExt = "txt";

   if(bSave)

   {

      ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY |

         OFN_OVERWRITEPROMPT;

      if(!GetSaveFileName(&ofn))

         return FALSE;

   }

   else

   {

      ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;

      if(!GetOpenFileName(&ofn))

         return FALSE;

   }

   return TRUE;

}

(Ryan) #8

Kiedy następnym razem będziesz miał problem, sugeruję żebyś był nieco bardziej uprzejmy. Sugerując, że ktoś jest pojebany zmniejszasz sobie szansę na uzyskanie pomocy. Taka darmowa sugestia na przyszłość. Nie musisz dziękować.


(Magik) #9

Kamzar1 , za niecenzuralne słownictwo dostajesz ostrzeżenie.

Zdecydowanie bardziej opłaca się być grzeczniejszym w stosunku do ludzi, którzy próbują ci pomóc.

Tekst z wiadomym słowem wykasowałem.


(Autologo) #10

Napisałem "Bez urazy" fakt faktem troche przegiołem. A dostane pomoc w końcu. :stuck_out_tongue: Coś jeszcze trzeba.?


([alex]) #11

W żadnym z tych miejsc co przedstawiłeś niema błędu który by doprowadzał do tego co opisujesz.

Jak już mówiłem wcześniej " pokaż fragment kodu odpowiedzialny za otwarcie pliku".


(Autologo) #12

Fkatycznie pomyliłem się. :stuck_out_tongue:

BOOL LoadFile(HWND hEdit, LPSTR pszFileName)

{

   BOOL bSuccess = FALSE;


   hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL,

      OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

   if(hFile != INVALID_HANDLE_VALUE)

   {

      DWORD dwFileSize;

      dwFileSize = GetFileSize(hFile, NULL);

      if(dwFileSize != 0xFFFFFFFF)

      {

         LPSTR pszFileText;

         pszFileText = LPSTR(GlobalAlloc(GPTR, dwFileSize + 1));

         if(pszFileText != NULL)

         {

            DWORD dwRead;

            if(ReadFile(hFile, pszFileText, dwFileSize, &dwRead, NULL))

            {

               pszFileText[dwFileSize] = 0; 

               if(SetWindowText(hEdit, pszFileText))

                  bSuccess = TRUE; // Działa

            }

            GlobalFree(pszFileText);

         }

      }

      CloseHandle(hFile);

   }

   return bSuccess;

}

([alex]) #13

Tu też nic strasznego się nie dzieję jedynie sprawdź czy pszFileName po GetOpenFileName() jest razem ze ścieżką czy bez. To trzeba szukać tam gdzie ten LoadFile jest wywoływany, podejrzewam że będzie to dwa miejsca.


(Autologo) #14

Jest z ściężką.

@EDIT:

To ma ktos jakis dobry kurs do tworzenia własnego rozrzeżenia.


(Kalin 93) #15

Po co Ci Tworzyć własne rozszerzenie ? :stuck_out_tongue:

Wystarczy przy zapisie/odczycie pliku otworzyć plik z odpowiednią nazwa (i rozszerzeniem!) np:

ZapisGry1.sav czy tez MojPlik.mojerozszerzenie

Rozumiesz ?


(Autologo) #16

Tak już robię... Ale nie będzie miec własnej ikony, własnej procedutry i nie będzie mieć nawet kolorowej zmienionej czcionki i to jest bez sensu chcę zrobić własne rozrzeżenie do nauki i do programu. np plik był formatowany przykład: tekst a program by odczytywał sam "tekst" o atrubutach takich jak na górze

EDIT: A tak po za tym to jakby ktoś ściagnął mój program by musiał sam usawiac rozszeżenie bo nie będzie miec tego w rejestsze


(Kalin 93) #17

Do tego służą wpisy w rejestrze. w MSDN(po ang.) powinieneś coś na ten temat znaleźć