Długie nazwy plików w starym win16

0

Mam stary program jeszcze z czasów Windows 3.1, a wtedy nazwy plików były ograniczone do 8 znaków + 3 na rozszerzenie.

Teraz w Win32 (95, 98, NT, XP itd.) są długie nazwy - nawet 250 znaków, które są skracane do formatu 8.3 dla aplikacji 16-bitowych.

Przykładowo mam na dysku dwa pliki:
"Miasta z województwa dolnośląskiego.txt", "Miasta z województwa mazowieckiego.txt"

Mogę te zbiory otworzyć z aplikacji 16-bitowej, ale tam zobaczę (w standardowym dialogu, który odpalamy z GetOpenFileName) jedynie skróconą wersję - 6 liter początkowych oraz cyfry:
"Miasta1.txt", "Miasta2.txt".

Chodzi oczywiście o całe nazwy, czyli po prostu odpalić tą nową wersję - explorer-style, z folderami, listami, ikonami, bajerami. Dokładnie ten sam, który widzimy z nowych programów (raczej nie mam zamiaru wyciskać tych pełnych nazw z systemu itd., i tworzyć eksplorera...).

Może ktoś robił coś takiego i zna proste rozwiązanie.
Na razie kombinuję tak: robię aplikacyjkę win32, która otworzy co trzeba, i potem przerzuci wybrany plik do 16 bitowej. :-)

0

ok. opisales kontekst i wskazales swąd. ale co chcesz osiągnąć i w jaki sposób?
niestety "chodzi o nazwy" / "kobinuję tak" nie mówi nic w tym temacie, a topik sugeruje ze chcesz operowac na dlugich nazwach BEDAC W systemie win16, czemu to z kolei tresc watku zaprzecza - bo piszesz cos o tworzeniu wlasnej pomocniczej app win32..

0

Moze stworz program, ktory bedzie zmienial nazwy plikow na max 8znakowe, ale wiecej mowiace - np "Miasta z województwa mazowieckiego.txt" na "MiWojMaz.txt" czy jak chcesz i bedzie zapisywal w jakims swoim pliku zarowno stara jak i nowa nazwe. Odpalasz program, zmieniasz nazwy na krotkie, korzystasz z archaicznej aplikacji i jak juz skonczysz z niej korzystac to swoim programem z powrotem zmieniasz nazwy plikow na nazwy poczatkowe.
Inna opcja - jezeli sie uda to odpal ten zabytek na dosboxie i na nim dzialaj. Jak potrzebujesz sprawdzic co oznacza "Miasta~1.txt" to alt+tab i patrzysz w odpowiednim folderze jaka jest pelna nazwa pliku.

Quetz - mi sie wydaje, ze On chce odpalic na jakims starym 32bitowym windowsie program 16 bitowy i stara sie tak pokombinowac, ze ten program widzial dlugie nazwy plikow, a nie skrocone wersje.

0
quetzalcoatl napisał(a)

co chcesz osiągnąć i w jaki sposób?

Chcę otwierać/przeglądać foldery/pliki tak samo jak to robią app. win32, ale z aplikacji win16 (funkcja GetOpenFileName, w wersji nowszej - Win32, czyli z comdlg32.dll).

Całość ma pracować na win 98 lub nowszym - nie na win 3.1 (tego nikt już raczej nie używa).

quetzalcoatl napisał(a)

topik sugeruje ze chcesz operowac na dlugich nazwach BEDAC W systemie win16, czemu to z kolei tresc watku zaprzecza - bo piszesz cos o tworzeniu wlasnej pomocniczej app win32..

Tak. Długie nazwy można normalnie używać w aplikacji win16 (otwieranie i tworzenie plików:_lcreate i _lopen działają na długich, nie trzeba nic tu zmieniać - to i tak idzie do CreateFile z win32...).

Pomocnicza aplikacja wylistuje te nazwy jak należy - człowiek widzi co trzeba, może dodatkowo tworzyć nowe katalogi, usuwać, itd.

Potem przerzucam wybraną nazwę do win16 i tyle... ale to trochę porąbane:
win16 odpala win32, a sam siebie musi jakoś zablokować (lepiej: ta niewidzialna app. win32 stawia okno z plikami na oknie głównym win16...). Muszą się jakoś komunikować - chyba WM_SETTEXT wystarczy...

