Помогите с компиляцией плагина для Total Commander

Раздел посвящен программированию с использованием Power Basic.
jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Помогите с компиляцией плагина для Total Commander

Сообщение jangle » 25.03.2007 (Вс) 1:00

Вот тут http://www.powerbasic.com/support/forums/Forum7/HTML/001789.html выложен пример плагина для Total Commander, к сожалению при компиляции в восьмерке, выдается ошибка:

Error 549 in C:\Temp\total.bas(270:033): ByVal required with pointers
Line 270: ByRef DestPath As Asciiz Ptr, ByRef DestName As Asciiz Ptr) Export As Dword



Подскажите, как правильно преобразовать синтаксис для 8 версии PB?

PBDN
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 21.10.2006 (Сб) 22:10

Re: Помогите с компиляцией плагина для Total Commander

Сообщение PBDN » 25.03.2007 (Вс) 15:18

jangle писал(а):Подскажите, как правильно преобразовать синтаксис для 8 версии PB?


Вот полностью рабочий. После компиляции поменять расширение на wcx и закинуть в директорию с плагинами

P.S.
ИМХО клавиша F2 в PBedit делает тоже самое и даже больше

Код: Выделить всё
'http://www.powerbasic.com/support/forums/Forum7/HTML/001789.html
'
'The indentation is okay, but for some reason when it displays the message it's gone.

'===============================================================================
'
'  PowerBasic Template/Sample for Total Commander's Pack plug-in (.wcx)
'  by Jeroen van Rijn (bytalized)
'  email comments (and plugins you used the template for) to:
'       bytalize@xs4all.nl
'  Hereby placed in the Public Domain
'
'  Total Commander Copyright © 1993-2003 by Christian Ghisler, C. Ghisler & Co.
'  All Rights Reserved.
'
'  PowerBasic is a registered trademark of PowerBasic, Inc.
'
'  Note: Check out the addons section at [URL=http://www.ghisler.com]http://www.ghisler.com[/URL]  for the full API
'
'  What's it do? It reads .bas source files (PowerBasic), and returns the
'  functions and subs as file, nothing interesting.
'
'  Known limitations:
'    Will read VB modules, but creates weird file list when the Public keyword
'      is used, e.g. PUBLIC SUB Name (Param AS Type)
'    Weird file list when no subs or functions are present
'
'  Version 0.0.1 - 05/03/2003
'
'  No warranties of any kind are given or implied.
'
'  Future, maybe:
'  - Fix VB parsing
'  - Process includes
'  - Add \CONSTANT
'  - Add \GLOBAL
'  - Add \TYPE
'  - Add \DECLARE
'  - Maybe do something useful with the subs and functions, like generating
'    comments at the top, i.e.
'    'Function name: Something
'    'Input: sVar1 AS STRING
'    'Input: lVar2 AS LONG
'    'Output: DWORD
'    'Comment: Fill this in after using this 'packer'
'    FUNCTION Something (sVar1 AS STRING, lVar2 AS LONG) AS DWORD
'  - Maybe export altered source, like filename.hung.bas, auto-Hungarian:
'       GLOBAL SomeVar AS STRING ->
'       GLOBAL gsSomeVar AS STRING
'    or filename.sorted.bas with all subs and functions sorted alphabetically
'
' Future, definite:
' Once I figure out a useful archive format that's not been made into a TC
' plugin I'll create a plugin with packing capabilities as well to show
' all Total Commander WCX API functions.
'
' If I can think of a filesystem that hasn't been done I'll create a Filesystem
' (wfx) plugin source as well.
'
' Same goes for the lister plugin (wlx)
'
'===============================================================================

#DIM ALL
#COMPILE DLL "bas.dll"
#INCLUDE "WIN32API.INC"
'== Constants ==================================================================


'==== Error codes returned to calling application ==============================

%E_END_ARCHIVE       = 10            ' No more files in archive
%E_NO_MEMORY         = 11            ' Not enough memory
%E_BAD_DATA          = 12            ' Data is bad
%E_BAD_ARCHIVE       = 13            ' CRC error in archive data
%E_UNKNOWN_FORMAT    = 14            ' Archive format unknown

%E_EOPEN             = 15            ' Cannot open existing file
%E_ECREATE           = 16            ' Cannot create file
%E_ECLOSE            = 17            ' Error closing file
%E_EREAD             = 18            ' Error reading from file
%E_EWRITE            = 19            ' Error writing to file
%E_SMALL_BUF         = 20            ' Buffer too small
%E_EABORTED          = 21            ' Function aborted by user

%E_NO_FILES          = 22            ' No files found
%E_TOO_MANY_FILES    = 23            ' Too many files to pack
%E_NOT_SUPPORTED     = 24            ' Function not supported

