-
Notifications
You must be signed in to change notification settings - Fork 0
programming
|
Strony tej Wiki są oparte na pliku pomocy "Packers plugin writer guide" v2.21 SE, częściowo napisanym przez Jiriego Bartona. Najnowsza wersja tego pliku oraz niektóre wtyczki pakujące (część ze źródłami w C lub Delphi) powinny być dostępne na ghisler.com 1, sekcja addons.
Copyright © 2000-2003 by Christian Ghisler, C. Ghisler & Co. Wszelkie prawa zastrzeżone.

Ten plik pomocy dotyczy pisania wtyczek pakujących dla menedżera plików Total Commander, dostępny na stronie dokumentacji interfejsu wtyczki T.C.. Opisuje funkcje, które należy zaimplementować, aby dodać określony program pakujący do Total Commander. Powinieneś także spojrzeć na dostępne programy pakujące próbki (ze źródłem), które dają pewien wgląd w programowanie wtyczek. Istnieją próbki dla Microsoft Visual C++ i Delphi.
WCX (WCX64) to nic innego jak (64)32-bitowa biblioteka DLL systemu Windows, której nazwa została zmieniona na *.WCX, która obsługuje listę określonych funkcji. Total Commander ładuje tę bibliotekę dynamicznie w czasie wykonywania za pomocą LoadLibrary() i ładuje wszystkie dostępne funkcje za pomocą GetProcAddress(). Oznacza to, że nie wszystkie opisane tutaj funkcje muszą być zaimplementowane (patrz poniżej). Wszystkie funkcje używają konwencji wywoływania STDCALL bez zniekształcania nazw C++ (patrz poniżej), dokładnie tak, jak w większości standardowych bibliotek systemowych w Windows.
Minimalne funkcje potrzebne do wtyczki tylko do odczytu to:
OpenArchive - mówi wtyczce, które archiwum powinna otworzyć w celu wyświetlenia lub przeczytania.
ReadHeader -ta funkcja jest wywoływana, dopóki wtyczka nie zwraca błędu — wtyczka musi zwrócić jedną nazwę pliku w archiwum na każde wywołanie.
ProcessFile - wywoływana natychmiast po ReadHeader. Nakazuje wtyczce wyodrębnić, przetestować lub pominąć ten plik.
CloseArchive - wywoływana po zwróceniu przez ReadHeader błędu.
SetChangeVolProc - Ustaw funkcję wywołania zwrotnego, aby zażądać zmiany dysku od użytkownika.
SetProcessDataProc - Ustaw funkcję wywołania zwrotnego, aby przekazać opinię i zezwolić na przerwanie operacji pakowania lub rozpakowywania.
Wszystkie poniższe funkcje są opcjonalne. Jeśli chcesz je wspierać, musisz również zaimplementować GetPackerCaps, aby poinformować Total Commander, które funkcje są obsługiwane. Jeśli GetPackerCaps nie jest dostępny, Total Commander zakłada, że wtyczka obsługuje tylko rozpakowywanie. Nawet z wtyczką tylko do odczytu możesz chcieć zaimplementować GetPackerCaps i zwrócić PK_CAPS_SEARCHTEXT, aby umożliwić Total Commanderowi wyszukiwanie tekstu w archiwach tego typu.
Pierwsza grupa pozwala tworzyć lub modyfikować istniejące archiwa:
PackFiles - każe wtyczce spakować listę plików do danego archiwum. Jeśli archiwum istnieje, wtyczka powinna dodać pliki do tego archiwum. Total Commander poprosi użytkownika o potwierdzenie nadpisania, więc pliki, które już istnieją w archiwum, powinny zostać nadpisane.
DeleteFiles - każe wtyczce usunąć pliki z podanego archiwum.
ConfigurePacker - pozwala wtyczce otworzyć okno konfiguracji do pakowania (nie rozpakowywania!). Jest wywoływany po naciśnięciu przycisku 'konfiguruj' w oknie dialogowym Pliki Total Commander - Pakowanie.
Następujące opcjonalne funkcje służą do pakowania w pamięci:
Jest to używane przez Total Commander do tworzenia plików TAR.Plugin w jednym kroku. Na przykład wtyczka .BZ2 obsługuje te funkcje. Większość wtyczek może spakować wiele plików do jednego archiwum i dlatego nie będzie musiała implementować tych funkcji.
StartMemPack mówi wtyczce, aby przygotowała wewnętrzne struktury do spakowania do pamięci.
PackToMem wysyła nowe dane (do spakowania) do wtyczki i odbiera z niej spakowane dane.
DoneMemPack kończy pakowanie do pamięci po udanej pętli PackToMem lub gdy użytkownik przerwie pakowanie.
Następująca funkcja mówi wtyczce, aby sprawdziła, czy może obsłużyć określony nieznany plik, czy nie:
CanYouHandleThisFile pozwala wtyczce na obsługę plików, które mogą mieć inne rozszerzenie, np. samorozpakowujące się archiwa.
Jak Total Commander wywołuje funkcje ekstrakcji:
Oto prosta deklaracja pseudokodu, w jaki sposób Total Commander wywołuje funkcje ekstrakcji:
1. Wykonaj pętlę, aby wyszukać pliki w archiwum:
OpenArchive() with OpenMode==PK_OM_LIST repeat ReadHeader() ProcessFile(...,PK_SKIP,...) until error returned CloseArchive()
2. Zapętl, aby wyodrębnić pliki z archiwum:
OpenArchive() with OpenMode==PK_OM_EXTRACT repeat ReadHeader() if WantToExtractThisFile() ProcessFile(...,PK_EXTRACT,...) else ProcessFile(...,PK_SKIP,...) until error returned CloseArchive()
Jeśli używasz __stdcall, linker tworzy nazwy plików, takie jak "_ReadHeader@8"
Aby uzyskać kompatybilną wtyczkę, plik "Def", np. wcx.def musi zostać dodany do twojego projektu.
--Początek pliku wxc.def, aby zmienić nazwy eksportu dla konsolidatora
EXPORTS CloseArchive=_CloseArchive@4 DeleteFiles=_DeleteFiles@8 GetPackerCaps=_GetPackerCaps@0 OpenArchive=_OpenArchive@4 PackFiles=_PackFiles@20 ProcessFile=_ProcessFile@16 ReadHeader=_ReadHeader@8 SetChangeVolProc=_SetChangeVolProc@8 SetProcessDataProc=_SetProcessDataProc@8 ConfigurePacker=_ConfigurePacker@8
--Koniec pliku wcx.def
Wraz z Total Commander 8, Total Commander jest teraz dostępny również w wersji 64-bitowej. Ponieważ wtyczki są prostymi bibliotekami DLL, a programy 64-bitowe mogą ładować tylko 64-bitowe biblioteki DLL, wtyczka musi zostać ponownie skompilowana za pomocą 64-bitowego kompilatora, aby działała z 64-bitowym Total Commander.
WAŻNE: Wtyczka 64-bitowa musi mieć taką samą nazwę jak wtyczka 32-bitowa i znajdować się w tym samym katalogu, ale do rozszerzenia musi być dopisane '64' . Przykład: filesystem.wcx -> filesystem.wcx64. Wtyczki obsługujące tylko wersje 64-bitowe również muszą kończyć się na '64'.
Ponieważ wszystkie 64-bitowe wersje systemu Windows obsługują Unicode, wystarczy napisać 64-bitową wtyczkę obsługującą tylko Unicode. Jeśli jednak istniejąca wtyczka 32-bitowa obsługuje tylko funkcje ANSI, możesz ją przenieść bez modyfikacji do wersji 64-bitowej. Total Commander 64-bit obsługuje również funkcje ANSI, jeśli nie może znaleźć funkcji Unicode. 64-bitowe wtyczki Unicode nie mają rozszerzenia rozpoczynającego się na literę 'u', mają normalne rozszerzenie 'wcx64'.
Kilka uwag dotyczących przenoszenia: Wszystkie parametry całkowite w funkcjach wtyczki pozostają 32-bitowe (np. w C: int, long, DWORD; Delphi: integer, dword), tylko wskaźniki i uchwyty mają teraz szerokość 64-bitową. Ponowna kompilacja programu lub biblioteki dll za pomocą kompilatora 64-bitowego zwykle zajmuje się tym automatycznie, bez konieczności wprowadzania wielu zmian. Problemy mogą pojawić się podczas konwersji wskaźników na liczby całkowite i odwrotnie. Upewnij się, że używasz 64-bitowych zmiennych całkowitych (np. size_t w C, ptrint lub ptruint w Lazarusie) do takich operacji.
Jak najłatwiej przekonwertować istniejącą wtyczkę na wersję 64-bitową?
1. Jeśli wtyczka została napisana w C lub C++:
Jeśli masz program Visual Studio Professional 2005 lub nowszy, kompilator 64-bitowy jest już dołączony. Jeśli używasz bezpłatnej wersji Express lub programu Visual Studio 2003, oprócz programu Visual Studio Express potrzeba zainstalować zestaw Windows Software Development Kit (SDK).
Oto jak dodać obsługę wersji 64-bitowej do istniejącej wtyczki:
- Sprawdź paski narzędzi w programie Visual Studio: dostępne są pola kombi dla typu kompilacji (debugowanie lub wydanie) oraz takie, które pokazuje "Win32"..
- Otwórz ten, który pokazuje "Win32". i kliknij "Menedżer konfiguracji".
- Kliknij "New" na liście Active Solution Platform (po prawej stronie). Zostanie wyświetlone nowe okno dialogowe „Nowa platforma rozwiązań”.
- W górnym polu wybierz "x64"
- W dolnym polu "kopiuj z", wybierz "Win32"
- Upewnij się, że pole wyboru "New Solution Platform" jest zaznaczone
- Kliknij OK
- Teraz możesz przełączać się w tym samym projekcie między Win32 i x64. Przełącz na x64.
- Otwórz ustawienia swojego projektu.
- Powinieneś ustawić następujące opcje:
- C++ - Generowanie kodu - biblioteka środowiska uruchomieniowego: Multi-threaded-Debug (/Mtd) <- nie wielowątkowa biblioteka debugowania!
- Linker - Ogólne - plik wyjściowy: wcx/pluginname.wcx64
- Edycja Visual Studio Express C++:
- Zestaw programistyczny Windows (SDK):
2. Jeśli wtyczka została napisana w Delphi lub Free Pascal:
Dostępny jest 64-bitowy Lazarus/Free Pascal, którego można używać do tworzenia 64-bitowych bibliotek DLL. Sam Total Commander został skompilowany z Lazarusem jako aplikacja 64-bitowa. W menu "Tools" znajdują się pozycje menu służące do konwersji projektów i formularzy Delphi na Lazarus.
Lazarus/Free Pascal działa nieco inaczej niż Delphi, więc niektóre funkcje mogą wymagać zmiany. Oto problemy napotkane podczas przenoszenia Total Commandera:
- Free pascal jest inny -> Użyj {$MODE Delphi} we wszystkich plikach *.pas do obsługi funkcji w sposób Delphi
- strnew tworzy wskaźnik NIL, gdy przekazany pchar ma długość 0 bajtów. -> Użyj własnej funkcji strnew.
- Komunikaty systemu Windows poniżej WM_USER nie są przekazywane do procedury systemu Windows. -> Użyj SetWindowLongPtr, aby podklasować okno
- Obliczenie p-bufor nie działa, gdy p jest pwidechar, buforuj tablicę widechar -> użyj p-pwidechar(@bufffer)
- INVALID_HANDLE_VALUE jest niepoprawnie ustawiony na 0 zamiast -1 w lcltype.pp! -> Umieść "windows" na końcu polecenia "uses" .
W Total Commander 7.5 (interfejs wtyczki pakującej 2.20) dodano obsługę Unicode do wszystkich typów wtyczek. Zasadniczo musisz zaimplementować te same funkcje, co w przypadku ANSI, z dwiema różnicami: nazwa funkcji jest zmieniana z FunctionName na FunctionNameW, a ciągi znaków Ansi są zmieniane na szerokie nazwy znaków.
Total Commander wywoła funkcje Unicode we wszystkich systemach opartych na NT (Windows NT, 2000, XP), jeśli są obecne. Jeśli nie, lub w Windows 9x/ME, Total Commander wywoła funkcje Ansi.
Następujące funkcje interfejsu wtyczki pakującej obsługują Unicode:
- OpenArchive
- ReadHeaderEx
- ProcessFile
- SetChangeVolProc
- SetProcessDataProc
- PackFiles
- DeleteFiles
- StartMemPack
- CanYouHandleThisFile
ReadHeader - użyj ReadHeaderEx CloseArchive GetPackerCaps ConfigurePacker PackToMem DoneMemPack PackSetDefaultParams ReadHeaderEx
Jaki jest najłatwiejszy sposób obsługi Unicode w istniejącej wtyczce?
1. Pobierz moją przykładową wtyczkę fsplugin (sekcja wtyczek systemu plików), nawet jeśli piszesz inny typ wtyczki!
2. Dodaj pliki cunicode.hi cunicode.cpp do swojego projektu. Zawierają różne funkcje ułatwiające obsługę Unicode.
3. Przekonwertuj istniejące funkcje na Unicode i zmień ich nazwy na FunctionNameW. W przypadku wszystkich funkcji plików, takich jak CreateFile, nie wywołuj bezpośrednio ich odpowiednika w Unicode, CreateFileW. Zamiast tego wywołaj funkcje z cunicode.cpp, takie jak CreateFileT. Funkcje te automatycznie wywołują właściwą funkcję Unicode lub Ansi, a nawet obsługują nazwy plików o długości >259 znaków!
4. Dla każdej przekonwertowanej funkcji, takiej jak FunctionNameW, utwórz ponownie funkcję FunctionName, którą wywołujesz w ten sposób:
int __stdcall FunctionName(char* SomeString1,char* SomeString2)
{
WCHAR SomeString1W[wdirtypemax],SomeString2W[wdirtypemax];
return
FunctionNameW(awfilenamecopy(SomeString1W,SomeString1),awfilenamecopy(SomeString2W,SomeString2));
}
Makro awfilenamecopy przekonwertuje ciąg Ansi SomeString1 na Unicode i zapisze go w inSomeString1W. Ta zmienna nie może być wskaźnikiem, ponieważ awfilenamecopy używa "countof", aby uzyskać docelową długość.
OpenArchive powinien wykonać wszystkie niezbędne operacje, gdy archiwum ma zostać otwarte.
HANDLE __stdcall OpenArchive ( tOpenArchiveData *ArchiveData);
Opis
OpenArchive powinien zwrócić unikalny uchwyt reprezentujący archiwum. Uchwyt powinien pozostać ważny do momentu wywołania CloseArchive. Jeśli wystąpi error , należy zwrócić zero i określić błąd, ustawiając OpenResult członka ArchiveData.
Możesz użyć ArchiveData do zapytania o informacje o otwartym archiwum i przechowywać informacje w ArchiveData w jakiejś lokalizacji, do której można uzyskać dostęp za pomocą uchwytu.
Totalcmd wywołuje ReadHeader, aby dowiedzieć się, jakie pliki znajdują się w archiwum.
int __stdcall ReadHeader (HANDLE hArcData, tHeaderData *HeaderData);
Opis
ReadHeader jest wywoływany tak długo, jak zwraca zero (o ile poprzednie wywołanie tej funkcji zwróciło zero). Przy każdym wywołaniu HeaderData ma dostarczyć Totalcmd informację o kolejnym pliku zawartym w archiwum. Kiedy wszystkie pliki w archiwum zostaną zwrócone, ReadHeader powinien zwrócić E_END_ARCHIVE, co zapobiegnie ponownemu wywołaniu ReaderHeader. Jeśli wystąpi błąd, ReadHeader powinien zwrócić jedną z wartości błędu lub 0 w przypadku braku błędu.
hArcData zawiera uchwyt zwrócony przez OpenArchive. Zachęcamy programistę do przechowywania innych informacji w lokalizacji, do której można uzyskać dostęp za pomocą tego uchwytu. Na przykład możesz chcieć zapisać pozycję w archiwum podczas zwracania informacji o plikach w ReadHeader.
Krótko mówiąc, powinieneś ustawić przynajmniej elementy PackSize, UnpSize, FileTime i FileName tHeaderData. Totalcmd użyje tych informacji do wyświetlenia zawartości archiwum, gdy archiwum będzie przeglądane jako katalog.
ProcessFile powinien rozpakować określony plik lub przetestować integralność archiwum.
int __stdcall ProcessFile (HANDLE hArcData, int Operation, char *DestPath, char *DestName);
Opis
ProcessFile powinien zwrócić zero w przypadku sukcesu lub jedną z wartości błędów w przeciwnym razie.
hArcData zawiera uchwyt zwrócony wcześniej przez Ciebie w OpenArchive. Korzystając z tego, powinieneś być w stanie znaleźć informacje (takie jak nazwa pliku archiwum), które są potrzebne do wyodrębnienia plików z archiwum.
W przeciwieństwie do PackFiles, ProcessFile przekazuje tylko jedną nazwę pliku. Albo DestName zawiera pełną ścieżkę i nazwę pliku, a DestPath ma wartość NULL, albo DestName zawiera tylko nazwę pliku, a DestPath ścieżkę do pliku. Odbywa się to w celu zapewnienia zgodności z plikiem unrar.dll.
Kiedy Total Commander po raz pierwszy otwiera archiwum, skanuje wszystkie nazwy plików z OpenMode==PK_OM_LIST, więc ReadHeader() jest wywoływana w pętli z wywołaniem ProcessFile(...,PK_SKIP,...). Kiedy użytkownik wybierze jakieś pliki i zacznie je dekompresować, Total Commander ponownie wywołuje ReadHeader() w pętli. Dla każdego pliku, który ma zostać wyodrębniony, Total Commander wywołuje ProcessFile() z Operation==PK_EXTRACT natychmiast po wywołaniu ReadHeader() dla tego pliku. Jeśli plik musi zostać pominięty, wywołuje go za pomocą Operation==PK_SKIP.
Za każdym razem DestName jest ustawione tak, aby zawierało nazwę pliku do wyodrębnienia, przetestowania lub pominięcia. Aby dowiedzieć się, jaką operację z tych trzech ostatnich należy zastosować do bieżącego pliku w archiwum, Operacja jest ustawiona na jedną z następujących czynności:
Constant Opis wartości
PK_SKIP 0 Pomiń ten plik
PK_TEST 1 Test integralności pliku
PK_EXTRACT 2 Wypakuj na dysk
CloseArchive powinien wykonać wszystkie niezbędne operacje, gdy archiwum ma zostać zamknięte.
int __stdcall CloseArchive (HANDLE hArcData);
Opis
CloseArchive powinno zwrócić zero w przypadku sukcesu lub jedną z wartości błędu w przeciwnym razie. Powinno zwolnić wszystkie zasoby związane z otwartym archiwum.
Parametr hArcData odnosi się do wartości zwracanej przez programistę w ramach poprzedniego wywołania OpenArchive.
Funkcja ta umożliwia powiadamianie użytkownika o zmianie woluminu podczas pakowania plików.
int __stdcall ReadHeader (HANDLE hArcData, tHeaderData *HeaderData);
Opis
pChangeVolProc1 zawiera wskaźnik do funkcji, którą możesz chcieć wywołać, powiadamiając użytkownika o zmianie głośności (np. wkładając kolejną dyskietkę). Jeśli chcesz z niej skorzystać, musisz przechowywać tę wartość w jakimś miejscu; możesz użyć hArcData zwróconego przez OpenArchive, aby zidentyfikować to miejsce.
Funkcja ta umożliwia powiadamianie użytkownika o postępie rozpakowywania/pakowania plików.
void __stdcall SetProcessDataProc (HANDLE hArcData, tProcessDataProc pProcessDataProc);
Opis
pProcessDataProc zawiera wskaźnik do funkcji, którą możesz chcieć wywołać, powiadamiając użytkownika o postępie podczas pakowania lub wyodrębniania plików z archiwum. Jeśli chcesz z niej skorzystać, musisz przechowywać tę wartość w jakimś miejscu; możesz użyć hArcData zwróconego przez OpenArchive, aby zidentyfikować to miejsce.
PackFiles określa, co powinno się stać, gdy użytkownik tworzy lub dodaje pliki do archiwum.
int __stdcall PackFiles (char *PackedFile, char *SubPath, char *SrcPath, char *AddList, int Flags);
Opis
PackFiles powinien zwrócić zero w przypadku sukcesu lub jeden z kodów błędów w przeciwnym razie.
PackedFile odnosi się do archiwum, które ma zostać utworzone lub zmodyfikowane. Ciąg zawiera pełną ścieżkę.
SubPath ma wartość NULL, gdy pliki powinny być spakowane ze ścieżkami podanymi w nazwach plików, lub nie NULL, gdy powinny być umieszczone poniżej podanego podkatalogu w archiwum. Przykład:
SubPath="podkatalog"
Nazwa w AddList="subdir2\filename.ext"
-> Plik powinien być spakowany jako "subdirectory\subdir2\filename.ext"
SrcPath zawiera ścieżkę do plików w AddList. SrcPath i AddList razem określają pliki, które mają być spakowane do PackedFile. Każdy ciąg w AddList jest rozdzielany zerami (kończy się na zero), a ciąg AddList kończy się dodatkowym bajtem zerowym, tj. na końcu AddList są dwa bajty zerowe.
Flags mogą zawierać kombinację następujących wartości odzwierciedlających wybór użytkownika w Totalcmd:
Constant wartość Opis
PK_PACK_MOVE_FILES 1 Usuń oryginał po spakowaniu
PK_PACK_SAVE_PATHS 2 Zapisz nazwy ścieżek plików
PK_PACK_ENCRYPT 4 Zapytaj użytkownika o hasło, a następnie zaszyfruj plik tym hasłem
DeleteFiles powinien usunąć określone pliki z archiwum
int __stdcall DeleteFiles (char *PackedFile, char *DeleteList);
Opis
DeleteFiles powinien zwrócić zero w przypadku powodzenia lub jeden z kodów błędów w przeciwnym razie.
PackedFile zawiera pełną ścieżkę i nazwę archiwum.
DeleteList zawiera listę plików, które należy usunąć z archiwum. Format tego ciągu jest taki sam jak AddList w PackFiles.
GetPackerCaps informuje Totalcmd, jakie funkcje obsługuje Twoja wtyczka pakująca.
int __stdcall GetPackerCaps();
Opis
Zaimplementuj GetPackerCaps, aby zwrócić kombinację następujących wartości:
Constant Wartość Opis
PK_CAPS_NEW 1 Może tworzyć nowe archiwa
PK_CAPS_MODIFY 2 Może modyfikować istniejące archiwa
PK_CAPS_MULTIPLE 4 Archiwum może zawierać wiele plików
PK_CAPS_DELETE 8 Może usuwać pliki
PK_CAPS_OPTIONS 16 Zawiera okno dialogowe opcji
PK_CAPS_MEMPACK 32 Obsługuje pakowanie w pamięci
PK_CAPS_BY_CONTENT 64 Wykryj typ archiwum według zawartości
PK_CAPS_SEARCHTEXT 128 Zezwalaj na wyszukiwanie tekstu w archiwach utworzonych za pomocą tej wtyczki
PK_CAPS_HIDE 256 Nie pokazuj ikony programu pakującego, nie otwieraj za pomocą Enter, ale za pomocą Ctrl+PgDn
PK_CAPS_ENCRYPT 512 Wtyczka obsługuje szyfrowanie.
Pominięcie PK_CAPS_NEW i PK_CAPS_MODIFY oznacza, że PackFiles nigdy nie zostanie wywołane, więc nie musisz implementować PackFiles. Pominięcie PK_CAPS_MULTIPLE oznacza, że PackFiles zostanie dostarczony tylko z jednym plikiem. Pominięcie PK_CAPS_DELETE oznacza, że DeleteFiles nigdy nie zostanie wywołane; pominięcie PK_CAPS_OPTIONS oznacza, że ConfigurePacker nie zostanie wywołany. PK_CAPS_MEMPACK włącza funkcje StartMemPack, PackToMem i DoneMemPack. Jeśli zwrócony zostanie PK_CAPS_BY_CONTENT, Totalcmd wywołuje funkcję CanYouHandleThisFile, gdy użytkownik naciśnie Ctrl+PageDown w przypadku nieznanego typu archiwum. Na koniec, jeśli zwrócony zostanie PK_CAPS_SEARCHTEXT, Total Commander będzie wyszukiwał tekst w plikach spakowanych z tą wtyczką. Może to nie być dobry pomysł w przypadku niektórych wtyczek, takich jak wtyczka discdir, gdzie zawartość pliku może nie być dostępna. Jeśli ustawiono PK_CAPS_HIDE, wtyczka nie będzie wyświetlać typu pliku jako pakującego. Jest to przydatne w przypadku wtyczek, które służą głównie do tworzenia plików, np. do tworzenia plików wsadowych, plików avi itp. W tym przypadku plik należy otworzyć za pomocą Ctrl+PgDn, ponieważ Enter uruchomi powiązaną aplikację.
Ważna uwaga:
Jeśli zmienisz wartości zwracane przez tę funkcję, np. dodaj obsługę pakowania, musisz ponownie zainstalować wtyczkę pakującą w Total Commander, w przeciwnym razie nie wykryje nowych możliwości.
ConfigurePacker jest wywoływany, gdy użytkownik kliknie przycisk Konfiguruj w oknie dialogowym "Pakuj pliki…" w Totalcmd.
void __stdcall ConfigurePacker (HWND Parent, HINSTANCE DllInstance);
Opis
Zwykle udostępniasz użytkownikowi okno dialogowe określające metodę i/lub jej parametry, które należy zastosować w procesie pakowania. Możesz też po prostu wyświetlić okno komunikatu dotyczące wtyczki, tak jak robi to DiskDir Christiana Ghislera.
Aby pomóc Ci w uzyskaniu informacji zwrotnej, możesz użyć uchwytu okna procesu Totalcmd, Parent. Oznacza to, że okno dialogowe staje się dzieckiem elementu nadrzędnego.
Podczas tworzenia okna możesz także potrzebować uchwytu biblioteki DLL (twojej biblioteki DLL), która tworzy okno dialogowe, DllInstance.
Możesz zdecydować się nie implementować tej funkcji. Następnie upewnij się, że pomijasz PK_CAPS_OPTIONS z wartości zwracanych przez GetPackerCaps.
StartMemPack rozpoczyna pakowanie do pamięci. Ta funkcja jest potrzebna tylko wtedy, gdy chcesz tworzyć archiwa w połączeniu z TAR-em, np. TAR.BZ2. Umożliwia Totalcmd utworzenie pliku TAR.Plugin w jednym kroku.
int __stdcall StartMemPack (int Options, char *FileName);
Opis
StartMemPack powinien zwrócić uchwyt zdefiniowany przez użytkownika (np. wskaźnik do struktury) w przypadku powodzenia, w przeciwnym razie zero.
FileName odnosi się do nazwy pakowanego pliku - niektóre programy pakujące przechowują tę nazwę w lokalnym nagłówku.
Options opcje mogą zawierać kombinację następujących wartości:
Constant Wartość Opis
MEM_OPTIONS_WANTHEADERS 1 Strumień wyjściowy powinien zawierać pełne nagłówki (początek + koniec)
PackToMem pakuje kolejną porcję przekazanych mu danych i/lub zwraca skompresowane dane do programu wywołującego. Jest realizowany razem z StartMemPack i DoneMemPack
int __stdcall PackToMem (int hMemPack, char* BufIn, int InLen, int* Taken, char* BufOut, int OutLen, int* Written, int SeekBy);
Opis pól
PackToMem powinien zwrócić MEMPACK_OK (=0) w przypadku powodzenia, MEMPACK_DONE (=1) po zakończeniu lub jedną z wartości błędu w przeciwnym razie.
hMemPack to uchwyt zwracany przez StartMemPack()
BufIn jest wskaźnikiem do danych, które należy spakować
InLen zawiera liczbę bajtów wskazywanych przez BufIn
Taken musi otrzymać liczbę bajtów pobranych z bufora. Jeżeli nie zostanie zajęty cały bufor, program wywołujący przekaże pozostałe bajty do wtyczki w późniejszym wywołaniu.
BufOut jest wskaźnikiem do bufora, który może odbierać spakowane dane
OutLen zawiera rozmiar bufora wskazywanego przez BufOut
Written Zapisany musi otrzymać liczbę bajtów umieszczonych w buforze wskazanym przez BufOut
SeekBy można ustawić na przesunięcie w stosunku do bieżącej pozycji wyjściowej, o które należy przesunąć wskaźnik pliku PRZED przyjęciem danych w BufOut. Dzięki temu wtyczka może modyfikować nagłówek pliku także PO spakowaniu, np. aby zapisać CRC w nagłówku.
Opis funkcji
PackToMem to najbardziej złożona funkcja wtyczki pakującej. Jest wywoływany przez Total Commander w pętli tak długo, jak długo są dane do spakowania i gdy są dane do pobrania. Wtyczka powinna wykonywać następujące czynności:
- Dopóki przez BufIn są przesyłane dane, pobierz je i dodaj do swoich wewnętrznych buforów (jeśli jest wystarczająco dużo miejsca).
- Gdy tylko w wewnętrznych buforach wejściowych będzie wystarczająca ilość danych, rozpocznij pakowanie do buforów wyjściowych.
- Gdy tylko w wewnętrznych buforach wyjściowych pojawi się wystarczająca ilość danych, rozpocznij wysyłanie danych do BufOut.
- Gdy InLen wynosi 0, nie ma już danych do skompresowania, więc zakończ wysyłanie danych do BufOut, aż w buforze wyjściowym nie będzie już więcej danych.
- Gdy nie ma już dostępnych danych, zwróć 1.
- Nie ma obowiązku pobierania jakichkolwiek danych za pośrednictwem BufIn ani przesyłania ich za pośrednictwem BufOut. Total Commander będzie wywoływał tę funkcję, dopóki nie zwróci 1 lub nie zwróci błędu.
DoneMemPack kończy pakowanie do pamięci. Ta funkcja jest używana razem z StartMemPack i PackToMem.
int __stdcall DoneMemPack (int hMemPack);
Opis pól:
Wartość zwracana: DoneMemPack powinien zwrócić zero, jeśli operacja się powiedzie, lub jeden z kodów błędów w przeciwnym razie.
hMemPack to uchwyt zwracany przez StartMemPack.
Można go wywołać w dwóch różnych przypadkach:
- Funkcje pakowania zostały pomyślnie zakończone lub
- Użytkownik przerwał operację pakowania.
CanYouHandleThisFile umożliwia wtyczce obsługę plików o innych rozszerzeniach niż to zdefiniowane w Total Commander. Jest wywoływana, gdy wtyczka definiuje PK_CAPS_BY_CONTENT, a użytkownik próbuje otworzyć archiwum za pomocą Ctrl+PageDown.
BOOL __stdcall CanYouHandleThisFile (char *FileName);
Opis
CanYouHandleThisFile powinien zwrócić wartość true (różną od zera), jeśli wtyczka rozpozna plik jako archiwum, które może obsłużyć. Wykrywanie musi odbywać się na podstawie treści, a NIE rozszerzenia. Jeżeli ta funkcja nie jest zaimplementowana, Totalcmd zakłada, że wtyczka może obsługiwać tylko pliki z danym rozszerzeniem.
Nazwa pliku zawiera pełną nazwę (ścieżka+nazwa) sprawdzanego pliku.
PackSetDefaultParams jest wywoływany natychmiast po załadowaniu biblioteki DLL, przed jakąkolwiek inną funkcją. Ta funkcja jest nowością w wersji 2.1. Wymaga programu Total Commander >=5,51, ale jest ignorowany przez starsze wersje.
Deklaracja:
void __stdcall PackSetDefaultParams(PackDefaultParamStruct* dps);
Opis parametrów:
dps Ta struktura typu PackDefaultParamStruct zawiera obecnie numer wersji interfejsu wtyczki oraz sugerowaną lokalizację pliku ustawień (plik ini). Zaleca się przechowywanie wszelkich informacji specyficznych dla wtyczki bezpośrednio w tym pliku lub w tym katalogu pod inną nazwą. Upewnij się, że używasz unikalnego nagłówka podczas przechowywania danych w tym pliku, ponieważ jest on współdzielony przez inne wtyczki systemu plików! Jeśli Twoja wtyczka potrzebuje więcej niż 1 kilobajt danych, powinieneś użyć własnego pliku ini, ponieważ pliki ini są ograniczone do 64 KB.
Wartość zwracana:
Funkcja nie zwraca wartości:
Ważna uwaga:
Ta funkcja jest wywoływana tylko w Total Commander 5.51 i nowszych wersjach. Wersja wtyczki będzie >= 2.1.
PkSetCryptCallback wywoływany jest podczas ładowania wtyczki. Przekazane wartości należy zapisać we wtyczce do późniejszego wykorzystania. Ta funkcja jest potrzebna tylko wtedy, gdy chcesz używać bezpiecznego magazynu haseł w Total Commander.
Deklaracja:
void __stdcall PkSetCryptCallback(tPkCryptProc pPkCryptProc, int CryptoNr, int Flags);
Opis parametrów:
pPkCryptProc Wskaźnik do funkcji wywołania zwrotnego kryptowalut. Zobacz PkCryptProc, aby zapoznać się z opisem tej funkcji
CryptoNr Parametr, który należy przekazać do funkcji wywołania zwrotnego
Flags Flagi dotyczące połączenia kryptograficznego. Obecnie zdefiniowano tylko PK_CRYPTOPT_MASTERPASS_SET. Jest ustawiane, gdy użytkownik zdefiniował hasło główne.
Wartość zwracana:
Ta funkcja nie zwraca żadnej wartości.
Uwagi:
Możesz użyć tej funkcji wywołania zwrotnego do przechowywania haseł w bezpiecznym magazynie haseł Total Commander. Użytkownik zostanie automatycznie poproszony o podanie hasła głównego.
Totalcmd wywołuje ReadHeaderEx, aby dowiedzieć się, jakie pliki znajdują się w archiwum. Ta funkcja jest zawsze wywoływana zamiast ReadHeader, jeśli jest obecna. Należy go zaimplementować tylko wtedy, gdy obsługiwany typ archiwum może zawierać pliki > 2 GB. W tym przypadku powinieneś zaimplementować zarówno ReadHeader, jak i ReadHeaderEx, aby zapewnić kompatybilność ze starszymi wersjami Total Commander.
int __stdcall ReadHeaderEx (HANDLE hArcData, tHeaderDataEx *HeaderDataEx);
Opis
ReadHeaderEx jest wywoływany tak długo, jak zwraca zero (o ile poprzednie wywołanie tej funkcji zwróciło zero). Przy każdym wywołaniu HeaderDataEx ma dostarczyć Totalcmd informację o kolejnym pliku zawartym w archiwum. Kiedy wszystkie pliki w archiwum zostaną zwrócone, ReadHeaderEx powinien zwrócić E_END_ARCHIVE, co zapobiegnie ponownemu wywołaniu ReaderHeaderEx. Jeśli wystąpi błąd, ReadHeaderEx powinien zwrócić jedną z wartości błędu lub 0 w przypadku braku błędu.
hArcData zawiera uchwyt zwrócony przez OpenArchive. Zachęcamy programistę do przechowywania innych informacji w lokalizacji, do której można uzyskać dostęp za pomocą tego uchwytu. Na przykład możesz chcieć zapisać pozycję w archiwum podczas zwracania informacji o plikach w ReadHeaderEx.
Krótko mówiąc, powinieneś ustawić co najmniej elementy PackSize, PackSizeHigh, UnpSize, UnpSizeHigh, FileTime i FileName tHeaderDataEx. Totalcmd użyje tych informacji do wyświetlenia zawartości archiwum, gdy archiwum będzie przeglądane jako katalog.
Funkcja GetBackgroundFlags jest wywoływana w celu ustalenia, czy wtyczka obsługuje pakowanie lub rozpakowywanie w tle.
int __stdcall GetBackgroundFlags(void);
Opis
GetBackgroundFlags powinien zwrócić jedną z następujących wartości:
Constant Wartość Opis
BACKGROUND_UNPACK 1 Wywołania OpenArchive, ReadHeader(Ex), ProcessFile i CloseArchive są bezpieczne dla wątków (rozpakowywanie w tle)
BACKGROUND_PACK 2 Wywołania PackFiles są bezpieczne dla wątków (pakowanie w tle)
BACKGROUND_MEMPACK 4 Wywołania StartMemPack, PackToMem i DoneMemPack są bezpieczne dla wątków
Notatki Aby wtyczka pakująca była bezpieczna dla wątków, powinieneś usunąć wszelkie zmienne globalne, które nie są takie same dla wszystkich operacji pakowania i rozpakowywania. Na przykład ścieżka do nazwy pliku ini może pozostać globalna, ale współczynnik kompresji lub uchwyty plików muszą być przechowywane osobno.
Pakowanie: Funkcja PackFiles to tylko pojedyncze wywołanie, więc możesz przechowywać wszystkie zmienne na stosie (zmienne lokalne tej funkcji).
Rozpakowywanie: Możesz przydzielić strukturę zawierającą wszystkie potrzebne zmienne pomiędzy wywołaniami funkcji, takimi jak metoda i współczynnik kompresji oraz zmienne stanu, a następnie zwrócić wskaźnik do tej struktury do OpenArchive. Wskaźnik ten zostanie następnie przekazany do wszystkich innych funkcji, takich jak ReadHeader, jako parametr hArcData.
Spakuj do pamięci: Możesz zrobić to samo w StartMemPack, jak opisano w Rozpakowywanie.
tHeaderData to struktura używana w ReaderHeader.
typedef struct {
char ArcName[260];
char FileName[260];
int Flags;
int PackSize;
int UnpSize;
int HostOS;
int FileCRC;
int FileTime;
int UnpVer;
int Method;
int FileAttr;
char* CmtBuf;
int CmtBufSize;
int CmtSize;
int CmtState;
} tHeaderData;
Opis
ArcName, FileName, PackSize, UnpSize zawierają odpowiednio nazwę archiwum, nazwę pliku w archiwum, rozmiar pliku po spakowaniu i rozmiar pliku po rozpakowaniu.
HostOS zapewnia zgodność tylko z plikiem unrar.dll i powinien być ustawiony na zero.
FileCRC to 32-bitowa suma kontrolna CRC (cykliczna kontrola nadmiarowa) pliku. Jeśli nie jest dostępny, ustaw na zero.
Wartości Cmt* można używać do przesyłania informacji o komentarzach do pliku. Nie są one obecnie używane w Total Commander, więc można je ustawić na zero.
FileAttr można ustawić na dowolną kombinację następujących wartości:
Wartość Opis
0x1 Plik tylko do odczytu
0x2 Ukryty plik
0x4 Plik systemowy
0x8 Plik identyfikacyjny woluminu
0x10 informator katalogu
0x20 Plik archiwum
0x3F Dowolny plik
FileTime zawiera datę i godzinę ostatniej aktualizacji pliku. Aby ustawić wartość, użyj następującego algorytmu:
FileTime = (rok - 1980) << 25 | miesiąc << 21 | dzień << 16 | godzina << 11 | minuta << 5 | sekunda/2;
Upewnij się, że:
rok jest w formacie czterocyfrowym pomiędzy 1980 a 2100
miesiąc to liczba z zakresu od 1 do 12
godzina jest w formacie 24-godzinnym
tHeaderDataEx to struktura używana w ReadHeaderEx.
typedef struct {
char ArcName[1024];
char FileName[1024];
int Flags;
unsigned int PackSize;
unsigned int PackSizeHigh;
unsigned int UnpSize;
unsigned int UnpSizeHigh;
int HostOS;
int FileCRC;
int FileTime;
int UnpVer;
int Method;
int FileAttr;
char* CmtBuf;
int CmtBufSize;
int CmtSize;
int CmtState;
char Reserved[1024];
} tHeaderDataEx;
Opis
ArcName, FileName, PackSize, UnpSize zawierają odpowiednio nazwę archiwum, nazwę pliku w archiwum, rozmiar pliku po spakowaniu i rozmiar pliku po rozpakowaniu. PackSizeHigh, UnpSizeHigh zawierają górne 32 bity z 64-bitowej liczby rozmiaru. Ustaw na 0, jeśli plik jest mniejszy niż 4 GB.
HostOS zapewnia zgodność tylko z plikiem unrar.dll i powinien być ustawiony na zero.
FileCRC to 32-bitowa suma kontrolna CRC (cykliczna kontrola nadmiarowa) pliku. Jeśli nie jest dostępny, ustaw na zero.
Wartości Cmt* można używać do przesyłania informacji o komentarzach do pliku. Nie są one obecnie używane w Total Commander, więc można je ustawić na zero.
FileAttr można ustawić na dowolną kombinację następujących wartości:
Wartość Opis
0x1 Plik tylko do odczytu
0x2 Ukryty plik
0x4 Plik systemowy
0x8 Plik identyfikacyjny woluminu
0x10 informator katalogu
0x20 Plik archiwum
0x3F Dowolny plik
FileTime zawiera datę i godzinę ostatniej aktualizacji pliku. Aby ustawić wartość, użyj następującego algorytmu:
FileTime = (rok - 1980) << 25 | miesiąc << 21 | dzień << 16 | godzina << 11 | minuta << 5 | sekunda/2;
Upewnij się, że:
rok jest w formacie czterocyfrowym pomiędzy 1980 a 2100
miesiąc to liczba z zakresu od 1 do 12
godzina jest w formacie 24-godzinnym
Rezerwacja może być w przyszłości wykorzystywana do przechowywania dodatkowych danych - na razie MUSISZ ustawić ją na 0, aby uniknąć problemów z przyszłymi wersjami TC.
Notatka:
Wersja tej struktury w formacie Unicode używa WCHAR[1024] dla ArcName i FileName. "Zarezerwowane" pozostaje bez zmian.
tOpenArchiveData jest używany w OpenArchive.
typedef struct {
char* ArcName;
int OpenMode;
int OpenResult;
char* CmtBuf;
int CmtBufSize;
int CmtSize;
int CmtState;
} tOpenArchiveData;
Opis
ArcName zawiera nazwę archiwum do otwarcia.
OpenMode jest ustawiona na jedną z następujących wartości:
Constant Value Opis
PK_OM_LIST 0 Otwórz plik tylko do odczytu nazw plików
PK_OM_EXTRACT 1 Otwórz plik do przetworzenia (wyciąg lub test)
OpenResult używany do zwracania jednej z error values, jeśli wystąpi błąd.
Zmienne Cmt* dotyczą komentarza do pliku. Obecnie nie są używane przez Total Commander, więc mogą być ustawione na NULL.
Nota:
Jeśli plik zostanie otwarty z OpenMode==PK_OM_LIST, ProcessFile nigdy nie zostanie wywołany przez Total Commander.
Wersja tej funkcji Unicode używa WCHAR* zamiast char* dla pól tekstowych.
PackDefaultParamStruct jest przekazywany do PackSetDefaultParams w celu poinformowania wtyczki o aktualnej wersji interfejsu wtyczki i lokalizacji pliku ini.
Deklaracja:
typedef struct {
int size;
DWORD PluginInterfaceVersionLow;
DWORD PluginInterfaceVersionHi;
char DefaultIniName[MAX_PATH];
} PackDefaultParamStruct;
Opis elementów struktury:
size Rozmiar struktury w bajtach. Późniejsze wersje interfejsu wtyczki mogą dodać więcej elementów struktury i odpowiednio dostosować to pole rozmiaru.
PluginInterfaceVersionLow Niska wartość wersji interfejsu wtyczki. To jest wartość po przecinku pomnożona przez 100! Przykład. W przypadku interfejsu wtyczki w wersji 2.1 najniższy DWORD to 10, a wysoki DWORD to 2.
PluginInterfaceVersionHi Wysoka wartość wersji interfejsu wtyczki.
DefaultIniName Sugerowana lokalizacja+nazwa pliku ini, w którym wtyczka może przechowywać swoje dane. Jest to w pełni kwalifikowana ścieżka + nazwa pliku, która będzie znajdować się w tym samym katalogu, co plik wincmd.ini. Zalecane jest przechowywanie danych wtyczki w tym pliku lub przynajmniej w tym katalogu, ponieważ katalog wtyczek lub katalog Windows może nie nadawać się do zapisu
tProcessDataProc to typedef funkcji powiadamiającej użytkownika o postępie rozpakowywania/pakowania plików.
typedef int (__stdcall *tProcessDataProc)(char *FileName, int Size);
Opis
SetProcessDataProc dostarczył wskaźnik do funkcji z tą deklaracją. Jeżeli chcesz powiadamiać użytkownika o postępie rozpakowywania plików, wywołaj tę funkcję z odpowiednimi parametrami. Sama funkcja jest częścią Totalcmd - określasz tylko, co Totalcmd ma wyświetlać. Dodatkowo Totalcmd wyświetla przycisk Anuluj, który pozwala użytkownikowi przerwać proces rozpakowywania/pakowania. Jeśli użytkownik kliknął Anuluj, funkcja zwraca zero.
FileName może służyć do przekazywania wskaźnika do aktualnie przetwarzanej nazwy pliku (ciąg zakończony 0) lub NULL, jeśli nie jest dostępny.
Ustaw Size na liczbę bajtów przetworzonych od poprzedniego wywołania funkcji. Dla wtyczek rozpakowanych w CloseArchive: Ustaw rozmiar na ujemną wartość procentową (-1..-100), aby bezpośrednio ustawić pierwszy słupek procentowy, -1000..-1100 dla drugiego słupka procentowego (-1000=0%).
Notatka
Słowo kluczowe lub stała __stdcall muszą być ustawione zgodnie z kompilatorem, którego będziesz używać do tworzenia biblioteki. Na przykład jest to STDCALL dla cygwin i __stdcall dla MSC.
tChangeVolProc jest typem def funkcji, która prosi użytkownika o zmianę głośności.
typedef int (__stdcall *tChangeVolProc)(char *ArcName, int Mode);
Opis
SetChangeVolProc dostarczył wskaźnik do funkcji z tą deklaracją. Jeżeli chcesz, aby użytkownik był pytany o zmianę głośności, wywołaj tę funkcję z odpowiednimi parametrami. Sama funkcja jest częścią Totalcmd - podajesz tylko pytanie. Następnie Totalcmd zadaje pytanie użytkownikowi, a odpowiedź otrzymasz w wyniku wywołania tej funkcji. Jeżeli użytkownik przerwał operację, funkcja zwraca zero.
ArcName określa nazwę pliku przetwarzanego archiwum i otrzyma nazwę następnego woluminu.
Ustaw Mode na jedną z następujących wartości, w zależności od tego, o co Totalcmd ma zapytać użytkownika:
Constant Wartość Opis
PK_VOL_ASK 0 Zapytaj użytkownika o lokalizację następnego tomu
PK_VOL_NOTIFY 1 Powiadom aplikację, że następny tom zostanie rozpakowany
Notatka:
Słowo kluczowe lub stała __stdcall muszą być ustawione zgodnie z kompilatorem, którego będziesz używać do tworzenia biblioteki. Na przykład jest to STDCALL dla cygwin i __stdcall dla MSC.
PkCryptProc to funkcja wywołania zwrotnego, którą wtyczka może wywołać w celu przechowywania haseł w bezpiecznym magazynie haseł, odczytywania ich lub kopiowania do nowego połączenia.
Deklaracja:
int __stdcall PkCryptProc(int CryptoNumber, int mode, char* ArchiveName, char* Password, int maxlen);
Opis parametrów:
CryptoNumber Tutaj wtyczka musi przekazać numer kryptograficzny otrzymany przez funkcję PkSetCryptCallback.
mode Tryb działania:
- PK_CRYPT_SAVE_PASSWORD: Zapisz hasło w magazynie haseł
- PK_CRYPT_LOAD_PASSWORD: Załaduj hasło z magazynu haseł
- PK_CRYPT_LOAD_PASSWORD_NO_UI: Załaduj hasło tylko wtedy, gdy zostało już wprowadzone hasło główne
- PK_CRYPT_COPY_PASSWORD: Skopiuj hasło do nowego połączenia. Tutaj drugi parametr ciągu „Hasło” nie jest hasłem, ale nazwą docelowej nazwy archiwum
- PK_CRYPT_MOVE_PASSWORD: Jak wyżej, ale usuń hasło źródłowe
- PK_CRYPT_DELETE_PASSWORD: Usuń hasło do podanej nazwy archiwum
Password Specyficzne dla operacji, zwykle hasło do przechowywania/odzyskania lub nazwa docelowa podczas kopiowania/przenoszenia połączenia
maxlen Maksymalna długość (w znakach), jaką bufor haseł może przechowywać podczas wywoływania jednej z funkcji ładowania
Wartość zwracana:
Total Commander zwraca jedną z następujących wartości:
FS_FILE_OK Sukces
E_ECREATE Szyfrowanie/odszyfrowywanie nie powiodło się
E_EWRITE Nie można zapisać hasła w magazynie haseł
E_EREAD Nie znaleziono hasła w magazynie haseł
E_NO_FILES Nie wprowadzono jeszcze hasła głównego
Notatka:
Pokazując szczegóły istniejącego archiwum, należy najpierw wywołać PK_CRYPT_LOAD_PASSWORD_NO_UI. W przypadku błędu E_NO_FILES pokaż przycisk „Edytuj hasło”. Wywołuj PK_CRYPT_LOAD_PASSWORD tylko wtedy, gdy użytkownik kliknie ten przycisk lub spróbuje odszyfrować archiwum. W ten sposób użytkownik nie musi wpisywać hasła głównego, jeśli chce tylko dokonać innych zmian w ustawieniach archiwum.
/* Zawartość pliku wcxhead.h */
/* Zawiera definicje kodów błędów, flag i wywołań zwrotnych */
/* Kody błędów zwracane do aplikacji wywołującej */
#define E_END_ARCHIVE 10 /* Nie ma więcej plików w archiwum */
#define E_NO_MEMORY 11 /* Not enough memory */
#define E_BAD_DATA 12 /* Błąd CRC w danych aktualnie rozpakowanego pliku */
#define E_BAD_ARCHIVE 13 /* Archiwum jako całość jest złe, np. uszkodzone nagłówki */
#define E_UNKNOWN_FORMAT 14 /* Format archiwum nieznany */
#define E_EOPEN 15 /* Nie można otworzyć istniejącego pliku */
#define E_ECREATE 16 /* Nie można utworzyć pliku */
#define E_ECLOSE 17 /* Błąd zamknięcia pliku */
#define E_EREAD 18 /* Błąd odczytu z pliku */
#define E_EWRITE 19 /* Błąd podczas zapisywania do pliku */
#define E_SMALL_BUF 20 /* Bufor za mały */
#define E_EABORTED 21 /* Funkcja przerwana przez użytkownika */
#define E_NO_FILES 22 /* Nie znaleziono plików */
#define E_TOO_MANY_FILES 23 /* Zbyt wiele plików do spakowania */
#define E_NOT_SUPPORTED 24 /* Funkcja nie jest obsługiwana */
/* flagi do rozpakowania */
#define PK_OM_LIST 0
#define PK_OM_EXTRACT 1
/* flagi dla ProcessFile */
#define PK_SKIP 0 /* Pomiń ten plik */
#define PK_TEST 1 /* Testowanie integralności pliku */
#define PK_EXTRACT 2 /* Wyodrębnianie na dysk */
/* Flagi przekazywane przez ChangeVolProc */
#define PK_VOL_ASK 0 /* Zapytaj użytkownika o lokalizację następnego woluminu */
#define PK_VOL_NOTIFY 1 /* Powiadom aplikację, że następny tom zostanie rozpakowany */
/* Flagi do pakowania */
/* Dla PackFiles */
#define PK_PACK_MOVE_FILES 1 /* Usuń oryginał po spakowaniu */
#define PK_PACK_SAVE_PATHS 2 /* Zapisywanie nazw ścieżek plików */
#define PK_PACK_ENCRYPT 4 /* Zapytaj użytkownika o hasło, a następnie zaszyfruj */
/* Zwrócone przez GetPackCaps */
#define PK_CAPS_NEW 1 /* Może tworzyć nowe archiwa */
#define PK_CAPS_MODIFY 2 /* Może modyfikować istniejące archiwa */
#define PK_CAPS_MULTIPLE 4 /* Archiwum może zawierać wiele plików */
#define PK_CAPS_DELETE 8 /* Może usuwać pliki */
#define PK_CAPS_OPTIONS 16 /* Posiada okno dialogowe opcji */
#define PK_CAPS_MEMPACK 32 /* Obsługuje pakowanie w pamięci */
#define PK_CAPS_BY_CONTENT 64 /* Wykrywanie typu archiwum według zawartości */
#define PK_CAPS_SEARCHTEXT 128 /* Zezwalaj na wyszukiwanie tekstu w archiwach */
/* utworzone za pomocą tej wtyczki} */
#define PK_CAPS_HIDE 256 /* Pokaż jako normalne pliki (ukryj paker */
/* ikonę), otwórz za pomocą Ctrl+PgDn, a nie Enter */
#define PK_CAPS_ENCRYPT 512 /* Wtyczka obsługuje PK_PACK_ENCRYPT opcję */
#define BACKGROUND_UNPACK 1 /* Które operacje są bezpieczne dla wątków? */
#define BACKGROUND_PACK 2
#define BACKGROUND_MEMPACK 4
/* Flagi do pakowania w pamięci */
#define MEM_OPTIONS_WANTHEADERS 1 /* Zwróć nagłówki archiwum z spakowanymi danymi */
/* Błędy zwrócone przez PackToMem */
#define MEMPACK_OK 0 /* Wywołanie funkcji zakończyło się OK, ale jest więcej danych */
#define MEMPACK_DONE 1 /* Wywołanie funkcji zakończone OK, nie ma więcej danych */
#define PK_CRYPT_SAVE_PASSWORD 1
#define PK_CRYPT_LOAD_PASSWORD 2
#define PK_CRYPT_LOAD_PASSWORD_NO_UI 3 // Załaduj hasło tylko wtedy, gdy hasło główne zostało już wprowadzone!
#define PK_CRYPT_COPY_PASSWORD 4 // Skopiuj zaszyfrowane hasło do nowej nazwy archiwum
#define PK_CRYPT_MOVE_PASSWORD 5 // Przenoszenie hasła podczas zmiany nazwy archiwum
#define PK_CRYPT_DELETE_PASSWORD 6 // Usuń hasło
#define PK_CRYPTOPT_MASTERPASS_SET 1 // Użytkownik ma już zdefiniowane hasło główne
typedef struct {
char ArcName[260];
char FileName[260];
int Flags;
int PackSize;
int UnpSize;
int HostOS;
int FileCRC;
int FileTime;
int UnpVer;
int Method;
int FileAttr;
char* CmtBuf;
int CmtBufSize;
int CmtSize;
int CmtState;
} tHeaderData;
typedef struct {
char ArcName[1024];
char FileName[1024];
int Flags;
unsigned int PackSize;
unsigned int PackSizeHigh;
unsigned int UnpSize;
unsigned int UnpSizeHigh;
int HostOS;
int FileCRC;
int FileTime;
int UnpVer;
int Method;
int FileAttr;
char* CmtBuf;
int CmtBufSize;
int CmtSize;
int CmtState;
char Reserved[1024];
} tHeaderDataEx;
typedef struct {
WCHAR ArcName[1024];
WCHAR FileName[1024];
int Flags;
unsigned int PackSize;
unsigned int PackSizeHigh;
unsigned int UnpSize;
unsigned int UnpSizeHigh;
int HostOS;
int FileCRC;
int FileTime;
int UnpVer;
int Method;
int FileAttr;
char* CmtBuf;
int CmtBufSize;
int CmtSize;
int CmtState;
char Reserved[1024];
} tHeaderDataExW;
typedef struct {
char* ArcName;
int OpenMode;
int OpenResult;
char* CmtBuf;
int CmtBufSize;
int CmtSize;
int CmtState;
} tOpenArchiveData;
typedef struct {
WCHAR* ArcName;
int OpenMode;
int OpenResult;
WCHAR* CmtBuf;
int CmtBufSize;
int CmtSize;
int CmtState;
} tOpenArchiveDataW;
typedef struct {
int size;
DWORD PluginInterfaceVersionLow;
DWORD PluginInterfaceVersionHi;
char DefaultIniName[MAX_PATH];
} PackDefaultParamStruct;
/* Definicja funkcji wywołania zwrotnego wywoływanych przez bibliotekę DLL
Poproś o zamianę dysku na archiwum z wieloma woluminami */
typedef int (__stdcall *tChangeVolProc)(char *ArcName,int Mode);
typedef int (__stdcall *tChangeVolProcW)(WCHAR *ArcName,int Mode);
/* Powiadamiaj, że dane są przetwarzane — używane w oknie dialogowym postępu */
typedef int (__stdcall *tProcessDataProc)(char *FileName,int Size);
typedef int (__stdcall *tProcessDataProcW)(WCHAR *FileName,int Size);
typedef int (__stdcall *tPkCryptProc)(int CryptoNr,int Mode,
char* ArchiveName,char* Password,int maxlen);
typedef int (__stdcall *tPkCryptProcW)(int CryptoNr,int Mode,
WCHAR* ArchiveName,WCHAR* Password,int maxlen);
- www.ghisler.ch/wiki/index.php?title=Packer_plugins_developer_guide
- www.ghisler.ch/wiki/index.php?title=Plugins_source_examples
...
Wtyczki systemu plików pojawią się w Otoczeniu sieciowym, a nie w nowym systemie plików. Zaleca się, aby jako punkt wyjścia użyć źródła istniejącej wtyczki.
Minimalne funkcje potrzebne wtyczce tylko do odczytu (przeglądania) to:
FsInit Zainicjuj wtyczkę i przekaż do niej funkcje wywołania zwrotnego
FsFindFirst Pobierz pierwszy plik w katalogu
FsFindNext Pobierz następny plik w katalogu
FsFindClose Zamknij uchwyt wyszukiwania
Poniższe opcjonalne funkcje pozwalają na manipulację pojedynczymi plikami. Jeśli go nie zaimplementujesz, NIE dodawaj go jako pustej funkcji! Total Commander będzie próbował załadować te funkcje jedna po drugiej i wywołać tylko te, które zaimplementowałeś.
FsGetDefRootName Pyta wtyczkę o nazwę folderu głównego pokazanego w Otoczeniu sieciowym. Jeśli nie zostanie zaimplementowany, Totalcmd użyje nazwy biblioteki DLL (bez rozszerzenia).
FsGetFile Pobierz plik z systemu plików wtyczki na dysk lokalny
FsPutFile Prześlij plik z dysku lokalnego do systemu plików wtyczki
FsRenMovFile Skopiuj, zmień nazwę lub przenieś plik w systemie plików wtyczek
FsDeleteFile Usuń plik w systemie plików wtyczki
FsRemoveDir Usuń katalog w systemie plików wtyczki
FsMkDir Utwórz nowy katalog w systemie plików wtyczek
FsExecuteFile Wykonaj polecenie lub uruchom plik w systemie plików wtyczki lub pokaż właściwości
FsSetAttr Ustawia atrybuty pliku lub katalogu
FsSetTime Ustawia czasy plików
FsDisconnect Dla systemów plików wymagających połączenia: Użytkownik nacisnął przycisk rozłączania
FsExtractCustomIcon Wyodrębnij ikonę listy plików
FsStatusInfo Informuje wtyczkę o rozpoczęciu lub zakończeniu operacji (czysto informacyjnie)
FsGetPreviewBitmap Zwraca mapę bitową dla widoku miniatur
FsLinksToLocalFiles Ta funkcja jest potrzebna tylko podczas implementowania wtyczki panelu tymczasowego
FsGetLocalName Zobacz FsLinksToLocalFiles
FsContent* Funkcje te są prawie identyczne z funkcjami Content* interfejsu wtyczki treści
FsGetBackgroundFlags Umożliwia obsługę przesyłania i pobierania w tle (oddzielny wątek)
Istnieją również 3 funkcje wywołania zwrotnego, które wtyczka może wywołać:
ProgressProc Wywołaj tę opcję, aby wskazać postęp w procentach pojedynczej operacji kopiowania
LogProc Wywołaj, aby dodać informacje do pliku dziennika i wyświetlić pasek narzędzi FTP
RequestProc Żądanie danych wejściowych od użytkownika, np.: nazwę użytkownika, hasło itp.
Jak to działa:
Kiedy użytkownik instaluje wtyczkę w Total Commander, wtyczka jest ładowana i wywoływana jest funkcja GetDefRootName bez wcześniejszego wywołania funkcji FsInit . Zwrócona nazwa zostanie zapisana w pliku wincmd.ini. Następnie wtyczka zostanie wyładowana. Kiedy użytkownik wejdzie do Otoczenia sieciowego, Totalcmd wyliczy wszystkie wtyczki wymienione w wincmd.ini bez ładowania wtyczek! Wtyczka zostanie załadowana dopiero wtedy, gdy użytkownik spróbuje wejść do katalogu głównego wtyczki. Możliwe jest również, że użytkownik przeskoczy bezpośrednio do podkatalogu wtyczki, korzystając z funkcji 'hotlisty katalogów' lub 'historii katalogów' w Totalcmd.
Po załadowaniu wtyczki Totalcmd próbuje uzyskać adresy powyższych funkcji. Jeśli którakolwiek z minimalnych funkcji nie jest zaimplementowana, załadowanie wtyczki nie powiedzie się. Jeżeli brakuje którejkolwiek z opcjonalnych funkcji, wczytanie zakończy się pomyślnie, ale funkcje (np. usunięcie) nie będą dostępne dla użytkownika. Po pobraniu adresów funkcji Totalcmd wywoła FsInit , aby poinformować wtyczkę o swoim numerze i adresach funkcji wywołania zwrotnego.
Framework (Total Commander) odświeży listę plików za każdym razem, gdy użytkownik wejdzie do dowolnego katalogu w systemie plików wtyczki. Ta sama procedura zostanie wykonana również, jeśli framework będzie chciał pracować z podkatalogami, np. podczas kopiowania/przenoszenia/usuwania plików w podkatalogu wybranym przez użytkownika. Odbywa się to poprzez rekurencyjne wywoływanie funkcji FsFindFirst()...FsFindNext()...FsFindClose() dla każdego katalogu napotkanego w drzewie. W tym tekście system ten będzie nazywany FNC (znajdź pierwszy-następny-zamknij).
W przypadku katalogu głównego wtyczki Totalcmd wywołuje funkcję FsFindFirst() z parametrem Path ustawionym na "\". Wtyczka powinna zwrócić wszystkie elementy w katalogu głównym, np. litery dysków zdalnej maszyny, dostępne systemy plików itp. Gdy zwrócony element ma ustawioną flagę katalogu, Totalcmd użyje tej nazwy do zbudowania ścieżki do podkatalogu. Podkatalogi buduje się poprzez łączenie zwróconych nazw katalogów oddzielonych odwrotnymi ukośnikami, np. \dysk1\c:\jakiś\podkatalog
Podczas pobierania lub zdalnego kopiowania całych drzew katalogów framework wykonuje pełną pętlę FNC podkatalogu i przechowuje pliki na wewnętrznej liście. Następnie sprawdza listę pod kątem plików i kopiuje te pliki, a w drugiej pętli sprawdza listę pod kątem katalogów, a jeśli je napotka, rekurencyjnie kopiuje podkatalogi. Pozwala to na rekurencyjne kopiowanie całego drzewa.
Do zliczania plików w podkatalogach i do usuwania plików potrzebnych jest wiele uchwytów otwartych plików. Dlatego powinieneś zainicjować tymczasową strukturę za każdym razem, gdy wywoływana jest funkcja FsFindFirst(), zwrócić jej uchwyt (wskaźnik) do struktury i usunąć ją w funkcji FsFindClose(), używając tego samego uchwytu, który jest teraz zwracany. Ważne jest, aby wiedzieć, że jednocześnie może być wiele otwartych uchwytów wyszukiwania, chociaż należy zachować szczególną ostrożność, aby tego uniknąć.
Niektóre funkcje frameworka mogą w razie potrzeby wywoływać inne funkcje - na przykład FsRemoveDir() jest wywoływana podczas przenoszenia plików w celu usunięcia niepotrzebnych już katalogów.
Oto kilka przypadków, w których NIE MOŻNA polegać na tym, że FNC zostanie wywołane (ponieważ zostało już wywołane wcześniej): - podczas kopiowania niektórych plików w aktualnie aktywnym katalogu i nie wybrano żadnych katalogów do kopiowania - podczas przeglądania pliku za pomocą klawisza F3
Jeśli zaimplementowano FsStatusInfo, wtyczka będzie informowana o każdym rozpoczęciu i zakończeniu operacji. Żadne funkcje wtyczki z wyjątkiem FsInit i FsDisconnect nie zostaną wywołane bez otaczającej pary wywołań FsStatusInfo .
Zdecydowanie zaleca się rozpoczęcie od istniejącego źródła wtyczki i jego modyfikację, np. z bardzo prostym źródłem próbek fplugin. Następnie najpierw zaimplementuj FsInit, FsFindFirst, FsFindNext i FsFindClose, aby przeglądać system plików. Gdy to zadziała, możesz dodać inne funkcje, aby dodać takie funkcje, jak przesyłanie i pobieranie.
FsInit jest wywoływany podczas ładowania wtyczki. Przekazane wartości należy zapisać we wtyczce do późniejszego wykorzystania.
Deklaracja:
int __stdcall FsInit(int PluginNr, tProgressProc pProgressProc, tLogProc pLogProc, tRequestProc pRequestProc);
Opis parametrów:
PluginNr Numer wewnętrzny tej wtyczki został nadany w Total Commander. Musi zostać przekazany jako pierwszy parametr we wszystkich funkcjach wywołania zwrotnego, aby Totalcmd wiedział, która wtyczka wysłała żądanie.
pProgressProc Wskaźnik do funkcji wywołania zwrotnego postępu.
pLogProc Wskaźnik do funkcji rejestrowania
pRequestProc Wskaźnik do tekstu żądania proc
Wartość zwracana:
Zwracana wartość jest obecnie nieużywana. Powinieneś zwrócić 0, jeśli się powiedzie.
Uwagi:
FsInit NIE jest wywoływany, gdy użytkownik po raz pierwszy instaluje wtyczkę. W tym przypadku wywoływany jest tylko plik FsGetDefRootName., a następnie biblioteka DLL wtyczki jest ponownie wyładowywana. Biblioteka DLL wtyczki jest ładowana, gdy użytkownik wejdzie do katalogu głównego wtyczki w Otoczeniu sieciowym.
FsFindFirst jest wywoływany w celu pobrania pierwszego pliku z katalogu systemu plików wtyczki.
Deklaracja:
HANDLE __stdcall FsFindFirst(char* Path, WIN32_FIND_DATA *FindData);
Opis parametrów:
Ścieżka
- Pełna ścieżka do katalogu, dla którego należy pobrać listę katalogów. Ważne: do wtyczki nie są przekazywane żadne symbole wieloznaczne! Wszystkie separatory będą ukośnikami odwrotnymi, więc będziesz musiał je przekonwertować na ukośniki do przodu, jeśli Twój system plików ich używa!
- Jako root do wtyczki przekazywany jest pojedynczy ukośnik odwrotny. Elementy główne pojawiają się w katalogu podstawowym wtyczki pobranym przez FsGetDefRootName w czasie instalacji. Ta domyślna nazwa root NIE jest częścią ścieżki przekazywanej do wtyczki!
- Wszystkie podkatalogi są zbudowane z nazw katalogów, które wtyczka zwraca poprzez FsFindFirst i FsFindNext, oddzielonych pojedynczymi ukośnikami odwrotnymi, np.
FindData
- Standardowa struktura WIN32_FIND_DATA zdefiniowana w Windows SDK, która zawiera szczegóły pliku lub katalogu. Użyj pola dwFileAttributes ustawionego na FILE_ATTRIBUTE_DIRECTORY, aby odróżnić pliki od katalogów. W systemach Unix możesz | (lub) pole dwFileAttributes z wartością 0x80000000 i ustaw parametr dwReserved0 na tryb pliku Unix (uprawnienia).
Zwróć INVALID_HANDLE_VALUE (==-1, nie zero!), jeśli wystąpi błąd, lub wybraną liczbę, jeśli nie. Zalecane jest przekazanie wskaźnika do struktury wewnętrznej w postaci tego uchwytu, który przechowuje aktualny stan wyszukiwania. Umożliwi to rekurencyjne przeszukiwanie katalogów potrzebne do kopiowania całych drzew. Ten uchwyt zostanie przekazany do FsFindNext() przez program wywołujący.
Gdy wystąpi błąd, wywołaj SetLastError() , aby ustawić przyczynę błędu. Total Commander sprawdza następujące dwa błędy:
- ERROR_NO_MORE_FILES: Katalog istnieje, ale jest pusty (Totalcmd może go otworzyć, np. aby skopiować do niego pliki)
- Każdy inny błąd: Katalog nie istnieje i Total Commander nie będzie próbował go otworzyć.
1. FsFindFirst można wywołać bezpośrednio z podkatalogiem wtyczki! Nie można polegać na tym, że zostanie wywołany z rootem \ po załadowaniu. Powód: Użytkownicy mogli zapisać podkatalog wtyczki na gorącej liście katalogów Ctrl+D w poprzedniej sesji z wtyczką.
2. "Ścieżka" może mieć długość do 259 (MAX_PATH-1) znaków, gdy nie jest zaimplementowana funkcja FsFindFirstW i do 1023 znaków, gdy zaimplementowano funkcję FsFindFirstW (również w wersji ANSI)! Nie obejmuje to końcowego znaku 0.
Zobacz także: FsFindNext, FsFindClose
FsFindNext jest wywoływany w celu pobrania następnego pliku w katalogu systemu plików wtyczki.
Deklaracja:
BOOL __stdcall FsFindNext(HANDLE Hdl, WIN32_FIND_DATA *FindData);
Opis parametrów:
Hdl Uchwyt wyszukiwania zwrócony przez FsFindFirst.
FindData
- Standardowa struktura WIN32_FIND_DATA zdefiniowana w Windows SDK, która zawiera szczegóły pliku lub katalogu. Użyj pola dwFileAttributes ustawionego na FILE_ATTRIBUTE_DIRECTORY, aby odróżnić pliki od katalogów. W systemach Unix możesz | (lub) pole dwFileAttributes z wartością 0x80000000 i ustaw parametr
dwReserved0na tryb pliku Unix (uprawnienia).
- Standardowa struktura WIN32_FIND_DATA zdefiniowana w Windows SDK, która zawiera szczegóły pliku lub katalogu. Użyj pola dwFileAttributes ustawionego na FILE_ATTRIBUTE_DIRECTORY, aby odróżnić pliki od katalogów. W systemach Unix możesz | (lub) pole dwFileAttributes z wartością 0x80000000 i ustaw parametr
Zwróć FALSE, jeśli wystąpi błąd lub jeśli nie ma więcej plików, lub PRAWDA w przeciwnym razie. Funkcja SetLastError() nie musi być wywoływana.
Zobacz także: FsFindFirst, FsFindClose
FsSetCryptCallback jest wywoływany podczas ładowania wtyczki. Przekazane wartości należy zapisać we wtyczce do późniejszego wykorzystania. Ta funkcja jest potrzebna tylko wtedy, gdy chcesz używać bezpiecznego magazynu haseł w Total Commander.
Deklaracja:
void __stdcall FsSetCryptCallback(tCryptProc pCryptProc,int CryptoNr,int Flags);
Opis parametrów:
pCryptProc Wskaźnik do funkcji wywołania zwrotnego kryptowalut. Zobacz CryptProc, aby zapoznać się z opisem tej funkcji
CryptoNr Parametr, który należy przekazać do funkcji wywołania zwrotnego
Flagi Flagi dotyczące połączenia kryptograficznego. Obecnie zdefiniowano tylko FS_CRYPTOPT_MASTERPASS_SET. Jest ustawiane, gdy użytkownik zdefiniował hasło główne.
Wartość zwracana:
Ta funkcja nie zwraca żadnej wartości.
Uwagi:
Możesz użyć tej funkcji wywołania zwrotnego do przechowywania haseł w bezpiecznym magazynie haseł Total Commander. Użytkownik zostanie automatycznie poproszony o podanie hasła głównego.
FsGetDefRootName jest wywoływany tylko wtedy, gdy wtyczka jest zainstalowana. Prosi wtyczkę o domyślną nazwę root, która powinna pojawić się w otoczeniu sieciowym. Ta nazwa główna NIE jest częścią ścieżki przekazywanej do wtyczki, gdy Totalcmd uzyskuje dostęp do systemu plików wtyczki! Katalogiem głównym będzie zawsze „\”, a wszystkie podścieżki zostaną zbudowane z nazw katalogów zwróconych przez wtyczkę.
Przykład: nazwa główna może brzmieć „System plików Linux” dla wtyczki uzyskującej dostęp do dysków Linux. Jeśli ta funkcja nie jest zaimplementowana, Totalcmd zasugeruje nazwę biblioteki DLL (bez rozszerzenia .DLL) jako katalog główny wtyczki. Funkcja ta jest wywoływana bezpośrednio po załadowaniu wtyczki (gdy użytkownik ją instaluje), funkcja FsInit() NIE jest wywoływana podczas instalacji wtyczki.
Deklaracja:
void __stdcall FsGetDefRootName(char* DefRootName, int maxlen);
Opis parametrów:
DefRootName Wskaźnik do bufora (przydzielonego przez program wywołujący), który może otrzymać nazwę główną.
maxlen Maksymalna liczba znaków (łącznie z końcowym 0), które mieszczą się w buforze.
Wartość zwracana:
Nic.
Zobacz też: FsFindFirst, FsFindNext
FsGetFile jest wywoływany w celu przesłania pliku z systemu plików wtyczki do normalnego systemu plików (litery dysków lub UNC).
Deklaracja:
int __stdcall FsGetFile(char* RemoteName, char* LocalName, int CopyFlags, RemoteInfoStruct* ri);
Opis parametrów:
RemoteName Nazwa pliku do pobrania, z pełną ścieżką. Nazwa zawsze zaczyna się od ukośnika odwrotnego, a następnie nazwy zwracane przez FsFindFirst/FsFindNext oddzielane są odwrotnymi ukośnikami.
LocalName Nazwa pliku lokalnego z pełną ścieżką, z literą dysku lub ścieżką UNC (\\Server\Share\nazwa pliku). Wtyczka może zmienić NAZWĘ/ROZSZERZENIE pliku (np. po zakończeniu konwersji pliku), ale nie ścieżkę!
CopyFlags Może być kombinacją następujących trzech flag: FS_COPYFLAGS_OVERWRITE: Jeśli ustawione, zastąp dowolny istniejący plik bez pytania. Jeśli nie jest ustawiony, po prostu nie uda się kopiować. FS_COPYFLAGS_RESUME: Wznów przerwany lub nieudany transfer. FS_COPYFLAGS_MOVE: Po przesłaniu wtyczka musi usunąć zdalny plik Poniżej znajdziesz ważne uwagi!
ri Ten parametr zawiera informacje o zdalnym pliku, który został wcześniej pobrany za pomocą FsFindFirst/FsFindNext: rozmiar, data/godzina i atrybuty pliku zdalnego. Może być przydatne do skopiowania atrybutów z plikiem i do wyświetlenia okna dialogowego postępu.
Wartość zwracana:
Zwróć jedną z następujących wartości:
FS_FILE_OK Plik został skopiowany OK
FS_FILE_EXISTS Plik lokalny już istnieje i wznowienie nie jest obsługiwane
FS_FILE_NOTFOUND Nie można znaleźć lub otworzyć pliku zdalnego.
FS_FILE_READERROR Wystąpił błąd podczas odczytu ze zdalnego pliku
FS_FILE_WRITEERROR Wystąpił błąd podczas zapisu do pliku lokalnego, np. Dysk jest pełny
FS_FILE_USERABORT Kopiowanie zostało przerwane przez użytkownika (poprzez ProgressProc)
FS_FILE_NOTSUPPORTED Operacja nie jest obsługiwana (np. wznowienie)
FS_FILE_EXISTSRESUMEALLOWED Plik lokalny już istnieje i obsługiwane jest wznowienie
Ważne notatki
Total Commander zwykle wywołuje tę funkcję dwukrotnie:
- - raz z CopyFlags==0 lub CopyFlags==FS_COPYFLAGS_MOVE. Jeśli plik lokalny istnieje i obsługiwane jest wznawianie, zwróć FS_FILE_EXISTSRESUMEALLOWED. Jeśli wznowienie nie jest dozwolone, zwróć FS_FILE_EXISTS
- - drugi raz z FS_COPYFLAGS_RESUME lub FS_COPYFLAGS_OVERWRITE w zależności od wyboru użytkownika. Opcja wznowienia jest oferowana użytkownikowi tylko wtedy, gdy przy pierwszym wywołaniu zwrócono FS_FILE_EXISTSRESUMEALLOWED.
- - FS_COPYFLAGS_EXISTS_SAMECASE i FS_COPYFLAGS_EXISTS_DIFFERENTCASE NIGDY nie są przekazywane do tej funkcji, ponieważ wtyczka może łatwo określić, czy plik lokalny istnieje, czy nie.
- - Ustawiono FS_COPYFLAGS_MOVE, wtyczka musi usunąć zdalny plik po pomyślnym pobraniu.
FsPutFile jest wywoływany w celu przesłania pliku z normalnego systemu plików (litery dysków lub UNC) do systemu plików wtyczki.
Deklaracja:
int __stdcall FsPutFile(char* LocalName,char* RemoteName,int CopyFlags);
Opis parametrów:
LocalName Nazwa pliku lokalnego z pełną ścieżką, z literą dysku lub ścieżką UNC (\\Server\Share\nazwa pliku). Plik ten należy załadować do systemu plików wtyczki.
RemoteName Nazwa pliku zdalnego z pełną ścieżką. Nazwa zawsze zaczyna się od ukośnika odwrotnego, a następnie nazwy zwracane przez FsFindFirst/FsFindNext oddzielane są odwrotnymi ukośnikami. Wtyczka może zmienić NAZWĘ/ROZSZERZENIE pliku (np. po zakończeniu konwersji pliku), ale nie ścieżkę!
CopyFlags Może być kombinacją flag FS_COPYFLAGS_xxx
- FS_COPYFLAGS_OVERWRITE: Jeśli ustawione, zastąp dowolny istniejący plik bez pytania. Jeśli nie jest ustawiony, po prostu nie uda się kopiować.
- FS_COPYFLAGS_RESUME: Wznów przerwany lub nieudany transfer.
- FS_COPYFLAGS_MOVE: Po przesłaniu wtyczka musi usunąć plik lokalny
- FS_COPYFLAGS_EXISTS_SAMECASE: Wskazówka od programu wywołującego: Plik zdalny istnieje i ma takie same litery (duże/małe) jak plik lokalny.
- FS_COPYFLAGS_EXISTS_DIFFERENTCASE: Wskazówka od programu wywołującego: Plik zdalny istnieje i ma inną wielkość liter (duże/małe) niż plik lokalny.
- Poniżej znajdziesz ważne uwagi!
Zwróć jedną z następujących wartości:
FS_FILE_OK Plik został skopiowany OK
FS_FILE_EXISTS Plik zdalny już istnieje i wznowienie nie jest obsługiwane
FS_FILE_NOTFOUND Nie można znaleźć lub otworzyć pliku lokalnego.
FS_FILE_READERROR Wystąpił błąd podczas odczytu z pliku lokalnego
FS_FILE_WRITEERROR Wystąpił błąd podczas zapisu do pliku zdalnego, np. Dysk jest pełny
FS_FILE_USERABORT Kopiowanie zostało przerwane przez użytkownika (poprzez ProgressProc)
FS_FILE_NOTSUPPORTED Operacja nie jest obsługiwana (np. wznowienie)
FS_FILE_EXISTSRESUMEALLOWED Plik zdalny już istnieje i obsługiwane jest wznowienie
Ważne notatki
Total Commander zwykle wywołuje tę funkcję dwukrotnie, z następującymi parametrami w CopyFlags:
- - raz bez ustawionego FS_COPYFLAGS_RESUME ani FS_COPYFLAGS_OVERWRITE. Jeśli plik zdalny istnieje i wznowienie jest obsługiwane, zwróć FS_FILE_EXISTSRESUMEALLOWED. Jeśli wznowienie nie jest dozwolone, zwróć FS_FILE_EXISTS
- - drugi raz z FS_COPYFLAGS_RESUME lub FS_COPYFLAGS_OVERWRITE w zależności od wyboru użytkownika. Opcja wznowienia jest oferowana użytkownikowi tylko wtedy, gdy przy pierwszym wywołaniu zwrócono FS_FILE_EXISTSRESUMEALLOWED.
- - Flagi FS_COPYFLAGS_EXISTS_SAMECASE lub FS_COPYFLAGS_EXISTS_DIFFERENTCASE są dodawane do CopyFlags, gdy plik zdalny istnieje i wymaga nadpisania. To jest wskazówka dla wtyczki, aby umożliwić optymalizację: W zależności od typu wtyczki sprawdzanie serwera pod kątem każdego pojedynczego pliku podczas przesyłania może być bardzo powolne.
- - Jeśli ustawiona jest flaga FS_COPYFLAGS_MOVE, wtyczka musi usunąć plik lokalny po pomyślnym przesłaniu.
FsRenMovFile jest wywoływany w celu przesłania (skopiowania lub przeniesienia) pliku w systemie plików wtyczki.
Deklaracja:
int __stdcall FsRenMovFile(char* OldName, char* NewName, BOOL Move, BOOL OverWrite, RemoteInfoStruct* ri);
Opis parametrów:
OldName Nazwa zdalnego pliku źródłowego z pełną ścieżką. Nazwa zawsze zaczyna się od ukośnika odwrotnego, a następnie nazwy zwracane przez FsFindFirst/FsFindNext oddzielane są odwrotnymi ukośnikami.
NewName Nazwa zdalnego pliku docelowego z pełną ścieżką. Nazwa zawsze zaczyna się od ukośnika odwrotnego, a następnie nazwy zwracane przez FsFindFirst/FsFindNext oddzielane są odwrotnymi ukośnikami.
Move Jeśli ma wartość true, plik należy przenieść do nowej lokalizacji i nowej nazwy. Wiele systemów plików umożliwia zmianę nazwy/przeniesienie pliku bez przenoszenia jakichkolwiek danych, a jedynie wskaźnika do niego.
OverWrite Informuje funkcję, czy powinna zastąpić plik docelowy, czy nie. Zobacz uwagi poniżej dotyczące sposobu użycia tego parametru.
ri Struktura typu RemoteInfoStruct zawierająca parametry pliku, którego nazwa jest zmieniana/przenoszona (nie pliku docelowego!). W TC 5.51 pola dla katalogów są ustawione następująco: SizeLow=0, SizeHigh=0xFFFFFFFF.
Wartość zwracana:
Zwróć jedną z następujących wartości:
FS_FILE_OK Plik został skopiowany/przeniesiony OK
FS_FILE_EXISTS Plik docelowy już istnieje
FS_FILE_NOTFOUND Nie można znaleźć lub otworzyć pliku źródłowego.
FS_FILE_READERROR Wystąpił błąd podczas odczytu z pliku źródłowego
FS_FILE_WRITEERROR Wystąpił błąd podczas zapisu do pliku docelowego, np. Dysk jest pełny
FS_FILE_USERABORT Kopiowanie zostało przerwane przez użytkownika (poprzez ProgressProc)
FS_FILE_NOTSUPPORTED Operacja nie jest obsługiwana (np. wznowienie)
FS_FILE_EXISTSRESUMEALLOWED nie jest tutaj używany
Ważne notatki:
Total Commander zwykle wywołuje tę funkcję dwukrotnie:
- - raz z OverWrite==false. Jeśli plik zdalny istnieje, zwróć FS_FILE_EXISTS. Jeśli nie istnieje, spróbuj skopiować plik i zwróć odpowiedni kod błędu.
- - drugi raz z OverWrite==true, jeśli użytkownik zdecydował się na nadpisanie pliku.
FsDeleteFile jest wywoływany w celu usunięcia pliku z systemu plików wtyczki.
Deklaracja:
BOOL __stdcall FsDeleteFile(char* RemoteName);
Opis parametrów:
RemoteName Nazwa pliku do usunięcia z pełną ścieżką. Nazwa zawsze zaczyna się od ukośnika odwrotnego, a następnie nazwy zwracane przez FsFindFirst/FsFindNext oddzielane są odwrotnymi ukośnikami.
Wartość zwracana:
Zwróć wartość TRUE, jeśli plik można usunąć, FALSE, jeśli nie.
FsRemoveDir jest wywoływany w celu usunięcia katalogu z systemu plików wtyczki.
Deklaracja:
BOOL __stdcall FsRemoveDir(char* RemoteName);
Opis parametrów:
RemoteName Nazwa katalogu, który ma zostać usunięty, z pełną ścieżką. Nazwa zawsze zaczyna się od ukośnika odwrotnego, a następnie nazwy zwracane przez FsFindFirst/FsFindNext oddzielane są odwrotnymi ukośnikami.
Wartość zwracana:
Zwróć wartość PRAWDA, jeśli katalog można usunąć, FAŁSZ, jeśli nie.
FsMkDir jest wywoływany w celu utworzenia katalogu w systemie plików wtyczki.
Deklaracja:
BOOL __stdcall FsMkDir(char* Path);
Opis parametrów:
Path Nazwa tworzonego katalogu z pełną ścieżką. Nazwa zawsze zaczyna się od ukośnika odwrotnego, a następnie nazwy zwracane przez FsFindFirst/FsFindNext oddzielane są odwrotnymi ukośnikami.
Wartość zwracana:
Zwróć wartość PRAWDA, jeśli katalog można utworzyć, FAŁSZ, jeśli nie.
FsExecuteFile jest wywoływany w celu wykonania pliku w systemie plików wtyczki lub wyświetlenia jego karty właściwości. Nazywa się to również pokazywaniem okna dialogowego konfiguracji wtyczki, gdy użytkownik kliknie prawym przyciskiem myszy katalog główny wtyczki i wybierze „właściwości”. Następnie wywoływana jest wtyczka z parametrami RemoteName="\" i Verb="properties" (wymaga TC>=5.51).
Deklaracja:
int __stdcall FsExecuteFile(HWND MainWin,char* RemoteName,char* Verb);
Opis parametrów:
MainWin Okno nadrzędne , którego można użyć do pokazania arkusza właściwości.
RemoteName Nazwa pliku, który ma zostać wykonany, z pełną ścieżką.
Verb Czasownik Może to być "otwarty", "właściwości", "chmod" lub "cytat" (wielkość liter nie ma znaczenia).
- open: Jest wywoływane, gdy użytkownik naciśnie ENTER na pliku. Można sobie z tym poradzić na trzy sposoby:
- a) W przypadku poleceń wewnętrznych, takich jak „Dodaj nowe połączenie”, wykonaj je we wtyczce i zwróć FS_EXEC_OK lub FS_EXEC_ERROR
- b) Pozwól programowi Total Commander pobrać plik i uruchomić go lokalnie: zwróć FS_EXEC_YOURSELF
- c) Jeśli plik jest łączem (symbolicznym), ustaw RemoteName na lokalizację, na którą wskazuje łącze (w tym pełną ścieżkę wtyczki) i zwróć FS_EXEC_SYMLINK. Total Commander przełączy się następnie do tego katalogu. Możesz także przełączyć się do katalogu na lokalnym dysku twardym! Aby to zrobić, zwróć ścieżkę zaczynającą się od litery dysku lub lokalizacji UNC (\\serwer\udział). Maksymalna dozwolona długość takiej ścieżki to MAX_PATH-1 = 259 znaków!
- właściwości: Pokaż arkusz właściwości pliku (opcjonalnie). Obecnie nie są obsługiwane przez wewnętrzne funkcje Totalcmd, jeśli zwrócony zostanie FS_EXEC_YOURSELF, więc wtyczka musi to zrobić wewnętrznie.
- chmod xxx: xxx oznacza nowy tryb Uniksa (atrybuty), który ma zostać zastosowany do pliku RemoteName. Czasownik ten jest używany tylko podczas zwracania atrybutów Uniksa poprzez FsFindFirst/FsFindNext
- quote Commandline: Wykonaj linię poleceń wprowadzoną przez użytkownika w katalogu RemoteName . Jest to wywoływane, gdy użytkownik wprowadzi polecenie w wierszu poleceń Totalcmd i naciśnie ENTER. Jest to opcjonalne i pozwala na wysyłanie poleceń specyficznych dla wtyczki. To, co tu wspierać, zależy od autora wtyczki. Jeśli użytkownik wpisał np. polecenie katalogu cd, możesz zwrócić nową ścieżkę w RemoteName (maks. 259 znaków) i podać FS_EXEC_SYMLINK jako wartość zwracaną. Zwróć FS_EXEC_OK, aby spowodować odświeżenie (ponowny odczyt) aktywnego panelu.
Zwróć FS_EXEC_YOURSELF, jeśli Total Commander powinien pobrać plik i uruchomić go lokalnie, FS_EXEC_OK, jeśli polecenie zostało pomyślnie wykonane we wtyczce (lub jeśli polecenie nie ma zastosowania i nie jest potrzebne żadne dalsze działanie), FS_EXEC_ERROR, jeśli wykonanie nie powiodło się, lub FS_EXEC_SYMLINK, jeśli tak był (symbolicznym) łączem lub plikiem .lnk wskazującym na inny katalog.
FsSetAttr jest wywoływany w celu ustawienia atrybutów pliku (w stylu Windows) dla pliku/katalogu. FsExecuteFile jest wywoływany dla atrybutów w stylu uniksowym.
Deklaracja:
BOOL __stdcall FsSetAttr(char* RemoteName,int NewAttr);
Opis parametrów:
RemoteName Nazwa pliku/katalogu, którego atrybuty mają zostać ustawione
NewAttr Nowe atrybuty pliku. Są to kombinacje następujących standardowych atrybutów plików:
- FILE_ATTRIBUTE_READONLY 0x01
- FILE_ATTRIBUTE_HIDDEN 0x02
- FILE_ATTRIBUTE_SYSTEM 0x04
- FILE_ATTRIBUTE_ARCHIVE 0x20
Zwróć TRUE, jeśli się powiedzie, FALSE, jeśli funkcja się nie powiedzie. NIE eksportuj tej funkcji, jeśli nie jest obsługiwana przez Twoją wtyczkę!
Zobacz także: FsExecuteFile
FsSetTime jest wywoływany w celu ustawienia czasów plików (w stylu Windows) dla pliku/katalogu.
Deklaracja:
BOOL __stdcall FsSetTime(char* RemoteName, FILETIME *CreationTime, FILETIME *LastAccessTime, FILETIME *LastWriteTime);
Opis parametrów:
RemoteName Nazwa pliku/katalogu, którego atrybuty mają zostać ustawione
CreationTime Czas utworzenia pliku. Może mieć wartość NULL, aby pozostawić ją bez zmian.
LastAccessTime Czas ostatniego dostępu do pliku. Może mieć wartość NULL, aby pozostawić ją bez zmian.
LastWriteTime Czas ostatniego zapisu pliku. Może mieć wartość NULL, aby pozostawić ją bez zmian. Jeśli Twój system plików obsługuje tylko jeden raz, użyj tego parametru!
Wartość zwracana:
Zwróć TRUE, jeśli się powiedzie, FALSE, jeśli funkcja się nie powiedzie. NIE eksportuj tej funkcji, jeśli nie jest obsługiwana przez Twoją wtyczkę!
FsDisconnect jest wywoływany, gdy użytkownik naciśnie przycisk Rozłącz na pasku narzędzi połączeń FTP. Ten pasek narzędzi jest wyświetlany tylko wtedy, gdy do funkcji LogProc() przekazano MSGTYPE_CONNECT.
Deklaracja:
BOOL __stdcall FsDisconnect(char* DisconnectRoot);
Opis parametrów:
DisconnectRoot Jest to katalog główny przekazany do LogProc podczas łączenia. Umożliwia wtyczce tworzenie otwartych połączeń serwerowych z różnymi systemami plików (np. serwerami FTP). Powinno być \ (dla pojedynczego możliwego połączenia) lub \Nazwa_serwera (np. w przypadku wielu otwartych połączeń).
Wartość zwracana:
Zwróć wartość PRAWDA, jeśli połączenie zostało zamknięte (lub nigdy nie otwarte), FAŁSZ, jeśli nie można go zamknąć.
Ważna nota:
Aby uzyskać wywołanie tej funkcji, wtyczka MUSI wywołać LogProc z parametrem MSGTYPE_CONNECT. Parametr LogString MUSI zaczynać się od „CONNECT”, po którym następuje jedna biała spacja i katalog główny systemu plików, który został podłączony. Ten katalog główny systemu plików zostanie przekazany do FsDisconnect, gdy użytkownik naciśnie przycisk Rozłącz, więc wtyczka będzie wiedziała, które połączenie zamknąć. NIE wywołuj LogProc z MSGTYPE_CONNECT, jeśli twoja wtyczka nie wymaga łączenia/rozłączania! Przykłady:
- - FTP wymaga połączenia/rozłączenia. Połączenie może zostać wykonane automatycznie, gdy użytkownik wejdzie do podkatalogu, a rozłączenie, gdy użytkownik kliknie przycisk Rozłącz.
- - Dostęp do lokalnych systemów plików (np. Linux EXT2) nie wymaga łączenia/rozłączania, więc nie wywołuj LogProc z parametrem MSGTYPE_CONNECT.
FsStatusInfo wywoływany jest jako informacja dla wtyczki o rozpoczęciu lub zakończeniu określonej operacji. Można go używać do przydzielania/zwalniania buforów i/lub opróżniania danych z pamięci podręcznej. Nie ma potrzeby implementowania tej funkcji, jeśli wtyczka tego nie wymaga.
Deklaracja:
void __stdcall FsStatusInfo(char* RemoteDir,int InfoStartEnd,int InfoOperation);
Opis parametrów:
RemoteDir Jest to bieżący katalog źródłowy w chwili rozpoczęcia operacji. Można go użyć do sprawdzenia, której części systemu plików dotyczy problem.
InfoStartEnd Informacja o rozpoczęciu lub zakończeniu operacji. Możliwa wartość: FS_STATUS_START Rozpoczyna się operacja (w razie potrzeby przydziel bufory) FS_STATUS_END Operacja została zakończona (wolne bufory, opróżnianie pamięci podręcznej itp.)
InfoOperation Informacja o rozpoczęciu/zakończeniu operacji. Możliwa wartość:
- FS_STATUS_OP_LIST Pobierz listę katalogów
- FS_STATUS_OP_GET_SINGLE Pobierz pojedynczy plik z systemu plików wtyczek
- FS_STATUS_OP_GET_MULTI Pobierz wiele plików, może zawierać podkatalogi
- FS_STATUS_OP_PUT_SINGLE Umieść pojedynczy plik w systemie plików wtyczek
- FS_STATUS_OP_PUT_MULTI Umieść wiele plików, może zawierać podkatalogi
- FS_STATUS_OP_RENMOV_SINGLE Zmień nazwę/Przenieś/Zdalnie skopiuj pojedynczy plik
- FS_STATUS_OP_RENMOV_MULTI RenMov wiele plików, może zawierać podkatalogi
- FS_STATUS_OP_DELETE Usuń wiele plików, może zawierać podkatalogi
- FS_STATUS_OP_ATTRIB Zmień atrybuty/czasy, może obejmować podkatalogi
- FS_STATUS_OP_MKDIR Utwórz pojedynczy katalog
- FS_STATUS_OP_EXEC Uruchom pojedynczy element zdalny lub wiersz poleceń
- FS_STATUS_OP_CALCSIZE Obliczanie rozmiaru podkatalogu (użytkownik nacisnął SPACJĘ)
- FS_STATUS_OP_SEARCH Wyszukiwanie tylko nazw plików (używając FsFindFirst/Next/Close)
- FS_STATUS_OP_SEARCH_TEXT Wyszukiwanie zawartości pliku (przy użyciu również wywołań FsGetFile())
- FS_STATUS_OP_SYNC_SEARCH Synchronizuj katalogi wyszukuje informacje w podkatalogach
- FS_STATUS_OP_SYNC_GET Synchronizuj: Pobieranie plików z wtyczki
- FS_STATUS_OP_SYNC_PUT Synchronizuj: Przesyłanie plików do wtyczki
- FS_STATUS_OP_SYNC_DELETE Synchronizuj: Usuwanie plików z wtyczki
Wartość zwracana:
Ta funkcja nie zwraca wartości.
Ważna nota:
Ta funkcja została dodana dla wygody twórców wtyczek. Wszystkie wywołania funkcji wtyczki będą ujęte w parę wywołań FsStatusInfo(): na początku FsStatusInfo(...,FS_STATUS_START,...) i po zakończeniu operacji FsStatusInfo(...,FS_STATUS_END,...). Pomiędzy tymi dwoma wywołaniami może znajdować się wiele wywołań wtyczek. Na przykład pobieranie może zawierać wiele wywołań funkcji FsGetFile() i FsFindFirst(), FsFindNext(), FsFindClose() (do kopiowania podkatalogów).
Należy również pamiętać, że ta funkcja jest wywoływana tylko w przypadku operacji na plikach. Nie jest wywoływana w przypadku żadnej funkcji FsContent* w celu uzyskania szczegółów pliku, a także nie w przypadku następujących funkcji: FsSetDefaultParams, FsGetLocalName, FsGetPreviewBitmap, FsExtractCustomIcon, FsDisconnect.
Funkcja FsFindClose jest wywoływana w celu zakończenia pętli FsFindFirst/FsFindNext po pobraniu wszystkich plików lub po przerwaniu pętli przez użytkownika.
Deklaracja:
int __stdcall FsFindClose(HANDLE Hdl);
Opis parametrów:
Hdl Uchwyt wyszukiwania zwrócony przez FsFindFirst.
Wartość zwracana:
Aktualnie nieużywane, powinno zwrócić 0.
Zobacz też: FsFindFirst, FsFindNext
FsExtractCustomIcon jest wywoływany, gdy plik/katalog jest wyświetlany na liście plików. Można go użyć do określenia niestandardowej ikony dla tego pliku/katalogu. Ta funkcja jest nowością w wersji 1.1. Wymaga programu Total Commander >=5,51, ale jest ignorowany przez starsze wersje.
Deklaracja:
int __stdcall FsExtractCustomIcon(char* RemoteName, int ExtractFlags, HICON* TheIcon);
Opis parametrów:
RemoteName Jest to pełna ścieżka do pliku lub katalogu, którego ikona ma zostać pobrana. Podczas wyodrębniania ikony możesz zwrócić tutaj nazwę ikony - gwarantuje to, że ikona zostanie zapisana w pamięci podręcznej tylko raz w programie wywołującym. Zwrócona nazwa ikony nie może być dłuższa niż MAX_PATH znaków (łącznie z kończącą się wartością 0!). Uchwyt ikony nadal musi zostać zwrócony w TheIcon!
ExtractFlags Flagi operacji wyodrębniania. Kombinacja następujących elementów:
- FS_ICONFLAG_SMALL Żąda małej ikony 16x16
- FS_ICONFLAG_BACKGROUND Funkcja wywoływana jest z wątku w tle (patrz uwaga poniżej)
Wartość zwracana:
Funkcja musi zwrócić jedną z następujących wartości:
FS_ICON_USEDEFAULT Żadna ikona nie jest zwracana. Aplikacja wywołująca powinna wyświetlać domyślną ikonę dla tego typu pliku.
FS_ICON_EXTRACTED Ikona została zwrócona w TheIcon. Ikona NIE może zostać zwolniona przez aplikację wywołującą, np. ponieważ został załadowany za pomocą LoadIcon lub biblioteka DLL obsługuje niszczenie ikony.
FS_ICON_EXTRACTED_DESTROY W TheIcon zwrócono ikonę. Ikona MUSI zostać zniszczona przez aplikację wywołującą, np. ponieważ został utworzony za pomocą CreateIcon() lub wyodrębniony za pomocą ExtractIconEx().
FS_ICON_DELAYED Ta zwracana wartość jest prawidłowa tylko wtedy, gdy NIE ustawiono FS_ICONFLAG_BACKGROUND. Informuje aplikację wywołującą, aby pokazała domyślną ikonę i zażądała prawdziwej ikony w wątku w tle. Patrz przypis poniżej.
Ważna nota:
Jeśli zwrócisz FS_ICON_DELAYED, funkcja FsExtractCustomIcon() zostanie ponownie wywołana z wątku w tle w późniejszym czasie. Sekcja krytyczna jest używana przez aplikację wywołującą, aby zapewnić, że funkcja FsExtractCustomIcon() nigdy nie zostanie wprowadzona dwukrotnie w tym samym czasie. Tę wartość zwracaną należy stosować w przypadku ikon, których wyodrębnienie zajmuje trochę czasu, np. Ikony EXE. W przykładowej wtyczce fplugin ikony dysków są zwracane natychmiast (ponieważ są przechowywane w samej wtyczce), ale ikony EXE są ładowane z opóźnieniem. Jeżeli użytkownik wyłączy ładowanie ikon w tle, funkcja zostanie wywołana na pierwszym planie z flagą FS_ICONFLAG_BACKGROUND.
FsSetDefaultParams jest wywoływana bezpośrednio po funkcji FsInit(). Ta funkcja jest nowością w wersji 1.3. Wymaga programu Total Commander >=5,51, ale jest ignorowany przez starsze wersje.
Deklaracja:
void __stdcall FsSetDefaultParams(FsDefaultParamStruct* dps);
Opis parametrów:
dps Ta struktura typu FsDefaultParamStruct zawiera obecnie numer wersji interfejsu wtyczki oraz sugerowaną lokalizację pliku ustawień (plik ini). Zaleca się przechowywanie wszelkich informacji dotyczących wtyczki bezpośrednio w tym pliku lub w tym katalogu pod inną nazwą. Upewnij się, że używasz unikalnego nagłówka podczas przechowywania danych w tym pliku, ponieważ jest on współdzielony przez inne wtyczki systemu plików! Jeśli Twoja wtyczka potrzebuje więcej niż 1 kilobajt danych, powinieneś użyć własnego pliku ini, ponieważ pliki ini są ograniczone do 64 KB.
Wartość zwracana:
Funkcja nie zwraca wartości:
Ważna nota:
Ta funkcja jest wywoływana tylko w Total Commander 5.51 i nowszych wersjach. Wersja wtyczki będzie >= 1.3.
FsGetPreviewBitmap jest wywoływany, gdy plik/katalog jest wyświetlany w widoku miniatur. Można go użyć do zwrócenia niestandardowej mapy bitowej dla tego pliku/katalogu. Ta funkcja jest nowością w wersji 1.4. Wymaga programu Total Commander >=7.0, ale jest ignorowany przez starsze wersje.
Deklaracja:
int __stdcall FsGetPreviewBitmap(char* RemoteName, int width, int height, HBITMAP* ReturnedBitmap);
Opis parametrów:
RemoteName Jest to pełna ścieżka do pliku lub katalogu, którego bitmapę chcesz pobrać. Podczas wyodrębniania mapy bitowej możesz zwrócić tutaj nazwę mapy bitowej - gwarantuje to, że ikona zostanie zapisana w pamięci podręcznej tylko raz w programie wywołującym. Zwrócona nazwa bitmapy nie może być dłuższa niż MAX_PATH znaków (łącznie z zakończeniem 0!). Uchwyt bitmapy nadal musi zostać zwrócony w ReturnedBitmap!
width, height szerokość, wysokość Maksymalne wymiary bitmapy podglądu. Jeśli Twój obraz jest mniejszy lub ma inny współczynnik boków, musisz zwrócić obraz mniejszy niż te wymiary! Zobacz notatki poniżej!
ReturnedBitmap Tutaj musisz zwrócić uchwyt mapy bitowej.
Wartość zwracana:
Funkcja musi zwrócić jedną z następujących wartości:
FS_BITMAP_NONE Brak mapy bitowej podglądu.
FS_BITMAP_EXTRACTED Obraz został wyodrębniony i zwrócony w ReturnedBitmap
FS_BITMAP_EXTRACT_YOURSELF Mówi wywołującemu, aby sam wyodrębnił obraz. Pełna ścieżka lokalna do pliku musi zostać zwrócona w RemoteName. Zwrócona nazwa mapy bitowej nie może być dłuższa niż MAX_PATH.
FS_BITMAP_EXTRACT_YOURSELF_ANDDELETE
- Informuje osobę wywołującą, aby samodzielnie wyodrębniła obraz, a następnie usunęła tymczasowy plik obrazu. Pełna ścieżka lokalna do tymczasowego pliku obrazu musi zostać zwrócona w RemoteName. Zwrócona nazwa mapy bitowej nie może być dłuższa niż MAX_PATH. W tym przypadku wtyczka pobiera plik do TEMP, a następnie prosi TC o wypakowanie obrazu.
Ważne notatki:
- Ta funkcja jest wywoływana tylko w Total Commander 7.0 i nowszych wersjach. Zgłoszona wersja wtyczki będzie >= 1.4.
- Uchwyt bitmapy przechodzi w posiadanie Total Commandera, który po jego użyciu usunie go. Wtyczka nie może usuwać uchwytu mapy bitowej!
- Upewnij się, że poprawnie przeskalowałeś obraz do żądanej maksymalnej szerokości i wysokości! Nie wypełniaj reszty bitmapy - zamiast tego utwórz bitmapę MNIEJSZĄ niż żądana! W ten sposób Total Commander może wyśrodkować obraz i wypełnić resztę domyślnym kolorem tła.
// sprawdź system operacyjny: Windows 9x NIE obsługuje trybu rozciągania HALFTONE!
vx.dwOSVersionInfoSize=sizeof(vx);
GetVersionEx(&vx);
is_nt=vx.dwPlatformId==VER_PLATFORM_WIN32_NT;
// tutaj ładujesz swój obraz
bmp_image=SomeHowLoadImageFromFile(RemoteName);
if (bmp_image && GetObject(bmp_image,sizeof(bmpobj),&bmpobj)) {
bigx=bmpobj.bmWidth;
bigy=bmpobj.bmHeight;
// do we need to stretch?
if ((bigx>=width || bigy>=height) && (bigx>0 && bigy>0)) {
stretchy=MulDiv(width,bigy,bigx);
if (stretchy<=height) {
w=width;
h=stretchy;
if (h<1) h=1;
} else {
stretchx=MulDiv(height,bigx,bigy);
w=stretchx;
if (w<1) w=1;
h=height;
}
maindc=GetDC(GetDesktopWindow());
dc_thumbnail=CreateCompatibleDC(maindc);
dc_image=CreateCompatibleDC(maindc);
bmp_thumbnail=CreateCompatibleBitmap(maindc,w,h);
ReleaseDC(GetDesktopWindow(),maindc);
oldbmp_image=(HBITMAP)SelectObject(dc_image,bmp_image);
oldbmp_thumbnail=(HBITMAP)SelectObject(dc_thumbnail,bmp_thumbnail);
if(is_nt) {
SetStretchBltMode(dc_thumbnail,HALFTONE);
SetBrushOrgEx(dc_thumbnail,0,0,&pt);
} else {
SetStretchBltMode(dc_thumbnail,COLORONCOLOR);
}
StretchBlt(dc_thumbnail,0,0,w,h,dc_image,0,0,bigx,bigy,SRCCOPY);
SelectObject(dc_image,oldbmp_image);
SelectObject(dc_thumbnail,oldbmp_thumbnail);
DeleteDC(dc_image);
DeleteDC(dc_thumbnail);
DeleteObject(bmp_image);
*ReturnedBitmap=bmp_thumbnail;
return FS_BITMAP_EXTRACTED | FS_BITMAP_CACHE;
}
*ReturnedBitmap=bmp_image;
return FS_BITMAP_EXTRACTED | FS_BITMAP_CACHE;
}
return FS_BITMAP_NONE;
}
Nie wolno implementować FsLinksToLocalFiles, chyba że Twoja wtyczka jest wtyczką tymczasowego panelu plików! Panele plików tymczasowych przechowują po prostu łącza do plików w lokalnym systemie plików.
Deklaracja:
BOOL __stdcall FsLinksToLocalFiles(void);
Opis parametrów:
Nie ma żadnych parametrów.
Wartość zwracana:
Funkcja musi zwrócić jedną z następujących wartości:
true Wtyczka jest tymczasową wtyczką przypominającą panel
false Wtyczka jest zwykłą wtyczką systemu plików
Ważna uwaga:
Jeśli Twoja wtyczka jest tymczasową wtyczką panelu, następujące funkcje MUSZĄ być bezpieczne dla wątków (można je wywołać z menedżera transferu w tle):
- FsLinksToLocalFiles
- FsFindFirst
- FsFindNext
- FsFindClose
- FsGetLocalName
Oznacza to, że podczas przesyłania w tle podkatalogów z wtyczki na FTP, Total Commander wywoła te funkcje w wątku w tle. Jeżeli użytkownik będzie kontynuował pracę na pierwszym planie, w tym samym czasie mogą wystąpić wywołania funkcji FsFindFirst i FsFindNext! Dlatego bardzo ważne jest, aby używać uchwytu wyszukiwania do przechowywania tymczasowych informacji o wyszukiwaniu.
FsStatusInfo NIE zostanie wywołane z wątku w tle!
Nie wolno implementować FsGetLocalName, chyba że Twoja wtyczka jest wtyczką tymczasowego panelu plików! Panele plików tymczasowych przechowują po prostu łącza do plików w lokalnym systemie plików.
Deklaracja:
BOOL __stdcall FsGetLocalName(char* RemoteName,int maxlen);
Opis parametrów:
RemoteName In: Pełna ścieżka do nazwy pliku w przestrzeni nazw wtyczki, np. \jakiś katalog\plik.roz Out: zwraca ścieżkę pliku w lokalnym systemie plików, np. c:\windows\plik.roz
maxlen Maksymalna liczba znaków, które możesz zwrócić w RemoteName, łącznie z końcowym 0.
Wartość zwracana:
Funkcja musi zwrócić jedną z następujących wartości: true Nazwa wskazuje na plik lokalny, który jest zwracany w RemoteName. false Nazwa nie wskazuje na plik lokalny, RemoteName pozostaje niezmieniona.
Ważna nota:
Jeśli Twoja wtyczka jest tymczasową wtyczką panelu, następujące funkcje MUSZĄ być bezpieczne dla wątków (można je wywołać z menedżera transferu w tle):
- - FsGetLocalName
- - FsLinksToLocalFiles
- - FsFindFirst
- - FsFindNext
- - FsFindClose
FsContentGetSupportedField jest wywoływany w celu wyliczenia wszystkich obsługiwanych pól. FieldIndex jest zwiększany o 1, zaczynając od 0, aż wtyczka zwróci ft_nomorefields.
Ta funkcja jest identyczna z funkcją ContentGetSupportedField we wtyczkach Content, z tą różnicą, że ft_fulltext nie jest obecnie obsługiwana.
Deklaracja:
int __stdcall FsContentGetSupportedField(int FieldIndex,char* FieldName,
char* Units,int maxlen);
Opis parametrów:
FieldIndex Indeks pola, dla którego TC żąda informacji. Zaczynając od 0, FieldIndex jest zwiększany, aż wtyczka zwróci błąd.
FieldName Tutaj wtyczka musi zwrócić nazwę pola z indeksem FieldIndex. Pole nie może zawierać następujących znaków: . (kropka) | (linia pionowa): (dwukropek). Możesz zwrócić maksymalnie maksymalną liczbę znaków, łącznie z końcowym 0.
Units
- Jeśli pole obsługuje kilka jednostek, takich jak bajty, kilobajty, megabajty itp., należy je tutaj określić w następującej formie: bajty|kbajty|Mbajty . Separatorem jest pionowa kreska (Alt+0124). Jako nazwy pól nazwy jednostek nie mogą zawierać pionowej kreski, kropki ani dwukropka. Możesz zwrócić maksymalnie maksymalną liczbę znaków, łącznie z końcowym 0.
- Jeśli typ pola to ft_multiplechoice, wtyczka musi zwrócić tutaj wszystkie możliwe wartości. Przykład: Pole "Typ pliku" wbudowanej wtyczki treści może mieć wartości "Plik", "Folder" i "Punkt ponownej analizy". Dostępne opcje należy zwrócić w następującej formie: Plik|Folder|Punkt ponownej analizy. Używany jest ten sam separator co w przypadku Jednostek. Możesz zwrócić maksymalnie maksymalną liczbę znaków, łącznie z końcowym 0. Typ pola ft_multiplechoice NIE obsługuje żadnych jednostek.
Wartość zwracana:
Funkcja musi zwrócić jedną z następujących wartości:
ft_nomorefields Wartość FieldIndex wykracza poza ostatnie dostępne pole.
ft_numeric_32 32-bitowa liczba ze znakiem
ft_numeric_64 64-bitowa liczba ze znakiem, np. dla rozmiarów plików
ft_numeric_floating Liczba zmiennoprzecinkowa podwójnej precyzji
ft_date Wartość daty (rok, miesiąc, dzień)
ft_time Wartość czasu (godzina, minuta, sekunda). Data i godzina podane są w czasie lokalnym.
ft_boolean Wartość prawda/fałsz
ft_multiplechoice Wartość umożliwiająca ograniczoną liczbę wyborów. Użyj pola Jednostki, aby zwrócić wszystkie możliwe wartości.
ft_string Ciąg tekstowy
ft_fulltext To pole nie jest obecnie obsługiwane we wtyczkach systemu plików.
ft_datetime Znacznik czasu typu FILETIME, zwracany np. przez: przez FindFirstFile(). Jest to 64-bitowa wartość reprezentująca liczbę 100-nanosekundowych odstępów od 1 stycznia 1601 roku. Czas MUSI być względny w stosunku do czasu uniwersalnego (średniego czasu Greenwich) zwracanego przez system plików, a nie czasu lokalnego!
Uwagi:
Należy pamiętać, że pola typu ft_fulltext pojawiają się tylko w funkcji wyszukiwania, a nie w narzędziu zmiany nazwy ani na listach plików. Wszystkie pola tego typu MUSZĄ być umieszczone na KOŃCU listy pól, w przeciwnym razie w Total Commanderze pojawią się błędy! Jest to konieczne, ponieważ pola te zostaną usunięte z list pól m.in. w oknie dialogowym "konfiguruj niestandardowy widok kolumny". Powinieneś używać typu ft_string dla krótszych, jednoliniowych tekstów odpowiednich do wyświetlania na listach plików i do zmiany nazwy.
FsContentGetValue wywoływany jest w celu pobrania wartości konkretnego pola dla danego pliku, np. pole daty pliku.
Deklaracja:
int __stdcall FsContentGetValue(char* FileName,int FieldIndex,int UnitIndex,
void* FieldValue,int maxlen,int flags);
Opis parametrów:
FileName Nazwa pliku (w przestrzeni nazw wtyczki), dla którego wtyczka ma zwracać dane pola.
FieldIndex Indeks pola, dla którego ma zostać zwrócona treść. Jest to ten sam indeks, co wartość FieldIndex w FsContentGetSupportedField.
UnitIndex Indeks używanej jednostki. Przykład:
- Jeśli wtyczka zwróciła następujący ciąg jednostkowy w FsContentGetSupportedField:
- Wtedy UnitIndex równy 0 oznacza bajty, 1 oznacza kbajty, a 2 oznacza MByty
- Jeśli nie zwrócono żadnego ciągu jednostkowego, UnitIndex wynosi 0.
- W przypadku ft_fulltext UnitIndex zawiera przesunięcie danych do odczytania.
- ft_numeric_32: FieldValue wskazuje na 32-bitową zmienną całkowitą ze znakiem.
- ft_numeric_64: FieldValue wskazuje na 64-bitową zmienną całkowitą ze znakiem.
- ft_numeric_floating: FieldValue wskazuje na 64-bitową zmienną zmiennoprzecinkową (podwójna precyzja w standardzie ISO)
- Zobacz uwagę poniżej dotyczącą dodatkowego pola tekstowego!
- ft_date: FieldValue wskazuje strukturę zawierającą rok, miesiąc, dzień w postaci wartości 2-bajtowych.
- ft_time: FieldValue wskazuje strukturę zawierającą godzinę, minuty i sekundy w postaci wartości 2-bajtowych.
- ft_boolean: FieldValue wskazuje liczbę 32-bitową. 0 neans fałsz, wszystko inne oznacza prawdę.
- ft_string lub ft_multiplechoice: FieldValue jest wskaźnikiem do łańcucha zakończonego zerem.
- ft_fulltext: Odczyt maxlen bajtów zinterpretowanych danych, zaczynając od offsetu UnitIndex. Dane muszą być ciągiem zakończonym 0.
- ft_datetime: Znacznik czasu typu FILETIME, zwracany np. przez: przez FindFirstFile(). Jest to 64-bitowa wartość reprezentująca liczbę 100-nanosekundowych odstępów od 1 stycznia 1601 roku. Czas MUSI być względny w stosunku do czasu uniwersalnego (średniego czasu Greenwich) zwracanego przez system plików, a nie czasu lokalnego!
- ft_delayed, ft_ondemand: Możesz zwrócić ciąg znaków zakończony zerem, jak w ft_string, który będzie wyświetlany do momentu wyodrębnienia rzeczywistej wartości. Wymaga wersji wtyczki>=1.4.
flags
- Obecnie zdefiniowana jest tylko jedna flaga:
- CONTENT_DELAYIFSLOW: Jeśli ta flaga jest ustawiona, wtyczka powinna zwrócić ft_delayed dla pól, których wyodrębnienie zajmuje dużo czasu, takich jak informacje o wersji pliku. Total Commander następnie ponownie wywoła tę funkcję w wątku w tle bez flagi CONTENT_DELAYIFSLOW. Oznacza to, że Twoja wtyczka musi być zaimplementowana w sposób bezpieczny dla wątków, jeśli planujesz zwrócić ft_delayed.
- Wtyczka może także ponownie wysłać polecenie ft_ondemand, jeśli ustawiono CONTENT_DELAYIFSLOW. W tym przypadku pole zostanie pobrane dopiero po naciśnięciu przez użytkownika klawisza . Jest to zalecane tylko w przypadku pól, które zajmują BARDZO dużo czasu, np. rozmiar zawartości katalogu. W takim przypadku należy dwukrotnie zaoferować to samo pole, raz z opóźnieniem i raz na żądanie. Pole zostanie pobrane w wątku tła również w tym przypadku.
W przypadku powodzenia zwróć typ pola, w przeciwnym razie jedną z następujących wartości błędu:
ft_nosuchfield Podany indeks pola jest nieprawidłowy
ft_fileerror Błąd dostępu do określonego pliku FileName
ft_fieldempty Plik nie zawiera określonego pola
ft_delayed Wyodrębnienie pola zajęłoby dużo czasu, więc Total Commander powinien zażądać tego ponownie w wątku w tle. Ten błąd może zostać zwrócony tylko jeśli ustawiono flagę CONTENT_DELAYIFSLOW i wtyczka jest bezpieczna dla wątków.
ft_ondemand Wyodrębnienie pola zajęłoby bardzo dużo czasu, dlatego powinno zostać pobrane tylko wtedy, gdy użytkownik naciśnie spację. Ten błąd może zostać zwrócony tylko jeśli ustawiono flagę CONTENT_DELAYIFSLOW i wtyczka jest bezpieczna dla wątków.
Uwagi:
ft_fulltext Obsługa jest nieco wyjątkowa. Służy wyłącznie do wyszukiwania w zinterpretowanej zawartości pliku, np. do wyszukiwania tekstu w plikach binarnych. Na przykład wtyczka ID3 używa ft_fulltext, aby umożliwić użytkownikowi wyszukiwanie ciągu znaków we WSZYSTKICH polach nagłówka.
Połączenia działają w ten sposób:
Najpierw wywoływana jest funkcja FsContentGetValue z UnitIndex ustawionym na 0. Następnie wtyczka analizuje dane pliku i (jeśli to konieczne) przechowuje je w pamięci podręcznej. Zapisuje pierwszy blok maksymalnie 1 bajtów do FieldValue i zwraca ft_fulltext. Zapisane dane muszą być ciągiem znaków zakończonym 0! Następnie Total Commander przeszukuje blok i żąda następnego bloku z przesunięciem maxlen-1 itd. Gdy nie ma już więcej danych, wtyczka musi ponownie uruchomić ft_fieldempty. Jeśli istnieje dopasowanie, TC sygnalizuje wtyczce, że może usunąć dane z pamięci podręcznej, wywołując funkcję FsContentGetValue z UnitIndex ustawionym na -1! W tym przypadku zwracaną wartością powinno być ft_fieldempty. To wywołanie z UnitIndex=-1 nie ma miejsca, gdy wtyczka kończy wyszukiwanie za pomocą ft_fieldempty, ponieważ dotarło ono do końca pliku.
Total Commander akceptuje fakt, że FsContentGetValue zwraca dla tego samego pola inny typ danych niż FsContentGetSupportedField, np. ciąg znaków „brak wartości” zamiast pola numerycznego.
ft_numeric_floating: Możesz teraz umieścić ciąg znaków zakończony 0 bezpośrednio za 64-bitową zmienną zmiennoprzecinkową, która będzie następnie wyświetlana na listach plików. Jest to przydatne, jeśli dokładność konwersji stosowana przez najaktywniejszych użytkowników nie jest odpowiednia dla Twoich zmiennych. Zmienna numeryczna będzie nadal używana do sortowania i wyszukiwania. Jeśli ciąg znaków jest pusty, TC go zignoruje (przed wywołaniem tej funkcji jest ustawiane na 0, więc funkcja pozostanie kompatybilna wstecz). Przykład: Wartość liczbowa to 0,000002. Możesz zwrócić tę wartość jako zmienną 64-bitową i ciąg znaków, który uznasz za najbardziej odpowiedni, np. "2*10^-6" lub "0.000002".
About caching the data: ~Informacje o buforowaniu danych~ Total Commander nie wywoła miksu FsContentGetValue dla różnych plików, wywoła go tylko dla następnego pliku, gdy będzie można zamknąć poprzedni. Dlatego wystarczyłaby jedna pamięć podręczna na uruchomiony program Total Commander. Mogą jednak występować inne wywołania FsContentGetValue z żądaniami do innych pól w tle, np. do wyświetlania list wyników. Jednocześnie może istnieć wiele instancji Total Commander, więc jeśli używasz pliku TEMP do przechowywania danych w pamięci podręcznej, pamiętaj o nadaniu mu unikalnej nazwy (np. poprzez GetTempFileName).
FsContentStopGetValue jest wywoływany, aby poinformować wtyczkę, że nastąpiła zmiana w katalogu i wtyczka powinna przestać ładować wartość.
Deklaracja:
void __stdcall FsContentStopGetValue(char* FileName);
Opis parametrów:
FileName Nazwa pliku, dla którego aktualnie wywoływana jest funkcja FsContentGetValue.
Wartość zwracana:
Funkcja nie ma wartości zwracanej.
Notatka:
Tę funkcję należy zaimplementować tylko w przypadku obsługi bardzo wolnych pól, np. obliczenie całkowitego rozmiaru wszystkich plików w katalogu. Zostanie wywołane tylko wtedy, gdy wywołanie FsContentGetValue jest aktywne w wątku w tle.
Wtyczka mogłaby obsłużyć ten mechanizm w następujący sposób:
- Po wywołaniu funkcji FsContentGetValue ustaw zmienną GetAborted na wartość false
- Po wywołaniu funkcji FsContentStopGetValue ustaw opcję GetAborted na wartość true
- Sprawdź GetAborted podczas długotrwałej operacji i jeśli okaże się prawdą, zwróć ft_fieldempty
Funkcja FsContentGetDefaultSortOrder jest wywoływana, gdy użytkownik kliknie nagłówek sortowania nad kolumnami.
Deklaracja:
int __stdcall FsContentGetDefaultSortOrder(int FieldIndex);
Opis parametrów:
FieldIndex Indeks pola, dla którego powinien zostać zwrócony porządek sortowania.
Wartość zwracana:
Zwróć 1 dla wartości rosnącej (a..z, 1..9) lub -1 dla wartości malejącej (z..a, 9..0).
Notatka:
Możesz zaimplementować tę funkcję, jeśli istnieją pola, które są zwykle posortowane w kolejności malejącej, np. pole rozmiaru (najpierw największy plik) lub pola daty/godziny (najpierw najnowsze). Jeśli funkcja nie jest zaimplementowana, ustawieniem domyślnym będzie rosnąco.
FsContentPluginUnloading wywoływany jest tuż przed wyładowaniem wtyczki, np. do zamykania buforów, przerywania operacji itp.
Deklaracja:
void __stdcall FsContentPluginUnloading(void);
Opis parametrów:
Nie ma żadnych parametrów.
Wartość zwracana:
Nie ma wartości zwracanej.
Notatka:
Ta funkcja została dodana na żądanie użytkownika, który musi zwolnić GDI+. Wygląda na to, że GDI+ ma błąd, który powoduje awarię podczas wyładowywania go w funkcji rozładowywania biblioteki DLL, dlatego potrzebna jest osobna funkcja rozładowywania. Funkcja jest wywoływana tylko wtedy, gdy używana jest część wtyczki treściowej wtyczki systemu plików!
FsContentGetSupportedFieldFlags jest wywoływany w celu uzyskania różnych informacji o zmiennej wtyczki. Najpierw jest wywoływana z FieldIndex=-1, aby dowiedzieć się, czy wtyczka w ogóle obsługuje jakieś specjalne flagi, a następnie dla każdego pola osobno.
Deklaracja:
int __stdcall FsContentGetSupportedFieldFlags(int FieldIndex);
Opis parametrów:
FieldIndex Indeks pola, dla którego powinien zostać zwrócony porządek sortowania. -1: Zwraca kombinację (lub) wszystkich obsługiwanych flag, np. contflags_edit | contflags_substmask >=0: Zwraca flagi specyficzne dla pola
Wartość zwracana:
Funkcja musi zwrócić kombinację następujących flag:
contflags_edit Wtyczka umożliwia edycję (modyfikację) tego pola poprzez opcję Pliki - Zmień atrybuty. Należy to zwrócić tylko dla pól, w których ma to sens, np. data pliku.
Tylko JEDNA z następujących flag: (Zobacz opis i przykład w sekcji „Uwaga”).
contflags_substsize użyj rozmiaru pliku
contflags_substdatetime użyj daty i godziny pliku (ft_datetime)
contflags_substdate użyj daty pliku (fd_date)
contflags_substtime użyj czasu pliku (fd_time)
contflags_substattributes używają atrybutów pliku (numerycznych)
contflags_substattributestr użyj ciągu atrybutów pliku w postaci -a--
contflags_substmask Kombinacja wszystkich powyższych flag podstawień. Powinien zostać zwrócony dla indeksu -1, jeśli wtyczka treści zawiera DOWOLNE z podstawionych pól.
Notatka:
Zwrócenie jednej z flag contflags_subst* nakazuje Total Commanderowi zastąpienie (podstawienie) zwróconej zmiennej wskazaną domyślną wartością wewnętrzną, jeśli to pole jest wyświetlane poza kontekstem wtyczki. Można go również wykorzystać do określenia domyślnej kolejności sortowania.
FsContentSetValue wywoływany jest w celu ustawienia wartości konkretnego pola dla danego pliku, np. aby zmienić pole daty pliku.
Deklaracja:
int __stdcall FsContentSetValue(char* FileName,int FieldIndex,int UnitIndex,int FieldType,
void* FieldValue,int flags);
Opis parametrów:
FileName Nazwa pliku (w przestrzeni nazw wtyczki), dla którego wtyczka ma zmienić dane w polu.
- Jest ustawione na NULL, aby wskazać koniec atrybutów zmiany (patrz uwagi poniżej).
UnitIndex Indeks używanej jednostki. Przykład:
- Jeśli wtyczka zwróciła następujący ciąg jednostkowy w FsContentGetSupportedField:
- bajty|kbajty|MBajty
- Wtedy UnitIndex równy 0 oznacza bajty, 1 oznacza kbajty, a 2 oznacza MByty
- Jeśli nie zwrócono żadnego ciągu jednostkowego, UnitIndex wynosi 0.
- ft_fulltext nie jest obecnie obsługiwany.
FieldValue Tutaj wtyczka otrzymuje dane do zmiany. Format danych zależy od typu pola:
- ft_numeric_32: FieldValue wskazuje na 32-bitową zmienną całkowitą ze znakiem.
- ft_numeric_64: FieldValue wskazuje na 64-bitową zmienną całkowitą ze znakiem.
- ft_numeric_floating: FieldValue wskazuje na 64-bitową zmienną zmiennoprzecinkową (podwójna precyzja w standardzie ISO)
- ft_date: FieldValue wskazuje strukturę zawierającą rok, miesiąc, dzień w postaci wartości 2-bajtowych.
- ft_time: FieldValue wskazuje strukturę zawierającą godzinę, minuty i sekundy w postaci wartości 2-bajtowych.
- ft_boolean: FieldValue wskazuje liczbę 32-bitową. 0 neans fałsz, wszystko inne oznacza prawdę.
- ft_string lub ft_multiplechoice: FieldValue jest wskaźnikiem do łańcucha zakończonego zerem.
- ft_fulltext: Obecnie nieobsługiwany.
- ft_datetime: Znacznik czasu typu FILETIME, zwracany np. przez: przez FindFirstFile(). Jest to 64-bitowa wartość reprezentująca liczbę 100-nanosekundowych odstępów od 1 stycznia 1601 roku. Czas MUSI być względny w stosunku do czasu uniwersalnego (średniego czasu Greenwich) zwracanego przez system plików, a nie czasu lokalnego!
- ft_delayed, ft_ondemand: Możesz zwrócić ciąg znaków zakończony zerem, jak w ft_string, który będzie wyświetlany do momentu wyodrębnienia rzeczywistej wartości. Wymaga wersji wtyczki>=1.4.
- setflags_first_attribute: Jest to pierwszy atrybut ustawiany dla tego pliku za pomocą tej wtyczki. Można wykorzystać do optymalizacji.
- setflags_last_attribute: Jest to ostatni atrybut, który można ustawić dla tego pliku za pomocą tej wtyczki.
- setflags_only_date: Tylko dla pola typu ft_datetime: Użytkownik wprowadził tylko datę, nie zmieniaj godziny
ft_setsuccess Zmiana powiodła się ft_fileerror Błąd dostępu do określonego pliku FileName lub nie można ustawić podanej wartości ft_nosuchfield Podany indeks pola był nieprawidłowy
Uwagi:
Informacje o buforowaniu danych: Total Commander nie wywoła kombinacji FsContentSetValue dla różnych plików, wywoła ją tylko dla następnego pliku, gdy będzie można zamknąć poprzedni. Dlatego pojedyncza pamięć podręczna na uruchomiony program Total Commander powinna wystarczyć.
Informacje o flagach: Jeśli flagi setflags_first_attribute i setflags_last_attribute są ustawione, to jest to jedyny atrybut tej wtyczki, który jest zmieniany dla tego pliku.
FsSetAttr również musi zostać zaimplementowany, w przeciwnym razie okno dialogowe zmiany atrybutów (które jest również używane do zmiany niestandardowych atrybutów wtyczki) nie może być użyte dla tej funkcji.
FileName jest ustawione na NULL, a FieldIndex na -1, aby zasygnalizować wtyczce, że operacja zmiany atrybutów została zakończona. Można to wykorzystać do opróżnienia niezapisanych danych na dysk, np. podczas ustawiania komentarzy dla wielu plików.
FsContentGetDefaultView jest wywoływany w celu uzyskania widoku domyślnego, do którego Total Commander powinien się przełączyć po wejściu do tej wtyczki systemu plików.
Deklaracja:
BOOL __stdcall FsContentGetDefaultView(char* ViewContents, char* ViewHeaders, char* ViewWidths, char* ViewOptions, int maxlen);
Opis parametrów:
ViewContents Zwróć tutaj domyślne pola dla tej wtyczki, np. [=<fs>.size.bkM2]\n[=fs.writetime] Zauważ, że w C musisz napisać \\n, aby zwrócić ukośnik odwrotny i 'n' zamiast znaku nowej linii!
ViewHeaders Zwraca domyślne nagłówki pokazane na pasku nagłówka sortowania, np. "Rozmiar\nData/godzina"
ViewWidths Zwraca domyślne szerokości kolumn pokazane na pasku nagłówka sortowania, np. "148,23,-35,-35" Wartości ujemne oznaczają, że pole jest wyrównane do prawej. Pierwsze dwie szerokości dotyczą nazwy i rozszerzenia
ViewOptions Dwie wartości oddzielone pionową linią oznaczają:
- - automatyczna regulacja szerokości lub -1 w przypadku braku regulacji
- - flaga poziomego paska przewijania
Zwróć wartość true, jeśli zwróciłeś widok domyślny, wartość false, jeśli nie powinien być wyświetlany żaden widok domyślny.
Uwagi:
Najlepiej jest utworzyć niestandardowy widok kolumn w Total Commander, zapisać go, a następnie skopiować definicje z pliku Wincmd.ini do swojej wtyczki. Wartości w ViewContents i ViewHeaders są oddzielone ukośnikiem odwrotnym i małą literą 'n'. Zauważ, że w C musisz napisać \\n, aby zwrócić ukośnik odwrotny i 'n' zamiast znaku nowej linii!
Funkcja FsGetBackgroundFlags jest wywoływana przez program Total Commander 7.51 lub nowszy w celu ustalenia, czy wtyczka obsługuje operacje w tle (przesyłanie i pobieranie), a jeśli tak, w jaki sposób są one obsługiwane.
Deklaracja:
int __stdcall FsGetBackgroundFlags(void);
Opis parametrów:
Nie ma żadnych parametrów
Wartość zwracana:
Kombinacja następujących flag:
BG_DOWNLOAD Obsługiwane jest pobieranie w tle
BG_UPLOAD Obsługiwane jest przesyłanie w tle
BG_ASK_USER Jeśli ta flaga jest ustawiona, użytkownik musi zostać zapytany PRZED rozpoczęciem przesyłania, czy plik powinien zostać wysłany/odzyskany w tle czy na pierwszym planie. Jest to konieczne w przypadku wtyczek, gdzie potrzebne jest osobne połączenie do transferów w tle, np. wtyczka SFTP (bezpieczne ftp).
- Jeśli flaga nie jest ustawiona, w oknie aktualnego postępu pojawi się przycisk „tło”.
Jeżeli ustawiona jest flaga BG_ASK_USER i użytkownik zaznaczy opcję przesłania pliku w tle, Total Commander uruchamia wątek w tle i wywołuje FsStatusInfo z parametrami FS_STATUS_START i FS_STATUS_OP_GET_MULTI_THREAD zamiast FS_STATUS_OP_GET_MULTI dla pobrań i FS_STATUS_OP_PUT_MULTI_THREAD zamiast FS_STATUS_ OP_PUT_MULTI do przesyłania. Po zakończeniu transferu wysyłany jest odpowiedni komunikat FS_STATUS_END. Powiadomienia te można wykorzystać do nawiązania połączenia w tle i zamknięcia go po zakończeniu. Aby rozpoznać operację w tle, musisz użyć GetCurrentThreadID(). GetCurrentThreadID() zwróci tę samą wartość dla całej operacji w FsStatusInfo, FsGetFile i FsPutFile.
Jeśli flaga BG_ASK_USER NIE jest ustawiona, wszystkie wysyłanie i pobieranie za pomocą klawisza F5 lub F6 będą rozpoczynane w wątku w tle. Początkowo wyświetlane będzie normalne okno transferu na pierwszym planie, które zostanie zmienione na okno transferu w tle, gdy użytkownik kliknie „Tło”. Jednak w przypadku wtyczki cała operacja odbędzie się w tym samym wątku w tle. Ta metoda jest zalecana tylko w przypadku wtyczek, w których nie są potrzebne żadne dodatkowe połączenia dla wielu równoległych transferów lub gdzie dodatkowe połączenia są budowane bardzo szybko. Przykładem wtyczki korzystającej z tej metody jest wtyczka WinCE dla urządzeń z systemem Windows Mobile.
RemoteInfoStruct jest przekazywany do FsGetFile i FsRenMovFile. Zawiera szczegółowe informacje na temat kopiowanego pliku zdalnego.
Deklaracja:
typedef struct {
DWORD SizeLow,SizeHigh;
FILETIME LastWriteTime;
int Attr;
} RemoteInfoStruct;
Opis elementów struktury:
SizeLow, SizeHigh Niski i wysoki DWORD (32-bitowy każdy) rozmiaru pliku zdalnego. Przydatne jako wskaźnik postępu.
LastWriteTime Znacznik czasu pliku zdalnego - należy skopiować razem z plikiem.
Attr Atrybuty pliku zdalnego - należy je skopiować razem z plikiem.
Ważna nota:
Ta struktura jest przekazywana do FsGetFile i FsRenMovFile, aby ułatwić wtyczce kopiowanie pliku. Można oczywiście zignorować ten parametr.
WIN32_FIND_DATA jest używany przez FsFindFirst i FsFindNext. Jest zdefiniowany w Windows SDK.
Deklaracja:
typedef struct _WIN32_FIND_DATA {
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD dwReserved0;
DWORD dwReserved1;
TCHAR cFileName[ MAX_PATH ];
TCHAR cAlternateFileName[ 14 ];
} WIN32_FIND_DATA, *PWIN32_FIND_DATA;
Total Commander używa obecnie następujących elementów struktury:
dwFileAttributes Atrybuty pliku. Użyj co najmniej flagi FILE_ATTRIBUTE_DIRECTORY, aby rozróżnić pliki i katalogi. Linki należy zwrócić w postaci plików.
ftCreationTime Obecnie nieużywany. Jeśli jest dostępny, ustaw godzinę utworzenia pliku.
ftLastAccessTime Obecnie nieużywany. Jeśli jest dostępny, ustaw czas ostatniego dostępu do pliku.
ftLastWriteTime Znacznik czasu pokazywany na liście plików programu Total Commander i kopiowany z plikami. Użyj następujących ustawień dla plików, które nie mają czasu:
- ftLastWriteTime.dwHighDateTime=0xFFFFFFFF;
- ftLastWriteTime.dwLowDateTime=0xFFFFFFFE;
nFileSizeLow Niskie DWORD rozmiaru pliku
dwReserved0 W systemach Unix możesz | (lub) pole dwFileAttributes z wartością 0x80000000 i ustaw parametr dwReserved0 na tryb pliku Unix (uprawnienia). Zostaną one następnie pokazane w Totalcmd. Można je zmienić poprzez Pliki - Zmień atrybuty.
dwReserved1 Nieużywany, musi być ustawiony na 0. Zarezerwowany dla przyszłych ulepszeń wtyczek.
cFileName Lokalna nazwa pliku w stosunku do katalogu (bez ścieżki)
cAlternateFileName Nazwa pliku w stylu DOS (opcjonalnie), ustaw pierwszy znak na 0, jeśli nie jest używany.
Ważna nota:
Przed wypełnieniem pól należy wypełnić całą strukturę zerami, np. z memset(FindData,0,sizeof(WIN32_FIND_DATA));
FsDefaultParamStruct jest przekazywany do FsSetDefaultParams w celu poinformowania wtyczki o aktualnej wersji interfejsu wtyczki i lokalizacji pliku ini.
Deklaracja:
typedef struct {
int size;
DWORD PluginInterfaceVersionLow;
DWORD PluginInterfaceVersionHi;
char DefaultIniName[MAX_PATH];
} FsDefaultParamStruct;
Opis elementów struktury:
size Rozmiar struktury w bajtach. Późniejsze wersje interfejsu wtyczki mogą dodać więcej elementów struktury i odpowiednio dostosować to pole rozmiaru.
PluginInterfaceVersionLow Niska wartość wersji interfejsu wtyczki. To jest wartość po przecinku pomnożona przez 100! Przykład. W przypadku interfejsu wtyczki w wersji 1.3 najniższy DWORD to 30, a wysoki DWORD to 1.
PluginInterfaceVersionHi Wysoka wartość wersji interfejsu wtyczki.
DefaultIniName Sugerowana lokalizacja+nazwa pliku ini, w którym wtyczka może przechowywać swoje dane. Jest to w pełni kwalifikowana ścieżka + nazwa pliku, która będzie znajdować się w tym samym katalogu, co plik wincmd.ini. Zaleca się przechowywanie danych wtyczki w tym pliku lub przynajmniej w tym katalogu, ponieważ katalog wtyczek lub katalog Windows może nie nadawać się do zapisu!
ProgressProc to funkcja wywołania zwrotnego, którą wtyczka może wywołać, aby pokazać postęp kopiowania. Adres tej funkcji wywołania zwrotnego jest otrzymywany poprzez funkcję FsInit() podczas ładowania wtyczki.
Deklaracja:
int __stdcall ProgressProc(int PluginNr, char* SourceName, char* TargetName, int PercentDone);
Opis parametrów:
PluginNr W tym przypadku wtyczka musi przekazać numer wtyczki otrzymany przez funkcję FsInit().
SourceName Nazwa kopiowanego pliku źródłowego. W zależności od kierunku operacji (Get, Put) może to być lokalna nazwa pliku o nazwie w systemie plików wtyczki.
TargetName Nazwa, do której kopiowany jest plik.
PercentDone Procent kopiowania TEGO pliku. Total Commander automatycznie wyświetla drugi pasek procentowy, jeśli to możliwe, podczas kopiowania wielu plików.
Wartość zwracana:
Total Commander zwraca 1, jeśli użytkownik chce przerwać kopiowanie, i 0, jeśli operacja może być kontynuowana.
Ważna nota:
Powinieneś wywołać tę funkcję co najmniej dwukrotnie w funkcjach kopiowania FsGetFile(), FsPutFile() i FsRenMovFile(), na początku i na końcu. Jeśli nie możesz określić postępu, nazwij go 0% na początku i 100% na końcu.
Nowość w wersji 1.3: Podczas pętli FsFindFirst/FsFindNext/FsFindClose wtyczka może teraz wywołać ProgressProc, aby wyświetlić okno dialogowe postępu. Jest to przydatne w przypadku bardzo wolnych połączeń. Nie dzwoń do ProgressProc, aby uzyskać szybkie połączenia! Okno dialogowe postępu będzie wyświetlane tylko w przypadku normalnych zmian katalogów, a nie w przypadku operacji złożonych, takich jak get/put. Wywołania ProgressProc będą również ignorowane przez pierwsze 5 sekund, więc użytkownikowi nie będzie przeszkadzać okno dialogowe postępu przy każdej zmianie katalogu.
LogProc to funkcja wywołania zwrotnego, którą wtyczka może wywołać, aby wyświetlić pasek narzędzi połączeń FTP i przekazać do niego komunikaty dziennika. Totalcmd może wyświetlić te komunikaty w oknie dziennika (pasek narzędzi FTP) i zapisać je w pliku dziennika. Adres tej funkcji wywołania zwrotnego jest otrzymywany poprzez funkcję FsInit() podczas ładowania wtyczki.
Deklaracja:
void __stdcall LogProc(int PluginNr,int MsgType,char* LogString);
Opis parametrów:
PluginNr W tym przypadku wtyczka musi przekazać numer wtyczki otrzymany przez funkcję FsInit().
MsgType Może być jedną z flag MSGTYPE_XXX:
- MSGTYPE_CONNECT Połącz się z systemem plików wymagającym rozłączenia
- MSGTYPE_DISCONNECT Pomyślnie rozłączono
- MSGTYPE_DETAILS Nie tak ważne komunikaty, jak zmiana katalogu
- MSGTYPE_TRANSFERCOMPLETE Transfer pliku został pomyślnie zakończony
- MSGTYPE_CONNECTCOMPLETE nieużywany
- MSGTYPE_IMPORTANTERROR Wystąpił ważny błąd
- MSGTYPE_OPERATIONCOMPLETE Zakończono operację inną niż przesyłanie pliku
- Total Commander obsługuje logowanie do plików. Podczas gdy jeden plik dziennika będzie przechowywać wszystkie komunikaty, drugi będzie przechowywać tylko ważne błędy, połączenia, rozłączenia i zakończone operacje/transfery, ale nie będzie przechowywać komunikatów typu MSGTYPE_DETAILS.
- Gdy MsgType==MSGTYPE_CONNECT, ciąg MUSI mieć określony format:
- "CONNECT" , po którym następuje pojedyncza spacja, a następnie katalog główny systemu plików, który został podłączony, bez końcowego ukośnika odwrotnego. Przykład: CONNECT \System plików
- Gdy MsgType==MSGTYPE_TRANSFERCOMPLETE, parametr ten powinien zawierać zarówno nazwę źródłową, jak i docelową, oddzielone strzałką „ ->”, np.
- Pobieranie ukończone: \Filesystem\dir1\file1.txt -> c:\localdir\file1.txt
Nie ma wartości zwracanej.
Ważna nota:
NIE wywołuj LogProc z MSGTYPE_CONNECT, jeśli twoja wtyczka nie wymaga łączenia/rozłączania! Jeśli wywołasz ją za pomocą MsgType==MSGTYPE_CONNECT, funkcja FsDisconnect zostanie wywołana (jeśli została zdefiniowana), gdy użytkownik naciśnie przycisk Rozłącz.
Przykłady:
- FTP wymaga połączenia/rozłączenia, więc wywołaj LogProc z MSGTYPE_CONNECT, gdy połączenie zostanie nawiązane.
- Dostęp do lokalnych systemów plików (np. Linux EXT2) nie wymaga łączenia/rozłączania
RequestProc to funkcja wywołania zwrotnego, którą wtyczka może wywołać, aby poprosić użytkownika o wprowadzenie danych. W przypadku użycia jednego ze standardowych parametrów żądanie będzie w wybranym języku. Adres tej funkcji wywołania zwrotnego jest otrzymywany poprzez funkcję FsInit() podczas ładowania wtyczki.
Deklaracja:
BOOL __stdcall RequestProc(int PluginNr, int RequestType, char* CustomTitle, char* CustomText, char* ReturnedText, int maxlen);
Opis parametrów:
PluginNr W tym przypadku wtyczka musi przekazać numer wtyczki otrzymany przez funkcję FsInit().
RequestType Typ żądania Może być jedną z flag RT_XXX:
RT_Other Żądany ciąg nie jest żadnym z typów domyślnych
RT_UserName Zapytaj o nazwę użytkownika, np. dla połączenia
RT_Password Zapytaj o hasło, np. dla połączenia (pokazuje ***)
RT_Account Zapytaj o konto (wymagane w przypadku niektórych serwerów FTP)
RT_UserNameFirewall Nazwa użytkownika zapory sieciowej
RT_PasswordFirewall Hasło dla zapory sieciowej
RT_TargetDir pyta o katalog lokalny (z przyciskiem przeglądania)
RT_URL Pyta o adres URL
RT_MsgOK Wyświetla MessageBox z przyciskiem OK
RT_MsgYesNo Pokazuje MessageBox z przyciskami Tak/Nie
RT_MsgOKCancel Wyświetla MessageBox z przyciskami OK/Anuluj
CustomTitle Niestandardowy tytuł okna dialogowego. Jeśli NULL lub jest pusty, będzie to „Total Commander”
CustomText Zastąp tekst zdefiniowany za pomocą RequestType. Ustaw tę wartość na NULL lub pusty ciąg, aby użyć tekstu domyślnego. Domyślny tekst zostanie przetłumaczony na język ustawiony w programie wywołującym.
ReturnedText Ten ciąg zawiera domyślny tekst prezentowany użytkownikowi i otrzyma (zmodyfikowany) tekst wprowadzony przez użytkownika. ustaw ReturnedText[0]=0, aby nie mieć domyślnego tekstu.
maxlen Maksymalna dozwolona długość zwracanego tekstu. Wskaźnik ReturnedText musi wskazywać bufor, który może pomieścić co najmniej maxlen znaków.
Wartość zwracana:
Zwraca wartość PRAWDA, jeśli użytkownik kliknął OK lub Tak, w przeciwnym razie FAŁSZ.
Ważna nota:
Jeśli chcesz użyć (przetłumaczonych) ciągów domyślnych, pozostaw pole CustomText puste!
CryptProc to funkcja wywołania zwrotnego, którą wtyczka może wywołać w celu przechowywania haseł w bezpiecznym magazynie haseł, odczytywania ich lub kopiowania do nowego połączenia.
Deklaracja:
int __stdcall CryptProc(int PluginNr, int CryptoNumber, int mode, char* ConnectionName, char* Password, int maxlen);
Opis parametrów:
PluginNr W tym przypadku wtyczka musi przekazać numer wtyczki otrzymany przez funkcję FsInit().
CryptoNumber W tym przypadku wtyczka musi przekazać numer kryptograficzny otrzymany za pomocą funkcji FsSetCryptCallback().
mode Tryb pracy:
- FS_CRYPT_SAVE_PASSWORD: Zapisz hasło w magazynie haseł
- FS_CRYPT_LOAD_PASSWORD: Załaduj hasło z magazynu haseł
- FS_CRYPT_LOAD_PASSWORD_NO_UI: Załaduj hasło tylko wtedy, gdy zostało już wprowadzone hasło główne
- FS_CRYPT_COPY_PASSWORD: Skopiuj hasło do nowego połączenia. Tutaj drugi parametr ciągu „Hasło” nie jest hasłem, ale nazwą połączenia docelowego
- FS_CRYPT_MOVE_PASSWORD: Jak wyżej, ale usuń hasło źródłowe
- FS_CRYPT_DELETE_PASSWORD: Usuń hasło danego połączenia
Password Hasło Specyficzne dla operacji, zwykle hasło do przechowywania/odzyskania lub połączenie docelowe podczas kopiowania/przenoszenia połączenia
maxlen Maksymalna długość w znakach, jaką bufor haseł może przechowywać podczas wywoływania jednej z funkcji ładowania
Wartość zwracana:
Total Commander zwraca jedną z następujących wartości:
FS_FILE_OK Sukces
FS_FILE_NOTSUPPORTED Szyfrowanie/odszyfrowywanie nie powiodło się
FS_FILE_WRITEERROR Nie można zapisać hasła w magazynie haseł
FS_FILE_READERROR Hasło nie zostało znalezione w magazynie haseł
FS_FILE_NOTFOUND Nie wprowadzono jeszcze hasła głównego
Notatka:
Zobacz źródła wtyczek WebDAV, aby zapoznać się z przykładem korzystania z tych funkcji. Pokazując szczegóły istniejącego połączenia, powinieneś najpierw wywołać FS_CRYPT_LOAD_PASSWORD_NO_UI. W przypadku błędu FS_FILE_NOTFOUND pokaż przycisk „Edytuj hasło”. Wywołuj FS_CRYPT_LOAD_PASSWORD tylko wtedy, gdy użytkownik kliknie ten przycisk lub spróbuje się połączyć. Dzięki temu użytkownik nie musi wpisywać hasła głównego, jeśli chce po prostu dokonać innych zmian w ustawieniach połączenia.
Każda wtyczka może mieć ikonę w Otoczeniu sieciowym po lewej stronie jej nazwy. Totalcmd załaduje PIERWSZĄ ikonę, jaką może znaleźć (według indeksu) w bibliotece DLL wtyczki, więc po prostu dołącz plik zasobów zawierający dokładnie jedną ikonę. Ikona powinna zawierać co najmniej jeden obraz o wymiarach 16x16 pikseli, chociaż większe obrazy zostaną zmniejszone w celu wyświetlenia w Totalcmd. Jeśli w bibliotece DLL wtyczki nie ma żadnej ikony, Totalcmd wyświetli domyślną ikonę folderu.
Ikony w podfolderach zostaną określone w normalnym procesie kojarzenia plików w systemie Windows.
W Total Commander 7.5 (interfejs wtyczki fs 2.0) do wszystkich typów wtyczek dodano obsługę Unicode. W zasadzie należy zaimplementować te same funkcje, co w przypadku ANSI, z dwiema różnicami: nazwa funkcji zostaje zmieniona z FunctionName na FunctionNameW, a ciągi znaków ANSI zostają zmienione na szerokie nazwy znaków.
Total Commander wywoła funkcje Unicode we wszystkich systemach opartych na NT (Windows NT, 2000, XP, Vista, 7), jeśli są one obecne. Jeśli nie, lub w systemie Windows 9x/ME, Total Commander wywoła funkcje ANSI.
WAŻNE OSTRZEŻENIE: Gdy zaimplementowano FsFindFirstW, dowolne pole Path może mieć długość do 1023 znaków! Upewnij się, że Twoja wtyczka używa buforów o długości 1024 znaków zarówno w funkcjach ANSI, jak i Unicode, lub przynajmniej nie ulega awarii w przypadku tak długich ciągów.
Następujące funkcje interfejsu wtyczek systemu plików obsługują Unicode:
FsInitW
FsFindFirstW
FsFindNextW
FsSetCryptCallbackW
FsGetFileW
FsPutFileW
FsDeleteFileW
FsRemoveDirW
FsRenMovFileW
FsMkDirW
FsSetAttrW
FsSetTimeW
FsExecuteFileW
FsDisconnectW
FsStatusInfoW
FsExtractCustomIconW
FsGetPreviewBitmapW
FsGetLocalNameW
FsContentGetValueW
FsContentStopGetValueW
FsContentSetValueW
FsContentGetDefaultViewW
Następujące funkcje nie istnieją w formie Unicode i muszą być zaimplementowane jako ANSI:
FsFindClose
FsGetDefRootName
FsSetDefaultParams
FsLinksToLocalFiles
FsContentGetSupportedField - nazwy pól MUSZĄ być w formacie ANSI!
FsContentGetSupportedFieldFlags
FsContentGetDefaultSortOrder
FsContentPluginUnloading
Jaki jest najłatwiejszy sposób obsługi Unicode w istniejącej wtyczce?
W rzeczywistości istnieją dwa sposoby: wtyczka Unicode/ANSI 'wszystko w jednym' i dwie oddzielne wtyczki.
A. Połączona wtyczka Unicode/ANSI
- Pobierz moją przykładową wtyczkę fsplugin (sekcja wtyczek systemu plików), nawet jeśli piszesz inny typ wtyczki!
- Dodaj pliki cunicode.h i cunicode.cpp do swojego projektu. Zawierają różne funkcje ułatwiające obsługę Unicode.
- Przekonwertuj istniejące funkcje na Unicode i zmień ich nazwę na FunctionNameW. W przypadku wszystkich funkcji plikowych, takich jak CreateFile, nie wywołuj bezpośrednio ich odpowiednika w Unicode CreateFileW. Zamiast tego wywołaj funkcje z pliku cunicode.cpp, np. CreateFileT. Funkcje te automatycznie wywołują właściwą funkcję Unicode lub ANSI i obsługują nawet nazwy plików o długości >259 znaków!
- Dla każdej skonwertowanej funkcji, np. FunctionNameW, utwórz funkcję FunctionName, którą wywołasz w ten sposób:
int __stdcall FunctionName(char* SomeString1,char* SomeString2)
{
WCHAR SomeString1W[wdirtypemax],SomeString2W[wdirtypemax];
return FunctionNameW(awfilenamecopy(SomeString1W,SomeString1),awfilenamecopy(SomeString2W,SomeString2));
}
Zobacz implementację FsContentGetValue w powyższej wtyczce, aby poznać funkcję, która musi zwracać wartości łańcuchowe.
Makro awfilenamecopy przekonwertuje ciąg ANSI SomeString1 na Unicode i zapisze go w SomeString1W. Ta zmienna nie może być wskaźnikiem, ponieważ awfilenamecopy używa "countof" , aby uzyskać docelową długość.
B. Dwie oddzielne wtyczki, jedna Unicode, jedna ANSI Ta metoda jest szczególnie odpowiednia dla wtyczek C/C++. Przejrzyj źródła wtyczek WebDAV, aby znaleźć przykładową wtyczkę korzystającą z tej metody. Oto kroki, jak przekonwertować wtyczkę ANSI na Unicode w ten sposób:
- Zamień wszystkie odniesienia do ciągów znaków, takie jak char* i LPSTR, na TCHAR*
- Zastąp wszystkie funkcje obsługi ciągów, takie jak strchr lub strcpy, przez _tcschr i _tcscpy
- Umieść TEXT() wokół wszystkich stałych łańcuchowych
- Utwórz kopię bieżącego projektu w ramach tej samej mapy projektu. Dodaj definicje UNICODE i _UNICODE w ustawieniach kompilatora projektu Unicode
- Usuń plik .def z projektu Unicode. Utwórz nowy plik .def, w którym funkcje są zdefiniowane w następujący sposób:
FsFindFirstW=FsFindFirst FsFindNextW=FsFindNext FsFindZamknij ...
- Zwróć uwagę na różnicę między funkcjami Unicode i innymi funkcjami (patrz lista powyżej, które obsługują Unicode)
- 6. Ustaw plik wyjściowy na nazwę <nazwa wtyczki>.uwfx, w tym samym katalogu co plik .wfx z pierwszego projektu
Nota: nie możesz mieć samej wtyczki .uwfx, jeśli chcesz utworzyć wtyczkę obsługującą tylko Unicode! Zamiast tego utwórz połączoną wtyczkę Unicode/ANSI, w której funkcje ANSI są po prostu pustymi funkcjami zwracającymi błąd.
Razem z Total Commander 8, Total Commander jest teraz dostępny także w wersji 64-bitowej. Ponieważ wtyczki są prostymi bibliotekami DLL, a programy 64-bitowe mogą ładować tylko 64-bitowe biblioteki DLL, wtyczka musi zostać ponownie skompilowana przy użyciu 64-bitowego kompilatora, aby działała z 64-bitowym programem Total Commander.
WAŻNE: Wtyczka 64-bitowa musi mieć taką samą nazwę jak wtyczka 32-bitowa i znajdować się w tym samym katalogu, ale do rozszerzenia należy dodać liczbę '64'. Przykład: system plików.wfx -> system plików.wfx64. Wtyczki 64-bitowe również muszą kończyć się na '64'.
Ponieważ wszystkie 64-bitowe wersje systemu Windows obsługują Unicode, wystarczy napisać 64-bitową wtyczkę obsługującą tylko Unicode. Jeśli jednak Twoja istniejąca wtyczka 32-bitowa obsługuje tylko funkcje ANSI, możesz ją przenieść bez modyfikacji do wersji 64-bitowej. Total Commander 64-bit obsługuje także funkcje ANSI, jeśli nie może znaleźć funkcji Unicode. 64-bitowe wtyczki Unicode nie mają rozszerzenia rozpoczynającego się od 'u' , mają normalne rozszerzenie 'wfx64' .
Kilka uwag dotyczących przenoszenia: Wszystkie parametry całkowite w funkcjach wtyczek pozostają 32-bitowe (np. w C: int, long, DWORD; Delphi: integer, dword), tylko wskaźniki i uchwyty mają teraz szerokość 64-bitową. Ponowna kompilacja programu lub biblioteki DLL za pomocą 64-bitowego kompilatora zwykle rozwiązuje ten problem automatycznie i nie wymaga wielu zmian. Podczas konwersji wskaźników na liczbę całkowitą i odwrotnie mogą pojawić się problemy. Upewnij się, że do takich operacji używasz 64-bitowych zmiennych całkowitych (np. size_t w C, ptrint lub ptruint w Lazarusie).
Jaki jest najłatwiejszy sposób przekonwertowania istniejącej wtyczki na wersję 64-bitową?
1. Jeżeli wtyczka została napisana w języku C lub C++:
Jeśli masz program Visual Studio Professional 2005 lub nowszy, 64-bitowy kompilator jest już dołączony. Jeśli korzystasz z bezpłatnej wersji Express ~Community lub programu Visual Studio 2003, oprócz programu Visual Studio Express musisz zainstalować zestaw Windows Software Development Kit (SDK)
Oto jak dodać obsługę wersji 64-bitowej do istniejącej wtyczki:
- Sprawdź paski narzędzi w Visual Studio: Istnieją comboboxy dla typu kompilacji (Debugowanie lub Wydanie) oraz jeden, który pokazuje "Win32".
- Otwórz ten, który wyświetla "Win32" i kliknij "Menedżer konfiguracji".
- Kliknij "Nowy" na liście aktywnych platform rozwiązań (po prawej stronie). Wyświetlone zostanie nowe okno dialogowe „Nowa platforma rozwiązań”.
- W górnym polu wybierz "x64"
- W dolnym polu "skopiuj z" wybierz "Win32"
- Upewnij się, że checkbox "Utwórz nową platformę projektu" jest włączony
- Kliknij OK
- Zobacz też: http://msdn.microsoft.com/en-us/library/9yb4317s.aspx
- 8. Teraz możesz przełączać się w tym samym projekcie pomiędzy Win32 i x64. Przełącz na x64.
- 9. Otwórz ustawienia swojego projektu.
- 10. Należy ustawić następujące opcje:
C++ — Generowanie kodu — biblioteka uruchomieniowa: Debugowanie wielowątkowe (/Mtd) <- nie biblioteka debugowania wielowątkowego!
Linker - Ogólne - plik wyjściowy: wfx/nazwa wtyczki.wfx64
Linki pobierania:
1. Wersja Visual Studio Express C++:
http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-cpp-express
2. Zestaw programistyczny dla systemu Windows (SDK):
http://msdn.microsoft.com/en-us/windows/bb980924.aspx
2. Jeżeli wtyczka została napisana w języku Delphi lub Free Pascal:
Dostępny jest 64-bitowy Lazarus/Free Pascal, którego można używać do tworzenia 64-bitowych bibliotek DLL. Sam Total Commander został skompilowany przy użyciu Lazarusa jako aplikacja 64-bitowa. W menu "Narzędzia" znajdują się pozycje menu umożliwiające konwersję projektów i formularzy Delphi do Lazarusa.
Lazarus/Free Pascal działa nieco inaczej niż Delphi, więc niektóre funkcje mogą wymagać zmiany. Oto problemy napotkane podczas przenoszenia Total Commandera:
- Free Pascal jest inny -> Użyj {$MODE Delphi} we wszystkich plikach *.pas, aby obsługiwać funkcje w sposób Delphi
- strnew tworzy wskaźnik NIL, gdy przekazany phar ma długość 0 bajtów. -> Użyj własnej funkcji strnew.
- Komunikaty systemu Windows poniżej WM_USER nie są przekazywane do procedury systemu Windows. -> Użyj SetWindowLongPtr, aby podklasować okno
- Obliczenie p-buffer nie działa, gdy p jest pwidecharem, buforuj tablicę widechar -> użyj p-pwidechar(@buffer)
- INVALID_HANDLE_VALUE jest niepoprawnie ustawione na 0 zamiast -1 w lcltype.pp! -> Umieść "windows" na końcu polecenia "uses".
Powinieneś pobrać i zainstalować 64-bitową codzienną migawkę z
http://www.lazarus.freepascal.org/
Kliknij w "Zrzuty dzienne", a następnie np. Lazarus + fpc 2.4.4 win64
Ostateczne wersje są bardzo przestarzałe, więc migawki zwykle działają znacznie lepiej.
// identyfikatory dla FsGetFile
#define FS_FILE_OK 0
#define FS_FILE_EXISTS 1
#define FS_FILE_NOTFOUND 2
#define FS_FILE_READERROR 3
#define FS_FILE_WRITEERROR 4
#define FS_FILE_USERABORT 5
#define FS_FILE_NOTSUPPORTED 6
#define FS_FILE_EXISTSRESUMEALLOWED 7
#define FS_EXEC_OK 0
#define FS_EXEC_ERROR 1
#define FS_EXEC_YOURSELF -1
#define FS_EXEC_SYMLINK -2
#define FS_COPYFLAGS_OVERWRITE 1
#define FS_COPYFLAGS_RESUME 2
#define FS_COPYFLAGS_MOVE 4
#define FS_COPYFLAGS_EXISTS_SAMECASE 8
#define FS_COPYFLAGS_EXISTS_DIFFERENTCASE 16
// flagi dla tRequestProc
#define RT_Other 0
#define RT_UserName 1
#define RT_Password 2
#define RT_Account 3
#define RT_UserNameFirewall 4
#define RT_PasswordFirewall 5
#define RT_TargetDir 6
#define RT_URL 7
#define RT_MsgOK 8
#define RT_MsgYesNo 9
#define RT_MsgOKCancel 10
// flagi dla tLogProc
#define MSGTYPE_CONNECT 1
#define MSGTYPE_DISCONNECT 2
#define MSGTYPE_DETAILS 3
#define MSGTYPE_TRANSFERCOMPLETE 4
#define MSGTYPE_CONNECTCOMPLETE 5
#define MSGTYPE_IMPORTANTERROR 6
#define MSGTYPE_OPERATIONCOMPLETE 7
// flagi dla FsStatusInfo
#define FS_STATUS_START 0
#define FS_STATUS_END 1
#define FS_STATUS_OP_LIST 1
#define FS_STATUS_OP_GET_SINGLE 2
#define FS_STATUS_OP_GET_MULTI 3
#define FS_STATUS_OP_PUT_SINGLE 4
#define FS_STATUS_OP_PUT_MULTI 5
#define FS_STATUS_OP_RENMOV_SINGLE 6
#define FS_STATUS_OP_RENMOV_MULTI 7
#define FS_STATUS_OP_DELETE 8
#define FS_STATUS_OP_ATTRIB 9
#define FS_STATUS_OP_MKDIR 10
#define FS_STATUS_OP_EXEC 11
#define FS_STATUS_OP_CALCSIZE 12
#define FS_STATUS_OP_SEARCH 13
#define FS_STATUS_OP_SEARCH_TEXT 14
#define FS_STATUS_OP_SYNC_SEARCH 15
#define FS_STATUS_OP_SYNC_GET 16
#define FS_STATUS_OP_SYNC_PUT 17
#define FS_STATUS_OP_SYNC_DELETE 18
#define FS_STATUS_OP_GET_MULTI_THREAD 19
#define FS_STATUS_OP_PUT_MULTI_THREAD 20
#define FS_ICONFLAG_SMALL 1
#define FS_ICONFLAG_BACKGROUND 2
#define FS_ICON_USEDEFAULT 0
#define FS_ICON_EXTRACTED 1
#define FS_ICON_EXTRACTED_DESTROY 2
#define FS_ICON_DELAYED 3
#define FS_BITMAP_NONE 0
#define FS_BITMAP_EXTRACTED 1
#define FS_BITMAP_EXTRACT_YOURSELF 2
#define FS_BITMAP_EXTRACT_YOURSELF_ANDDELETE 3
#define FS_BITMAP_CACHE 256
#define FS_CRYPT_SAVE_PASSWORD 1
#define FS_CRYPT_LOAD_PASSWORD 2
#define FS_CRYPT_LOAD_PASSWORD_NO_UI 3 // Załaduj hasło tylko wtedy, gdy hasło główne zostało już
wprowadzone!
#define FS_CRYPT_COPY_PASSWORD 4 // Skopiuj zaszyfrowane hasło do nowej nazwy połączenia
#define FS_CRYPT_MOVE_PASSWORD 5 // Przenieś hasło podczas zmiany nazwy połączenia
#define FS_CRYPT_DELETE_PASSWORD 6 // Usuń hasło
#define FS_CRYPTOPT_MASTERPASS_SET 1 // Użytkownik ma już zdefiniowane hasło główne
#define BG_DOWNLOAD 1 // Wtyczka obsługuje pobieranie w tle
#define BG_UPLOAD 2 // Wtyczka obsługuje przesyłanie w tle
#define BG_ASK_USER 4 // Wtyczka wymaga osobnego połączenia dla transferów w tle ->
najpierw zapytaj użytkownika
typedef struct {
DWORD SizeLow,SizeHigh;
FILETIME LastWriteTime;
int Attr;
} RemoteInfoStruct;
typedef struct {
int size;
DWORD PluginInterfaceVersionLow;
DWORD PluginInterfaceVersionHi;
char DefaultIniName[MAX_PATH];
} FsDefaultParamStruct;
// funkcje wywołania zwrotnego
typedef int (__stdcall *tProgressProc)(int PluginNr,char* SourceName,
char* TargetName,int PercentDone);
typedef int (__stdcall *tProgressProcW)(int PluginNr,WCHAR* SourceName,
WCHAR* TargetName,int PercentDone);
typedef void (__stdcall *tLogProc)(int PluginNr,int MsgType,char* LogString);
typedef void (__stdcall *tLogProcW)(int PluginNr,int MsgType,WCHAR* LogString);
typedef BOOL (__stdcall *tRequestProc)(int PluginNr,int RequestType,char* CustomTitle,
char* CustomText,char* ReturnedText,int maxlen);
typedef BOOL (__stdcall *tRequestProcW)(int PluginNr,int RequestType,WCHAR* CustomTitle,
WCHAR* CustomText,WCHAR* ReturnedText,int maxlen);
typedef int (__stdcall *tCryptProc)(int PluginNr,int CryptoNr,int Mode,
char* ConnectionName,char* Password,int maxlen);
typedef int (__stdcall *tCryptProcW)(int PluginNr,int CryptoNr,int Mode,
WCHAR* ConnectionName,WCHAR* Password,int maxlen);
// Prototypy funkcji
int __stdcall FsInit(int PluginNr,tProgressProc pProgressProc,
tLogProc pLogProc,tRequestProc pRequestProc);
int __stdcall FsInitW(int PluginNr,tProgressProcW pProgressProcW,
tLogProcW pLogProcW,tRequestProcW pRequestProcW);
void __stdcall FsSetCryptCallback(tCryptProc pCryptProc,int CryptoNr,int Flags);
void __stdcall FsSetCryptCallbackW(tCryptProcW pCryptProcW,int CryptoNr,int Flags);
HANDLE __stdcall FsFindFirst(char* Path,WIN32_FIND_DATA *FindData);
HANDLE __stdcall FsFindFirstW(WCHAR* Path,WIN32_FIND_DATAW *FindData);
BOOL __stdcall FsFindNext(HANDLE Hdl,WIN32_FIND_DATA *FindData);
BOOL __stdcall FsFindNextW(HANDLE Hdl,WIN32_FIND_DATAW *FindData);
int __stdcall FsFindClose(HANDLE Hdl);
BOOL __stdcall FsMkDir(char* Path);
BOOL __stdcall FsMkDirW(WCHAR* Path);
int __stdcall FsExecuteFile(HWND MainWin,char* RemoteName,char* Verb);
int __stdcall FsExecuteFileW(HWND MainWin,WCHAR* RemoteName,WCHAR* Verb);
int __stdcall FsRenMovFile(char* OldName,char* NewName,BOOL Move,
BOOL OverWrite,RemoteInfoStruct* ri);
int __stdcall FsRenMovFileW(WCHAR* OldName,WCHAR* NewName,BOOL Move,
BOOL OverWrite,RemoteInfoStruct* ri);
int __stdcall FsGetFile(char* RemoteName,char* LocalName,int CopyFlags,
RemoteInfoStruct* ri);
int __stdcall FsGetFileW(WCHAR* RemoteName,WCHAR* LocalName,int CopyFlags,
RemoteInfoStruct* ri);
int __stdcall FsPutFile(char* LocalName,char* RemoteName,int CopyFlags);
int __stdcall FsPutFileW(WCHAR* LocalName,WCHAR* RemoteName,int CopyFlags);
BOOL __stdcall FsDeleteFile(char* RemoteName);
BOOL __stdcall FsDeleteFileW(WCHAR* RemoteName);
BOOL __stdcall FsRemoveDir(char* RemoteName);
BOOL __stdcall FsRemoveDirW(WCHAR* RemoteName);
BOOL __stdcall FsDisconnect(char* DisconnectRoot);
BOOL __stdcall FsDisconnectW(WCHAR* DisconnectRoot);
BOOL __stdcall FsSetAttr(char* RemoteName,int NewAttr);
BOOL __stdcall FsSetAttrW(WCHAR* RemoteName,int NewAttr);
BOOL __stdcall FsSetTime(char* RemoteName,FILETIME *CreationTime,
FILETIME *LastAccessTime,FILETIME *LastWriteTime);
BOOL __stdcall FsSetTimeW(WCHAR* RemoteName,FILETIME *CreationTime,
FILETIME *LastAccessTime,FILETIME *LastWriteTime);
void __stdcall FsStatusInfo(char* RemoteDir,int InfoStartEnd,int InfoOperation);
void __stdcall FsStatusInfoW(WCHAR* RemoteDir,int InfoStartEnd,int InfoOperation);
void __stdcall FsGetDefRootName(char* DefRootName,int maxlen);
int __stdcall FsExtractCustomIcon(char* RemoteName,int ExtractFlags,HICON* TheIcon);
int __stdcall FsExtractCustomIconW(WCHAR* RemoteName,int ExtractFlags,HICON* TheIcon);
void __stdcall FsSetDefaultParams(FsDefaultParamStruct* dps);
int __stdcall FsGetPreviewBitmap(char* RemoteName,int width,int height,HBITMAP* ReturnedBitmap);
int __stdcall FsGetPreviewBitmapW(WCHAR* RemoteName,int width,int height,HBITMAP* ReturnedBitmap);
BOOL __stdcall FsLinksToLocalFiles(void);
BOOL __stdcall FsGetLocalName(char* RemoteName,int maxlen);
BOOL __stdcall FsGetLocalNameW(WCHAR* RemoteName,int maxlen);
// ************************** rozszerzenie wtyczki treści ****************************
//
#define ft_nomorefields 0
#define ft_numeric_32 1
#define ft_numeric_64 2
#define ft_numeric_floating 3
#define ft_date 4
#define ft_time 5
#define ft_boolean 6
#define ft_multiplechoice 7
#define ft_string 8
#define ft_fulltext 9
#define ft_datetime 10
#define ft_stringw 11 // Powinien być zwracany tylko przez funkcję Unicode
// dla FsContentGetValue
#define ft_nosuchfield -1 // błąd, podano nieprawidłowy numer pola
#define ft_fileerror -2 // błąd we/wy pliku
#define ft_fieldempty -3 // pole prawidłowe, ale puste
#define ft_ondemand -4 // pole zostanie pobrane dopiero po naciśnięciu klawisza <SPACJA>
#define ft_delayed 0 // wyodrębnienie pola zajmuje dużo czasu -> spróbuj ponownie w tle
// dla FsContentSetValue
#define ft_setsuccess 0 // ustawienie atrybutu powiodło się
// dla FsContentGetSupportedFieldFlags
#define contflags_edit 1
#define contflags_substsize 2
#define contflags_substdatetime 4
#define contflags_substdate 6
#define contflags_substtime 8
#define contflags_substattributes 10
#define contflags_substattributestr 12
#define contflags_substmask 14
// dla FsContentSetValue
#define setflags_first_attribute 1 // Pierwszy atrybut tego pliku
#define setflags_last_attribute 2 // Ostatni atrybut tego pliku
#define setflags_only_date 4 // Ustaw tylko datę wartości datetime!
#define CONTENT_DELAYIFSLOW 1 // ContentGetValue wywoływana na pierwszym planie
typedef struct {
int size;
DWORD PluginInterfaceVersionLow;
DWORD PluginInterfaceVersionHi;
char DefaultIniName[MAX_PATH];
} ContentDefaultParamStruct;
typedef struct {
WORD wYear;
WORD wMonth;
WORD wDay;
} tdateformat,*pdateformat;
typedef struct {
WORD wHour;
WORD wMinute;
WORD wSecond;
} ttimeformat,*ptimeformat;
int __stdcall FsContentGetSupportedField(int FieldIndex,char* FieldName,char* Units,int maxlen);
int __stdcall FsContentGetValue(char* FileName,int FieldIndex,int UnitIndex,void* FieldValue,int maxlen,int
flags);
int __stdcall FsContentGetValueW(WCHAR* FileName,int FieldIndex,int UnitIndex,void* FieldValue,int
maxlen,int flags);
void __stdcall FsContentStopGetValue(char* FileName);
void __stdcall FsContentStopGetValueW(WCHAR* FileName);
int __stdcall FsContentGetDefaultSortOrder(int FieldIndex);
void __stdcall FsContentPluginUnloading(void);
int __stdcall FsContentGetSupportedFieldFlags(int FieldIndex);
int __stdcall FsContentSetValue(char* FileName,int FieldIndex,int UnitIndex,int FieldType,void*
FieldValue,int flags);
int __stdcall FsContentSetValueW(WCHAR* FileName,int FieldIndex,int UnitIndex,int FieldType,void*
FieldValue,int flags);
BOOL __stdcall FsContentGetDefaultView(char* ViewContents,char* ViewHeaders,char* ViewWidths,char*
ViewOptions,int maxlen);
BOOL __stdcall FsContentGetDefaultViewW(WCHAR* ViewContents,WCHAR* ViewHeaders,WCHAR* ViewWidths,WCHAR*
ViewOptions,int maxlen);
int __stdcall FsGetBackgroundFlags(void);
interface
uses windows;
{ ids for FsGetFile }
const FS_FILE_OK=0;
FS_FILE_EXISTS=1;
FS_FILE_NOTFOUND=2;
FS_FILE_READERROR=3;
FS_FILE_WRITEERROR=4;
FS_FILE_USERABORT=5;
FS_FILE_NOTSUPPORTED=6;
FS_FILE_EXISTSRESUMEALLOWED=7;
FS_EXEC_OK=0;
FS_EXEC_ERROR=1;
FS_EXEC_YOURSELF=-1;
FS_EXEC_SYMLINK=-2;
FS_COPYFLAGS_OVERWRITE=1;
FS_COPYFLAGS_RESUME=2;
FS_COPYFLAGS_MOVE=4;
FS_COPYFLAGS_EXISTS_SAMECASE=8;
FS_COPYFLAGS_EXISTS_DIFFERENTCASE=16;
{ flags for tRequestProc }
const
RT_Other=0;
RT_UserName=1;
RT_Password=2;
RT_Account=3;
RT_UserNameFirewall=4;
RT_PasswordFirewall=5;
RT_TargetDir=6;
RT_URL=7;
RT_MsgOK=8;
RT_MsgYesNo=9;
RT_MsgOKCancel=10;
{ flags for tLogProc }
const msgtype_connect=1;
msgtype_disconnect=2;
msgtype_details=3;
msgtype_transfercomplete=4;
msgtype_connectcomplete=5;
msgtype_importanterror=6;
msgtype_operationcomplete=7;
{ flags for FsStatusInfo }
const FS_STATUS_START=0;
FS_STATUS_END=1;
FS_STATUS_OP_LIST=1;
FS_STATUS_OP_GET_SINGLE=2;
FS_STATUS_OP_GET_MULTI=3;
FS_STATUS_OP_PUT_SINGLE=4;
FS_STATUS_OP_PUT_MULTI=5;
FS_STATUS_OP_RENMOV_SINGLE=6;
FS_STATUS_OP_RENMOV_MULTI=7;
FS_STATUS_OP_DELETE=8;
FS_STATUS_OP_ATTRIB=9;
FS_STATUS_OP_MKDIR=10;
FS_STATUS_OP_EXEC=11;
FS_STATUS_OP_CALCSIZE=12;
FS_STATUS_OP_SEARCH=13;
FS_STATUS_OP_SEARCH_TEXT=14;
FS_STATUS_OP_SYNC_SEARCH=15;
FS_STATUS_OP_SYNC_GET=16;
FS_STATUS_OP_SYNC_PUT=17;
FS_STATUS_OP_SYNC_DELETE=18;
FS_STATUS_OP_GET_MULTI_THREAD=19;
FS_STATUS_OP_PUT_MULTI_THREAD=20;
{Flags for FsExtractCustomIcon}
const FS_ICONFLAG_SMALL=1;
FS_ICONFLAG_BACKGROUND=2;
FS_ICON_USEDEFAULT=0;
FS_ICON_EXTRACTED=1;
FS_ICON_EXTRACTED_DESTROY=2;
FS_ICON_DELAYED=3;
const FS_BITMAP_NONE=0;
FS_BITMAP_EXTRACTED=1;
FS_BITMAP_EXTRACT_YOURSELF=2;
FS_BITMAP_EXTRACT_YOURSELF_ANDDELETE=3;
FS_BITMAP_CACHE=256;
{Flags for crypto callback function}
FS_CRYPT_SAVE_PASSWORD=1;
FS_CRYPT_LOAD_PASSWORD=2;
FS_CRYPT_LOAD_PASSWORD_NO_UI=3; {Load password only if master password has already been entered!}
FS_CRYPT_COPY_PASSWORD=4;
FS_CRYPT_MOVE_PASSWORD=5;
FS_CRYPT_DELETE_PASSWORD=6;
FS_CRYPTOPT_MASTERPASS_SET=1; {The user already has a master password defined}
BG_DOWNLOAD=1; { Plugin supports downloads in background }
BG_UPLOAD=2; { Plugin supports uploads in background }
BG_ASK_USER=4; { Plugin requires separate connection for background transfers -> ask user first }
type
tRemoteInfo=record
SizeLow,SizeHigh:longint;
LastWriteTime:TFileTime;
Attr:longint;
end;
pRemoteInfo=^tRemoteInfo;
type
tFsDefaultParamStruct=record
size,
PluginInterfaceVersionLow,
PluginInterfaceVersionHi:longint;
DefaultIniName:array[0..MAX_PATH-1] of char;
end;
pFsDefaultParamStruct=^tFsDefaultParamStruct;
{ callback functions }
type
TProgressProc=function(PluginNr:integer;SourceName,
TargetName:pchar;PercentDone:integer):integer; stdcall;
TProgressProcW=function(PluginNr:integer;SourceName,
TargetName:pwidechar;PercentDone:integer):integer; stdcall;
TLogProc=procedure(PluginNr,MsgType:integer;LogString:pchar); stdcall;
TLogProcW=procedure(PluginNr,MsgType:integer;LogString:pwidechar); stdcall;
TRequestProc=function(PluginNr,RequestType:integer;CustomTitle,CustomText,
ReturnedText:pchar;maxlen:integer):bool; stdcall;
TRequestProcW=function(PluginNr,RequestType:integer;CustomTitle,CustomText,
ReturnedText:pwidechar;maxlen:integer):bool; stdcall;
PCryptProc=^TCryptProc;
TCryptProc=function(PluginNr,CryptoNumber:integer;mode:integer;ConnectionName,
Password:pchar;maxlen:integer):integer; stdcall;PCryptProcW=^TCryptProcW;
TCryptProcW=function(PluginNr,CryptoNumber:integer;mode:integer;ConnectionName,
Password:pwidechar;maxlen:integer):integer; stdcall;
{ Function prototypes - the callback functions MUST be implemented exactly like this! }
{
function FsInit(PluginNr:integer;pProgressProc:tProgressProc;pLogProc:tLogProc;
pRequestProc:tRequestProc):integer; stdcall;
function FsInitW(PluginNr:integer;pProgressProcW:tProgressProcW;pLogProcW:tLogProcW;
pRequestProcW:tRequestProcW):integer; stdcall;
procedure FsSetCryptCallback(CryptProc:TCryptProc;CryptoNr,Flags:integer); stdcall;
procedure FsSetCryptCallbackW(CryptProcW:TCryptProcW;CryptoNr,Flags:integer); stdcall;
function FsFindFirst(path :pchar;var FindData:tWIN32FINDDATA):thandle; stdcall;
function FsFindFirstW(path :pwidechar;var FindData:tWIN32FINDDATAW):thandle; stdcall;
function FsFindNext(Hdl:thandle;var FindData:tWIN32FINDDATA):bool; stdcall;
function FsFindNextW(Hdl:thandle;var FindDataW:tWIN32FINDDATAW):bool; stdcall;
function FsFindClose(Hdl:thandle):integer; stdcall;
function FsMkDir(RemoteDir:pchar):bool; stdcall;
function FsMkDirW(RemoteDir:pwidechar):bool; stdcall;
function FsExecuteFile(MainWin:thandle;RemoteName,Verb:pchar):integer; stdcall;
function FsExecuteFileW(MainWin:thandle;RemoteName,Verb:pwidechar):integer; stdcall;
function FsRenMovFile(OldName,NewName:pchar;Move,OverWrite:bool;
RemoteInfo:pRemoteInfo):integer; stdcall;
function FsRenMovFileW(OldName,NewName:pwidechar;Move,OverWrite:bool;
RemoteInfo:pRemoteInfo):integer; stdcall;
function FsGetFile(RemoteName,LocalName:pchar;CopyFlags:integer;
RemoteInfo:pRemoteInfo):integer; stdcall;
function FsGetFileW(RemoteName,LocalName:pwidechar;CopyFlags:integer;
RemoteInfo:pRemoteInfo):integer; stdcall;
function FsPutFile(LocalName,RemoteName:pchar;CopyFlags:integer):integer; stdcall;
function FsPutFileW(LocalName,RemoteName:pwidechar;CopyFlags:integer):integer; stdcall;
function FsDeleteFile(RemoteName:pchar):bool; stdcall;
function FsDeleteFileW(RemoteName:pwidechar):bool; stdcall;
function FsRemoveDir(RemoteName:pchar):bool; stdcall;
function FsRemoveDirW(RemoteName:pwidechar):bool; stdcall;
function FsDisconnect(DisconnectRoot:pchar):bool; stdcall;
function FsDisconnectW(DisconnectRoot:pwidechar):bool; stdcall;
function FsSetAttr(RemoteName:pchar;NewAttr:integer):bool; stdcall;
function FsSetAttrW(RemoteName:pwidechar;NewAttr:integer):bool; stdcall;
function FsSetTime(RemoteName:pchar;CreationTime,LastAccessTime,
LastWriteTime:PFileTime):bool; stdcall;
function FsSetTimeW(RemoteName:pwidechar;CreationTime,LastAccessTime,
LastWriteTime:PFileTime):bool; stdcall;
procedure FsStatusInfo(RemoteDir:pchar;InfoStartEnd,InfoOperation:integer); stdcall;
procedure FsStatusInfoW(RemoteDir:pwidechar;InfoStartEnd,InfoOperation:integer); stdcall;
procedure FsGetDefRootName(DefRootName:pchar;maxlen:integer); stdcall;
function FsExtractCustomIcon(RemoteName:pchar;ExtractFlags:integer;
var TheIcon:hicon):integer; stdcall;
function FsExtractCustomIconW(RemoteName:pwidechar;ExtractFlags:integer;
var TheIcon:hicon):integer; stdcall;
procedure FsSetDefaultParams(dps:pFsDefaultParamStruct); stdcall;
function FsGetPreviewBitmap(RemoteName:pchar;width,height:integer,
var ReturnedBitmap:hbitmap):integer; stdcall;
function FsGetPreviewBitmapW(RemoteName:pwidechar;width,height:integer,
var ReturnedBitmap:hbitmap):integer; stdcall;
function FsLinksToLocalFiles:bool; stdcall;
function FsGetLocalName(RemoteName:pchar;maxlen:integer):bool; stdcall;
function FsGetLocalNameW(RemoteName:pwidechar;maxlen:integer):bool; stdcall;
}
{****************************** content plugin part *****************************}
const ft_nomorefields=0;
ft_numeric_32=1;
ft_numeric_64=2;
ft_numeric_floating=3;
ft_date=4;
ft_time=5;
ft_boolean=6;
ft_multiplechoice=7;
ft_string=8;
ft_fulltext=9;
ft_datetime=10;
ft_stringw=11;
// for ContentGetValue
ft_nosuchfield=-1;
ft_fileerror=-2;
ft_fieldempty=-3;
ft_ondemand=-4;
ft_delayed=0;
// for ContentSetValue
ft_setsuccess=0;
setflags_first_attribute=1; {First attribute of this file}
setflags_last_attribute=2;
setflags_only_date=4;
CONTENT_DELAYIFSLOW=1; // ContentGetValue wywoływana na pierwszym planie
type tContentDefaultParamStruct=record
size,
PluginInterfaceVersionLow,
PluginInterfaceVersionHi:longint;
DefaultIniName:array[0..MAX_PATH-1] of char;
end;
pContentDefaultParamStruct=^tContentDefaultParamStruct;
type tdateformat=record
wYear,wMonth,wDay:word;
end;
pdateformat=^tdateformat;
type ttimeformat=record
wHour,wMinute,wSecond:word;
end;
ptimeformat=^ttimeformat;
{ Function prototypes: }
{
procedure FsContentGetDetectString(DetectString:pchar;maxlen:integer); stdcall;
function FsContentGetSupportedField(FieldIndex:integer;FieldName:pchar;
Units:pchar;maxlen:integer):integer; stdcall;
function FsContentGetValue(FileName:pchar;FieldIndex,UnitIndex:integer;FieldValue:pbyte;
maxlen,flags:integer):integer; stdcall;
function FsContentGetValueW(FileName:pwidechar;FieldIndex,UnitIndex:integer;FieldValue:pbyte;
maxlen,flags:integer):integer; stdcall;
procedure FsContentSetDefaultParams(dps:pContentDefaultParamStruct); stdcall;
procedure FsContentStopGetValue(FileName:pchar); stdcall;
procedure FsContentStopGetValueW(FileName:pwidechar); stdcall;
function FsContentGetDefaultSortOrder(FieldIndex:integer):integer; stdcall;
function FsContentGetSupportedFieldFlags(FieldIndex:integer):integer; stdcall;
function FsContentSetValue(FileName:pchar;FieldIndex,UnitIndex,FieldType:integer;
FieldValue:pbyte;flags:integer):integer; stdcall;
function FsContentSetValueW(FileName:pwidechar;FieldIndex,UnitIndex,FieldType:integer;
FieldValue:pbyte;flags:integer):integer; stdcall;
function FsContentGetDefaultView(ViewContents,ViewHeaders,ViewWidths,
ViewOptions:pchar;maxlen:integer):bool; stdcall;
function FsContentGetDefaultViewW(ViewContents,ViewHeaders,ViewWidths,
ViewOptions:pwidechar;maxlen:integer):bool; stdcall;
function FsGetBackgroundFlags:integer; stdcall;
}
implementation
end.
(Delphi)
Plugin pozwala na pisanie wtyczek systemu plików dla Total Commandera w języku Perl. Po prostu weź plik wtyczki, który odpowiada wersji Perla (TotalCmdPerlFSplugin.ActivePerl5.6.wfx lub TotalCmdPerlFSplugin.ActivePerl5.8.wfx), zmień jego nazwę (np. MyPlugin.wfx) i utwórz nowy plik o tej samej nazwie i rozszerzeniu .pl (MyPlugin.pl), który będzie zawierał twój kod Perla.
Strony wersji angielskiej