Moze stworz program, ktory bedzie zmienial nazwy plikow na max 8znakowe, ale wiecej mowiace - np "Miasta z województwa mazowieckiego.txt" na "MiWojMaz.txt" czy jak chcesz i bedzie zapisywal w jakims swoim pliku zarowno stara jak i nowa nazwe. Odpalasz program, zmieniasz nazwy na krotkie, korzystasz z archaicznej aplikacji i jak juz skonczysz z niej korzystac to swoim programem z powrotem zmieniasz nazwy plikow na nazwy poczatkowe.
Inna opcja - jezeli sie uda to odpal ten zabytek na dosboxie i na nim dzialaj. Jak potrzebujesz sprawdzic co oznacza "Miasta~1.txt" to alt+tab i patrzysz w odpowiednim folderze jaka jest pelna nazwa pliku.

dobrze że też faceci z Mikrosofta nie wpadli na to... :-D
Jak nic tam nie mam do sprawdzania - programy są dla ludzi.

0

Całość ma pracować na win 98 lub nowszym - nie na win 3.1 (tego nikt już raczej nie używa).
Możesz co prawda dokonywać różnych karkołomnych kombinacji, być może udanych, ale prawidłowym rozwiązaniem jest przerobienie programu na 32 bity. Jakaś większa przeszkoda w tym?

0

Znalazłem rozwiązanie bez kombinacji z 32-bitową aplikacją:

Windows udostępnia długoplikonazwowe API 16-bitowym programom poprzez przerwanie 21h. Funkcje te (zwane LFN - long filenames) są udokumentowane w Ralf Brown's Interrupt List. Przykładowo, funkcja ax=7160h,cl=2 zwraca długą nazwę pliku dla podanej krótkiej.

mov ax,7160h
mov cl,2
mov ch,0
mov si,offset shortfilename
push ds
pop es
mov di,offset longfilename
int 21h
jc blad

Powyższy przykład pobiera string ASCIIZ z shortfilename i przerabia go na długą nazwę pliku w longfilename (który musi być buforem 260 znaków plus NULL).

Jest tam cały zestaw funkcji do obsługi plików.
Teraz trzeba wyrzeźbić własne okienko do otwierania plików, wyświetlające długie nazwy z wykorzystaniem LFN API.

Jeszcze ważne pytanie: jakiego używasz kompilatora do tych 16 bitów?

0
Azarien napisał(a)

Możesz co prawda dokonywać różnych karkołomnych kombinacji, być może udanych, ale prawidłowym rozwiązaniem jest przerobienie programu na 32 bity. Jakaś większa przeszkoda w tym?

Docelowo tak będzie, ale przerobienie całości wymaga kilku miesięcy roboty, więc doraźnie chcę zrobić te pliki.

int 21 znam - z dokumentacji win 95. Też za dużo roboty - musiałbym tworzyć od zera te dialogi listujące pliki, foldery, dyski z comdlg32... Tree, ListView, ikony, itd.

Może spróbuję jeszcze zaimportować funkcję z comdlg32.dll:
http://support.microsoft.com/kb/125710
ale takie coś działa chyba dla prostych funkcji, które nie tworzą okien, procesów, wątków, itd. (np. operacje na plikach).

Ale z drugiej strony: takie coś powinno zadziałać, bo np. okna do konfigurowania drukarki normalnie się otwierają, a te są przecież takie same jak w 32 bitowych programach... no, ale może to jest robione poprzez ukryty proces 32-bitowy...

0

Jeśli coś ci się uda osiągnąć z tym wywołaniem 32-bitowej dll-ki, daj znać.

0

Normalnie odpala GetOpenFileName z comdlg32 i działa, ale ten dialog lekko nawala.

Gdy przełączam na widok 'szczegóły' nic się nie zmienia - zostają ikony z nazwami. Tryb miniatur też coś szwankuje - niektórych w ogóle nie wyświetla.

Nie wiem o co mu chodzi - skoro już się odpala to powinien działać jak należy... kaszaneria, jak zwykle. Te systemy na włosku wiszą, i do tego im nowszy sys tym cieńszy włos. [rotfl]

//q: nie, nie, to nie tak.. włos jest ten sam, tylko słoń na nim wisący ciągle tyje..

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