' flags for unpacking
%PK_OM_LIST          = 0
%PK_OM_EXTRACT       = 1

' flags for ProcessFile
%PK_SKIP             = 0            ' Skip this file
%PK_TEST             = 1            ' Test file integrity
%PK_EXTRACT          = 2            ' Extract to disk

' Flags passed through ChangeVolProc
%PK_VOL_ASK          = 0            ' Ask user for location of next volume
%PK_VOL_NOTIFY       = 1            ' Notify app that next volume will be unpacked

' Flags for packing

' For PackFiles
%PK_PACK_MOVE_FILES  = 1     ' Delete original after packing
%PK_PACK_SAVE_PATHS  = 2     ' Save path names of files

' Returned by GetPackCaps
%PK_CAPS_NEW         = 1     ' Can create new archives

%PK_CAPS_MODIFY      = 2     ' Can modify exisiting archives
%PK_CAPS_MULTIPLE    = 4     ' Archive can contain multiple files
%PK_CAPS_DELETE      = 8     ' Can delete files
%PK_CAPS_OPTIONS     = 16    ' Has options dialog
%PK_CAPS_MEMPACK     = 32    ' Supports packing in memory
%PK_CAPS_BY_CONTENT  = 64    ' Detect archive type by content
%PK_CAPS_SEARCHTEXT  = 128   ' Allow searching for text in archives
                             ' created with this plugin
%PK_CAPS_HIDE        = 256   ' Show as normal files (hide packer
                             ' icon), open with Ctrl+PgDn, not Enter

' Flags for packing in memory
%MEM_OPTIONS_WANTHEADERS = 1  ' Return archive headers with packed data

' Errors returned by PackToMem
%MEMPACK_OK          = 0    ' Function call finished OK, but there is more data

%MEMPACK_DONE        = 1    ' Function call finished OK, there is no more data

'== Structures =================================================================

TYPE tHeaderData
    ArcName AS ASCIIZ * 260
    FileName AS ASCIIZ * 260
    Flags AS DWORD
    PackSize AS DWORD
    UnpSize AS DWORD
    HostOS AS DWORD
    FileCRC AS DWORD
    FileTime AS DWORD
    UnpVer AS DWORD
    Method AS DWORD
    FileAttrib AS DWORD
    CmtBuf AS ASCIIZ PTR
    CmtBufSize AS DWORD
    CmtSize AS DWORD
    CmtState AS DWORD
END TYPE

TYPE tOpenArchiveData
    ArcName AS ASCIIZ PTR
    OpenMode AS DWORD
    OpenResult AS DWORD
    CmtBuf AS ASCIIZ PTR
    CmtBufSize AS DWORD
    CmtSize AS DWORD
    CmtState AS DWORD
END TYPE

TYPE tFunction
    FuncName AS ASCIIZ * 128  'Name of the function
    FuncType AS LONG    '0=FUNCTION, 1=SUB
    FuncStart AS LONG   'Line in source where it starts
    FuncEnd AS LONG     'Line in source where it ends
END TYPE

'== Globals ====================================================================

GLOBAL glFuncCount AS LONG          'How many functions did we export?
GLOBAL glFuncCurrent AS LONG        'What function did TC want us to extract?
GLOBAL glLineCount AS LONG          'How many lines are there in the source
GLOBAL gtFunctions() AS tFunction   'Function info storage
GLOBAL gsFileBuffer() AS STRING     'Source code buffer

'== Functions ==================================================================

DECLARE FUNCTION PackTime (Day AS DWORD, Month AS DWORD, Year AS DWORD, _
    Hour AS DWORD, Minute AS DWORD, Second AS DWORD) AS DWORD

'-------------------------------------------------------------------------------
' Main DLL entry point called by Windows...
'
FUNCTION LIBMAIN (BYVAL hInstance   AS LONG, _
                  BYVAL fwdReason   AS LONG, _
                  BYVAL lpvReserved AS LONG) AS LONG

    SELECT CASE fwdReason

    CASE %DLL_PROCESS_ATTACH
        'Indicates that the DLL is being loaded by another process (a DLL
        'or EXE is loading the DLL).  DLLs can use this opportunity to
        'initialize any instance or global data, such as arrays.

        DIM gtFunctions(1) AS GLOBAL tFunction
        DIM gsFileBuffer(1) AS GLOBAL STRING

        FUNCTION = 1   'success!

        'FUNCTION = 0   'failure!  This will prevent the EXE from running.

    CASE %DLL_PROCESS_DETACH
        'Indicates that the DLL is being unloaded or detached from the
        'calling application.  DLLs can take this opportunity to clean
        'up all resources for all threads attached and known to the DLL.

        FUNCTION = 1   'success!

        'FUNCTION = 0   'failure!

    CASE %DLL_THREAD_ATTACH
        'Indicates that the DLL is being loaded by a new thread in the
        'calling application.  DLLs can use this opportunity to
        'initialize any thread local storage (TLS).

        FUNCTION = 1   'success!

        'FUNCTION = 0   'failure!

    CASE %DLL_THREAD_DETACH
        'Indicates that the thread is exiting cleanly.  If the DLL has
        'allocated any thread local storage, it should be released.

        FUNCTION = 1   'success!

        'FUNCTION = 0   'failure!

    END SELECT

END FUNCTION

'== Packer Functions ===========================================================

FUNCTION OpenArchive ALIAS "OpenArchive" (BYREF tArchiveData AS tOpenArchiveData) EXPORT AS DWORD

' Description
' OpenArchive should return a unique handle representing the archive.
' The handle should remain valid until CloseArchive is called.
' If an error occurs, you should return zero, and specify the error by setting OpenResult member of ArchiveData.
' You can use the ArchiveData to query information about the archive being open,
' and store the information in ArchiveData to some location that can be accessed via the handle.

    DIM hFile AS DWORD
    DIM sTemp AS STRING
    DIM lCount AS LONG
    DIM sParam1 AS STRING
    DIM sParam2 AS STRING

    SELECT CASE tArchiveData.OpenMode
        CASE %PK_OM_LIST, %PK_OM_EXTRACT

            hFile=FREEFILE
            ON ERROR RESUME NEXT
            OPEN tArchiveData.@ArcName FOR INPUT AS hFile
            IF ERRCLEAR=0 THEN
                FUNCTION=hFile
            ELSE
                tArchiveData.OpenResult = %E_EOPEN
                FUNCTION=0
                EXIT FUNCTION
            END IF
            glLineCount=0
            glFuncCurrent=0
            REDIM gsFileBuffer(0) AS GLOBAL STRING
            REDIM gtFunctions(0) AS GLOBAL tFunction
            DO
                IF EOF(hFile) THEN
                    FUNCTION=%E_END_ARCHIVE
                    CLOSE hFile
                    EXIT FUNCTION
                END IF
                INCR glLineCount
                REDIM PRESERVE gsFileBuffer(glLineCount) AS GLOBAL STRING
                LINE INPUT #hFile, gsFileBuffer(glLineCount)
                sTemp=TRIM$(gsFileBuffer(glLineCount))
                lCount=PARSECOUNT(sTemp, " ")
                IF lCount>1 THEN
                    sParam1=UCASE$(PARSE$(sTemp," ",1))
                    sParam2=PARSE$(sTemp, ANY " (",2)
                    IF sParam1="FUNCTION" THEN
                        IF INSTR(sTemp,"=")=0 THEN
                            INCR glFuncCount
                            REDIM PRESERVE gtFunctions(glFuncCount) AS GLOBAL tFunction
                            gtFunctions(glFuncCount).FuncName=sParam2
                            gtFunctions(glFuncCount).FuncStart=glLineCount
                            gtFunctions(glFuncCount).FuncType=0
                        END IF
                    ELSEIF sParam1="SUB" THEN
                        INCR glFuncCount
                        REDIM PRESERVE gtFunctions(glFuncCount) AS GLOBAL tFunction
                        gtFunctions(glFuncCount).FuncName=sParam2
                        gtFunctions(glFuncCount).FuncStart=glLineCount
                        gtFunctions(glFuncCount).FuncType=1
                    ELSEIF sParam1="END" THEN
                        sParam2=UCASE$(sParam2)
                        IF sParam2="FUNCTION" OR sParam2="SUB" THEN
                            gtFunctions(glFuncCount).FuncEnd=glLineCount
                        END IF
                    END IF
                END IF
            LOOP
        CASE ELSE
            MSGBOX "Opening: "+tArchiveData.@ArcName+$CRLF+"Open mode: Unknown"+$CRLF,,"WCX Template"
            tArchiveData.OpenResult = %E_NOT_SUPPORTED
            FUNCTION = 0
    END SELECT

END FUNCTION

FUNCTION ReadHeader ALIAS "ReadHeader" (BYVAL hArcData AS DWORD, BYREF HeaderData AS tHeaderData) EXPORT AS DWORD

    INCR glFuncCurrent
    IF glFuncCurrent<(glFuncCount+1) THEN
        SELECT CASE gtFunctions(glFuncCurrent).FuncType
            CASE 0 'Function
                HeaderData.FileName="FUNCTION"+gtFunctions(glFuncCurrent).FuncName
            CASE 1 'Sub
                HeaderData.FileName="SUB"+gtFunctions(glFuncCurrent).FuncName
        END SELECT
        HeaderData.FileTime = PackTime(1,2,2003,12,14,46) '01-02-2003 12:14:46 (arbitrary date)
        'Report number of lines as size
        HeaderData.UnpSize = gtFunctions(glFuncCurrent).FuncEnd-gtFunctions(glFuncCurrent).FuncStart+1
        HeaderData.PackSize = HeaderData.UnpSize
        FUNCTION=0
    ELSE
        FUNCTION=%E_END_ARCHIVE
    END IF

END FUNCTION

FUNCTION ProcessFile ALIAS "ProcessFile" (BYVAL hArcData AS DWORD, BYVAL Operation AS LONG, _
    BYVAL DestPath AS ASCIIZ PTR, BYVAL DestName AS ASCIIZ PTR) EXPORT AS DWORD

    DIM sDestination AS STRING
    DIM hFile AS LONG
    DIM lCount AS LONG

    IF LEN(@DestPath)=0 THEN
        sDestination = @DestName
    ELSE
        sDestination = @DestPath + "" + @DestName
    END IF

    IF Operation=%PK_EXTRACT THEN
        hFile=FREEFILE
        OPEN sDestination FOR OUTPUT AS #hFile
        FOR lCount=gtFunctions(glFuncCurrent).FuncStart TO gtFunctions(glFuncCurrent).FuncEnd
            PRINT #hFile, gsFileBuffer(lCount)
        NEXT
        CLOSE #hFile
    END IF

    FUNCTION = 0

END FUNCTION

FUNCTION CloseArchive ALIAS "CloseArchive" (BYVAL hArcData AS DWORD) EXPORT AS DWORD

'Description
'CloseArchive should return zero on success, or one of the error values otherwise.
'It should free all the resources associated with the open archive.
'The parameter hArcData refers to the value returned by a programmer within a previous call to OpenArchive.

    FUNCTION = 0

END FUNCTION

SUB SetChangeVolProc ALIAS "SetChangeVolProc" (BYVAL hArcData AS DWORD, BYVAL pChangeVolProc1 AS DWORD) EXPORT

'Description
'pChangeVolProc1 contains a pointer to a function that you may want to call when notifying user
'to change volume (e.g. insterting another diskette). You need to store the value at some place
'if you want to use it; you can use hArcData that you have
'returned by OpenArchive to identify that place.

'==== Ask to swap disk for multi-volume archive ================================

' Save the pointer somewhere and call like
' CALL DWORD pChangeVolProc1 USING (ArcName AS ASCIIZ, Mode AS DWORD) TO lResult

'

END SUB

SUB SetProcessDataProc ALIAS "SetProcessDataProc" (BYVAL hArcData AS DWORD, BYVAL pProcessDataProc AS DWORD) EXPORT

' Sae the pointer somewhere and call like
' CALL DWORD pProcessDataProc (FileName AS ASCIIZ, FileSize AS DWORD) TO lResult

END SUB


'== General support functions ==================================================

FUNCTION PackTime (Day AS DWORD, Month AS DWORD, Year AS DWORD, _
    Hour AS DWORD, Minute AS DWORD, Second AS DWORD) AS DWORD

'FileTime contains the date and the time of the file’s last update. Use the following algorithm to set the value:
'FileTime = (year - 1980) << 25 | month << 21 | day << 16 | hour << 11 | minute << 5 | second/2;

'Make sure that:

'year is in the four digit format between 1980 and 2100
'month is a number between 1 and 12
'hour is in the 24 hour format

    DIM TempTime AS DWORD
    DIM lYear AS DWORD
    DIM lMonth AS DWORD
    DIM lDay AS DWORD
    DIM lHour AS DWORD
    DIM lMinute AS DWORD
    DIM lSecond AS DWORD

    lYear = Year - 1980
    lMonth = Month
    lDay = Day
    lHour = Hour
    lMinute = Minute
    lSecond = Second

    SHIFT LEFT lYear, 25
    SHIFT LEFT lMonth, 21
    SHIFT LEFT lDay, 16
    SHIFT LEFT lHour, 11
    SHIFT LEFT lMinute, 5
    lSecond = lSecond \ 2

    FUNCTION = lYear OR lMonth OR lDay OR lHour OR lMinute OR lSecond

END FUNCTION

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 25.03.2007 (Вс) 21:19

Вот полностью рабочий. После компиляции поменять расширение на wcx и закинуть в директорию с плагинами


Спасибо! Очень помогло! :)


Вернуться в Power Basic

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 39

    TopList