Deutsch
Forum

Erledigt: XPSE & Consolenaufruf

 

Frank
Abbing
Hi iF,

du hast sicher mitgelesen, das XPIA zukünftig das MASM32-Paket und den XPSE nicht mehr benötigen wird, da er selber einen kleinen Precompiler eingebaut bekommen hat. Zwangsläufig ist es dadurch nötig geworden, dass XPIA nun selber Compiler und Linker bedienen kann. Nichtsdestotrotz soll es aber immer möglich sein, Tools wie XPSE, XPRR, UPX usw. auch noch vorher aufzurufen. Die Möglichkeiten dafür sind bereits geschaffen.
Meine Frage also: Welche Möglichkeiten bietet XPSE, als Consolenprogramm mit Parametern aufgerufen zu werden?
Wichtig wäre z.B., dass XPSE sich nach getaner Arbeit beenden ließe, damit auch noch andere Tools aufgerufen werden könnten. Weiterhin gibt es sicher auch Leute, die Compiler/Linker lieber weiterhin durch XPSE bedienen lassen wollen. Ist das momentan möglich?

Ich sags mal hier extra, damit es gar nicht erst missverstanden wird: XPIA wird niemals ein Precompiler sein, um XPSE auf Dauer irgendwie ersetzen zu wollen. XPIA ist und bleibt ein Inline-Assembler für XProfan, mehr nicht. Das Precompilen beschränkt sich darauf, Code und Includes zu verbinden und diverse Steuerparameter (in Direktivenform) für XPIA auszulesen. Dass ich XPIA unabhängig gemacht habe von XPSE und einer MASM32-Installation, passierte aufgrund der Vereinfachung in Installation und Handhabung.
Ja, das war mir wichtig zu sagen.
 
06.05.2009  
 



Habe ich mitbekommen und freue mich auch auf den neuen XPIA.

XPSE kann man eigentlich nur über seine Kompilerschalter steuern, ihm also eine Datei zu füttern geben welche Schalter enthält die er umsetzt und dann entfernt.

Zum Kommandozeilenparameter kann ich nur sagen, dass so gut wie alle bekannten Schalter aus den XProfan-IDEs weggedacht werden um möglichst allen Konflikten mit den Schaltern im Text aus dem Wege zu gehen. XPSE kennt so gesehen keine normalen Kommandozeilenparameter - er saugt erst die kompletten Parameter und zerfummelt diese bis hin zur eigentlichen Datei.

Du könntest an den Parameter ein *nokeyb anhängen - das würde Sinn machen. So weiss XPSE das keine Tastatureingaben gemacht werden können und würde keine Tastatureingaben abverlangen - z.B. im Fehlerfall.
 
06.05.2009  
 




Frank
Abbing
*nokeyb scheint schonmal weiterzuhelfen.

Kannst du mal nachsehen, warum dieser Source - ein ganz gewöhnlicher XPIA-generierter Code - angemeckert wird? Ich verstehe nicht ganz warum.
Es betrifft wohl diese Zeile:

________________________________________________________________________________________________________________
Generiert mit XPIA © Frank Abbing (http://frabbing.bplaced.net)
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Declare xpia_#
Dim xpia_#,1536
Clear xpia_#
Long xpia_#,0=9460301,3,4,65535,184
Long xpia_#,24=64
Long xpia_#,60=128,247078670,-855002112,1275181089,1750344141,1881174889,1919381362,1663069537,1869508193,1700929652,1853190688,544106784,542330692,1701080941,168627502,36
Long xpia_#,128=17744,131404,1241637872
Long xpia_#,148=554565856,838992139,512,512
Long xpia_#,168=4096,4096,8192,268435456,4096,512,4
Long xpia_#,200=4
Long xpia_#,208=12288,512,21975,2,1048576,4096,1048576,4096
Long xpia_#,244=16,4144,78
Long xpia_#,288=8192,12
Long xpia_#,376=1297301837,12851,126,4096,512,512
Long xpia_#,412=-536870880,1818587694,25455,12,8192,512,1024
Long xpia_#,452=1107296320
Long xpia_#,512=-1192457387,1,836297,1408011093,12080727,-1962934272,1069090909,-352317630,1237517059,1962998147,1532976888,312009
Long xpia_#,564=1241637872
Long xpia_#,572=4194,1,1,1,4184,4188,4192,4108,4207,1681981440,1919248740,1143893605,1174424652,1953197685,1936617321,1701667182,49
Long xpia_#,1028=12
DECLARE xpia_hModule&,_xpia_cf1&,_xpia_cf2&,_xpia_cf3&,_xpia_cf4&,_xpia_cf5&,_xpia_cf6&,_xpia_cf7&,_xpia_cf8&,_xpia_cf9&,_xpia_cf10&,_xpia_cf11&,_xpia_cf12&,_xpia_cf13&
Def _xpia_cf1(2) !KERNEL32,GetProcAddress
Def _xpia_cf2(1) !KERNEL32,GetModuleHandleA
_xpia_cf1&=_xpia_cf1(_xpia_cf2(kernel32.dll),VirtualAlloc)
_xpia_cf2&=_xpia_cf1(_xpia_cf2(kernel32.dll),VirtualFree)
_xpia_cf3&=_xpia_cf1(_xpia_cf2(kernel32.dll),VirtualProtect)
_xpia_cf4&=_xpia_cf1(_xpia_cf2(kernel32.dll),IsBadReadPtr)
_xpia_cf5&=_xpia_cf1(_xpia_cf2(kernel32.dll),LoadLibraryA)
_xpia_cf6&=_xpia_cf1(_xpia_cf2(kernel32.dll),GlobalAlloc)
_xpia_cf7&=_xpia_cf1(_xpia_cf2(kernel32.dll),GlobalFree)
_xpia_cf8&=_xpia_cf1(_xpia_cf2(kernel32.dll),GetProcAddress)
_xpia_cf9&=_xpia_cf1(_xpia_cf2(kernel32.dll),FreeLibrary)
_xpia_cf10&=_xpia_cf1(_xpia_cf2(kernel32.dll),HeapFree)
_xpia_cf11&=_xpia_cf1(_xpia_cf2(kernel32.dll),GetProcessHeap)
_xpia_cf12&=_xpia_cf1(_xpia_cf2(kernel32.dll),HeapAlloc)
_xpia_cf13&=_xpia_cf1(_xpia_cf2(kernel32.dll),lstrcmpA)
DEF XPIA_ZEROMEMORY(2) !KERNEL32,RtlZeroMemory
DEF XPIA_MOVEMEMORY(3) !KERNEL32,RtlMoveMemory
struct MEMORYMODULE=PHEADERS_XPIA&,PCODEBASE_XPIA&,PMODULES_XPIA&,NMODULES_XPIA&,BINITIALIZED_XPIA&

proc xpia_OUTPUTSTATUS

    PARAMETERS TEXT_xpia$

endproc

proc xpia_OUTPUTLASTERROR

    PARAMETERS ERROR_xpia$
    xpia_OUTPUTSTATUS(ERROR:  + ERROR_xpia$)

endproc

proc xpia_IMAGE_FIRST_SECTION

    PARAMETERS PHEADER_XPIA&
    RETURN (PHEADER_XPIA& + 24 + WORD(PHEADER_XPIA&,20))

endproc

proc xpia_GET_HEADER_DICTIONARY

    PARAMETERS PMODULE_XPIA&,NINDEX_XPIA&
    RETURN (LONG(PMODULE_XPIA&,0) + 120 + (8 * NINDEX_XPIA&))

endproc

proc xpia_IMAGE_SNAP_BY_ORDINAL

    PARAMETERS NORDINAL_XPIA&
    RETURN INT((NORDINAL_XPIA& & $80000000) <> 0)

endproc

proc xpia_IMAGE_ORDINAL

    PARAMETERS NORDINAL_XPIA&
    RETURN (NORDINAL_XPIA& & $FFFF)

endproc

proc xpia_COPYSECTIONS

    PARAMETERS PDATA_XPIA&,POLDHEADERS_XPIA&,PMODULE_XPIA&
    DECLARE I_XPIA&,NSIZE_XPIA&,PDEST_XPIA&
    DECLARE PCODEBASE_XPIA&
    PCODEBASE_XPIA&=LONG(PMODULE_XPIA&,4)
    DECLARE PSECTION_XPIA&
    PSECTION_XPIA&=xpia_IMAGE_FIRST_SECTION(LONG(PMODULE_XPIA&,0))
    DECLARE NSECTIONS_XPIA&
    NSECTIONS_XPIA&=WORD(LONG(PMODULE_XPIA&,0),6)

    WHILE I_XPIA& < NSECTIONS_XPIA&

        IF LONG(PSECTION_XPIA&,16)=0

            NSIZE_XPIA&=LONG(POLDHEADERS_XPIA&,56)

            IF (NSIZE_XPIA& > 0)

                PDEST_XPIA&=call(_xpia_cf1&,PCODEBASE_XPIA& + LONG(PSECTION_XPIA&,12), NSIZE_XPIA&, $1000, $4)
                LONG PSECTION_XPIA&,8=PDEST_XPIA&
                XPIA_ZEROMEMORY(PDEST_XPIA&, NSIZE_XPIA&)

            ENDIF

            I_XPIA&=I_XPIA& + 1
            PSECTION_XPIA&=PSECTION_XPIA& + 40
            CONTINUE

        ENDIF

        PDEST_XPIA&=call(_xpia_cf1&,PCODEBASE_XPIA& + LONG(PSECTION_XPIA&,12), LONG(PSECTION_XPIA&,16), $1000, $4)
        XPIA_MOVEMEMORY(PDEST_XPIA&, PDATA_XPIA& + LONG(PSECTION_XPIA&,20), LONG(PSECTION_XPIA&,16))
        LONG PSECTION_XPIA&,8=PDEST_XPIA&
        I_XPIA&=I_XPIA& + 1
        PSECTION_XPIA&=PSECTION_XPIA& + 40

    ENDWHILE

endproc

DECLARE PROTECTIONFLAGS_XPIA&[2,2,2]
PROTECTIONFLAGS_XPIA&[0,0,0]=$1
PROTECTIONFLAGS_XPIA&[0,0,1]=$8
PROTECTIONFLAGS_XPIA&[0,1,0]=$2
PROTECTIONFLAGS_XPIA&[0,1,1]=$4
PROTECTIONFLAGS_XPIA&[1,0,0]=$10
PROTECTIONFLAGS_XPIA&[1,0,1]=$80
PROTECTIONFLAGS_XPIA&[1,1,0]=$20
PROTECTIONFLAGS_XPIA&[1,1,1]=$40

proc xpia_FINALIZESECTIONS

    PARAMETERS PMODULE_XPIA&
    DECLARE I_XPIA&,DWPROTECT_XPIA&,DWOLDPROTECT_XPIA&,NSIZE_XPIA&
    DECLARE NEXECUTABLE_XPIA&,NREADABLE_XPIA&,NWRITEABLE_XPIA&
    DECLARE PSECTION_XPIA&
    PSECTION_XPIA&=xpia_IMAGE_FIRST_SECTION(LONG(PMODULE_XPIA&,0))
    DECLARE NSECTIONS_XPIA&
    NSECTIONS_XPIA&=WORD(LONG(PMODULE_XPIA&,0),6)

    WHILE I_XPIA& < NSECTIONS_XPIA&

        NEXECUTABLE_XPIA&=(LONG(PSECTION_XPIA&,36) & $20000000) <> 0
        NREADABLE_XPIA&=(LONG(PSECTION_XPIA&,36) & $40000000) <> 0
        NWRITEABLE_XPIA&=(LONG(PSECTION_XPIA&,36) & $80000000) <> 0

        IF (LONG(PSECTION_XPIA&,36) & $2000000) <> 0

            call(_xpia_cf2&,LONG(PSECTION_XPIA&,8), LONG(PSECTION_XPIA&,16), $4000)
            I_XPIA&=I_XPIA& + 1
            PSECTION_XPIA&=PSECTION_XPIA& + 40
            CONTINUE

        ENDIF

        DWPROTECT_XPIA&=PROTECTIONFLAGS_XPIA&[NEXECUTABLE_XPIA&,NREADABLE_XPIA&,NWRITEABLE_XPIA&]

        IF (LONG(PSECTION_XPIA&,36) & $4000000) <> 0

            DWPROTECT_XPIA&=DWPROTECT_XPIA& | $200

        ENDIF

        NSIZE_XPIA&=LONG(PSECTION_XPIA&,16)

        IF NSIZE_XPIA&=0

            IF (LONG(PSECTION_XPIA&,36) & $40) <> 0

                NSIZE_XPIA&=LONG(LONG(PMODULE_XPIA&,0),32)

            ELSEIF (LONG(PSECTION_XPIA&,36) & $80) <> 0

                NSIZE_XPIA&=LONG(LONG(PMODULE_XPIA&,0),36)

            ENDIF

        ELSEIF NSIZE_XPIA& > 0

            IF call(_xpia_cf3&,LONG(PSECTION_XPIA&,8), LONG(PSECTION_XPIA&,16), DWPROTECT_XPIA&, ADDR(DWOLDPROTECT_XPIA&))=0

                xpia_OUTPUTLASTERROR(Error protecting memory page.)

            ENDIF

        ENDIF

        I_XPIA&=I_XPIA& + 1
        PSECTION_XPIA&=PSECTION_XPIA& + 40

    ENDWHILE

endproc

proc xpia_PERFORMBASERELOCATION

    PARAMETERS PMODULE_XPIA&,NDELTA_XPIA&
    DECLARE I_XPIA&
    DECLARE PCODEBASE_XPIA&
    PCODEBASE_XPIA&=LONG(PMODULE_XPIA&,4)
    DECLARE PDIRECTORY_XPIA&
    PDIRECTORY_XPIA&=xpia_GET_HEADER_DICTIONARY(PMODULE_XPIA&, 5)

    IF LONG(PDIRECTORY_XPIA&,4) > 0

        DECLARE PRELOCATION_XPIA&
        PRELOCATION_XPIA&=PCODEBASE_XPIA& + LONG(PDIRECTORY_XPIA&,0)
        DECLARE PDEST_XPIA&,PRELINFO_XPIA&,PPATCHADDRHL_XPIA&,NTYPE_XPIA&,NOFFSET_XPIA&

        WHILE LONG(PRELOCATION_XPIA&,0) > 0

            PDEST_XPIA&=PCODEBASE_XPIA& + LONG(PRELOCATION_XPIA&,0)
            PRELINFO_XPIA&=PRELOCATION_XPIA& + 8
            I_XPIA&=0

            WHILE I_XPIA& < ((LONG(PRELOCATION_XPIA&,4) - 8)  2)

                NTYPE_XPIA&=WORD(PRELINFO_XPIA&,0) >> 12
                NOFFSET_XPIA&=WORD(PRELINFO_XPIA&,0) & $FFF

                IF NTYPE_XPIA&=0

                ELSEIF NTYPE_XPIA&=3

                    PPATCHADDRHL_XPIA&=PDEST_XPIA& + NOFFSET_XPIA&
                    LONG PPATCHADDRHL_XPIA&,0=LONG(PPATCHADDRHL_XPIA&,0) + NDELTA_XPIA&

                ELSE

                ENDIF

                I_XPIA&=I_XPIA& + 1
                PRELINFO_XPIA&=PRELINFO_XPIA& + 2

            ENDWHILE

            PRELOCATION_XPIA&=PRELOCATION_XPIA& + LONG(PRELOCATION_XPIA&,4)

        ENDWHILE

    ENDIF

endproc

proc xpia_BUILDIMPORTTABLE

    PARAMETERS PMODULE_XPIA&
    DECLARE NRESULT_XPIA&
    NRESULT_XPIA&=1
    DECLARE PCODEBASE_XPIA&
    PCODEBASE_XPIA&=LONG(PMODULE_XPIA&,4)
    DECLARE PDIRECTORY_XPIA&
    PDIRECTORY_XPIA&=xpia_GET_HEADER_DICTIONARY(PMODULE_XPIA&, 1)

    IF LONG(PDIRECTORY_XPIA&,4) > 0

        DECLARE PIMPORTDESC_XPIA&
        PIMPORTDESC_XPIA&=PCODEBASE_XPIA& + LONG(PDIRECTORY_XPIA&,0)
        DECLARE PTHUNKREF_XPIA&,PFUNCREF_XPIA&,PTHUNKDATA_XPIA&,PNEW_XPIA&
        DECLARE HANDLE_XPIA&

        WHILE NOT(call(_xpia_cf4&,PIMPORTDESC_XPIA&,20)) AND (LONG(PIMPORTDESC_XPIA&,12) <> 0)

            HANDLE_XPIA&=call(_xpia_cf5&,PCODEBASE_XPIA& + LONG(PIMPORTDESC_XPIA&,12))
            xpia_OUTPUTSTATUS(Loading library:  + STRING$(PCODEBASE_XPIA& + LONG(PIMPORTDESC_XPIA&,12),0))

            IF HANDLE_XPIA&=-1

                xpia_OUTPUTLASTERROR(Cant load library.)
                NRESULT_XPIA&=0
                BREAK

            ENDIF

            PNEW_XPIA&=call(_xpia_cf6&,0, (LONG(PMODULE_XPIA&,12) + 1) * 4)

            IF LONG(PMODULE_XPIA&,8) <> 0

                XPIA_MOVEMEMORY(PNEW_XPIA&, LONG(PMODULE_XPIA&,8), LONG(PMODULE_XPIA&,12) * 4)
                call(_xpia_cf7&,LONG(PMODULE_XPIA&,8))

            ENDIF

            LONG PMODULE_XPIA&,8=PNEW_XPIA&

            IF LONG(PMODULE_XPIA&,8)=0

                xpia_OUTPUTLASTERROR(Memory error.)
                NRESULT_XPIA&=0
                BREAK

            ENDIF

            LONG LONG(PMODULE_XPIA&,8),(LONG(PMODULE_XPIA&,12) * 4)=HANDLE_XPIA&
            LONG PMODULE_XPIA&,12=LONG(PMODULE_XPIA&,12) + 1

            IF LONG(PIMPORTDESC_XPIA&,0) <> 0

                PTHUNKREF_XPIA&=PCODEBASE_XPIA& + LONG(PIMPORTDESC_XPIA&,0)
                PFUNCREF_XPIA&=PCODEBASE_XPIA& + LONG(PIMPORTDESC_XPIA&,16)

            ELSE

                PTHUNKREF_XPIA&=PCODEBASE_XPIA& + LONG(PIMPORTDESC_XPIA&,16)
                PFUNCREF_XPIA&=PCODEBASE_XPIA& + LONG(PIMPORTDESC_XPIA&,16)

            ENDIF

            WHILE LONG(PTHUNKREF_XPIA&,0) <> 0

                IF xpia_IMAGE_SNAP_BY_ORDINAL(LONG(PTHUNKREF_XPIA&,0))

                    LONG PFUNCREF_XPIA&,0=call(_xpia_cf8&,HANDLE_XPIA&, xpia_IMAGE_ORDINAL(LONG(PTHUNKREF_XPIA&,0)))

                ELSE

                    PTHUNKDATA_XPIA&=PCODEBASE_XPIA& + LONG(PTHUNKREF_XPIA&,0)
                    LONG PFUNCREF_XPIA&,0=call(_xpia_cf8&,HANDLE_XPIA&, PTHUNKDATA_XPIA& + 2)

                ENDIF

                IF LONG(PFUNCREF_XPIA&,0)=0

                    NRESULT_XPIA&=0
                    BREAK

                ENDIF

                PTHUNKREF_XPIA&=PTHUNKREF_XPIA& + 4
                PFUNCREF_XPIA&=PFUNCREF_XPIA& + 4

            ENDWHILE

            IFNOT NRESULT_XPIA&

                BREAK

            ENDIF

            PIMPORTDESC_XPIA&=PIMPORTDESC_XPIA& + 20

        ENDWHILE

    ENDIF

    RETURN NRESULT_XPIA&

endproc

proc xpia_MEMLIBFREE

    PARAMETERS PMODULE_XPIA&

    IF PMODULE_XPIA& <> 0

        IF LONG(PMODULE_XPIA&,16) <> 0

            DECLARE PDLLENTRY_XPIA&
            PDLLENTRY_XPIA&=LONG(PMODULE_XPIA&,4) + LONG(LONG(PMODULE_XPIA&,0),40)
            CALL(PDLLENTRY_XPIA&, LONG(PMODULE_XPIA&,4), 0, 0)
            LONG PMODULE_XPIA&,16=0

        ENDIF

        IF LONG(PMODULE_XPIA&,8) <> 0

            WHILELOOP 0,LONG(PMODULE_XPIA&,12) - 1

                IF LONG(LONG(PMODULE_XPIA&,8),4 * &LOOP) <> -1

                    call(_xpia_cf9&,LONG(LONG(PMODULE_XPIA&,8),4 * &LOOP))

                ENDIF

            ENDWHILE

            call(_xpia_cf7&,LONG(PMODULE_XPIA&,8))

        ENDIF

        IF LONG(PMODULE_XPIA&,4) <> 0

            call(_xpia_cf2&,LONG(PMODULE_XPIA&,4), LONG(LONG(PMODULE_XPIA&,0),80), $8000)

        ENDIF

        call(_xpia_cf10&,call(_xpia_cf11&), 0, PMODULE_XPIA&)

    ENDIF

endproc

proc xpia_LOADLIBRARYM

    PARAMETERS PDATA_XPIA&
    DECLARE PDOSHEADER_XPIA&
    PDOSHEADER_XPIA&=PDATA_XPIA&

    IF WORD(PDOSHEADER_XPIA&,0) <> $5A4D

        xpia_OUTPUTLASTERROR(Not a valid executable file.)
        RETURN 0

    ENDIF

    DECLARE POLDHEADER_XPIA&
    POLDHEADER_XPIA&=PDATA_XPIA& + LONG(PDOSHEADER_XPIA&,60)

    IF LONG(POLDHEADER_XPIA&,0) <> $00004550

        xpia_OUTPUTLASTERROR(No PE header found.)
        RETURN 0

    ENDIF

    DECLARE PCODE_XPIA&
    PCODE_XPIA&=call(_xpia_cf1&,LONG(POLDHEADER_XPIA&,52), LONG(POLDHEADER_XPIA&,80), $2000, $4)

    IF PCODE_XPIA&=0

        PCODE_XPIA&=call(_xpia_cf1&,0, LONG(POLDHEADER_XPIA&,80), $2000, $4)

    ENDIF

    IF PCODE_XPIA&=0

        xpia_OUTPUTLASTERROR(Cant reserve memory.)
        RETURN 0

    ENDIF

    DECLARE PRESULT_XPIA&
    PRESULT_XPIA&=call(_xpia_cf12&,call(_xpia_cf11&), 0, 20)
    LONG PRESULT_XPIA&, 4=PCODE_XPIA&
    LONG PRESULT_XPIA&, 8=0
    LONG PRESULT_XPIA&,12=0
    LONG PRESULT_XPIA&,16=0
    call(_xpia_cf1&,PCODE_XPIA&, LONG(POLDHEADER_XPIA&,80), $1000, $4)
    DECLARE PHEADERS_XPIA&
    PHEADERS_XPIA&=call(_xpia_cf1&,PCODE_XPIA&, LONG(POLDHEADER_XPIA&,84), $1000, $4)
    XPIA_MOVEMEMORY(PHEADERS_XPIA&, PDOSHEADER_XPIA&, LONG(PDOSHEADER_XPIA&,60) + LONG(POLDHEADER_XPIA&,84))
    LONG PRESULT_XPIA&,0=PHEADERS_XPIA& + LONG(PDOSHEADER_XPIA&,60)
    LONG LONG(PRESULT_XPIA&,0),52=PCODE_XPIA&
    xpia_COPYSECTIONS(PDATA_XPIA&, POLDHEADER_XPIA&, PRESULT_XPIA&)
    DECLARE DWLOCATIONDELTA_XPIA&
    DWLOCATIONDELTA_XPIA&=PCODE_XPIA& - LONG(POLDHEADER_XPIA&,52)

    IF DWLOCATIONDELTA_XPIA& <> 0

        xpia_PERFORMBASERELOCATION(PRESULT_XPIA&, DWLOCATIONDELTA_XPIA&)

    ENDIF

    IF xpia_BUILDIMPORTTABLE(PRESULT_XPIA&)=0

        xpia_MEMLIBFREE(PRESULT_XPIA&)
        RETURN 0

    ENDIF

    xpia_FINALIZESECTIONS(PRESULT_XPIA&)

    IF LONG(LONG(PRESULT_XPIA&,0),40) <> 0

        DECLARE PDLLENTRY_XPIA&
        PDLLENTRY_XPIA&=PCODE_XPIA& + LONG(LONG(PRESULT_XPIA&,0),40)

        IF PDLLENTRY_XPIA&=0

            xpia_OUTPUTLASTERROR(Library doesnt have entry point.)
            xpia_MEMLIBFREE(PRESULT_XPIA&)
            RETURN 0

        ENDIF

        DECLARE BSUCCESS_XPIA&
        BSUCCESS_XPIA&=CALL(PDLLENTRY_XPIA&, PCODE_XPIA&, $1, 0)

        IFNOT BSUCCESS_XPIA&

            xpia_OUTPUTLASTERROR(Cant attach library.)
            xpia_MEMLIBFREE(PRESULT_XPIA&)
            RETURN 0

        ENDIF

        LONG PRESULT_XPIA&,16=1

    ENDIF

    RETURN PRESULT_XPIA&

endproc

proc xpia_GETPROCADDRESSM

    PARAMETERS PMODULE_XPIA&,NAME_xpia$
    DECLARE PCODEBASE_XPIA&
    PCODEBASE_XPIA&=LONG(PMODULE_XPIA&,4)
    DECLARE NIDX_XPIA&
    NIDX_XPIA&=-1
    DECLARE PDIRECTORY_XPIA&
    PDIRECTORY_XPIA&=xpia_GET_HEADER_DICTIONARY(PMODULE_XPIA&, 0)

    IF LONG(PDIRECTORY_XPIA&,4)=0

        RETURN 0

    ENDIF

    DECLARE PEXPORTS_XPIA&
    PEXPORTS_XPIA&=PCODEBASE_XPIA& + LONG(PDIRECTORY_XPIA&,0)

    IF (LONG(PEXPORTS_XPIA&,24)=0) OR (LONG(PEXPORTS_XPIA&,20)=0)

        RETURN 0

    ENDIF

    DECLARE PNAMEREF_XPIA&,PORDINAL_XPIA&,I_XPIA&
    PNAMEREF_XPIA&=PCODEBASE_XPIA& + LONG(PEXPORTS_XPIA&,32)
    PORDINAL_XPIA&=PCODEBASE_XPIA& + LONG(PEXPORTS_XPIA&,36)

    WHILE I_XPIA& < LONG(PEXPORTS_XPIA&,24)

        IF call(_xpia_cf13&,ADDR(NAME_xpia$), PCODEBASE_XPIA& + LONG(PNAMEREF_XPIA&,0))=0

            NIDX_XPIA&=WORD(PORDINAL_XPIA&,0)
            BREAK

        ENDIF

        I_XPIA&=I_XPIA& + 1
        PNAMEREF_XPIA&=PNAMEREF_XPIA& + 4
        PORDINAL_XPIA&=PORDINAL_XPIA& + 2

    ENDWHILE

    IF NIDX_XPIA&=-1

        RETURN 0

    ENDIF

    IF NIDX_XPIA& > LONG(PEXPORTS_XPIA&,20)

        RETURN 0

    ENDIF

    RETURN PCODEBASE_XPIA& + LONG(PCODEBASE_XPIA& + LONG(PEXPORTS_XPIA&,28) + (NIDX_XPIA& * 4), 0)

endproc

proc xpia_FREELIBRARYM

    PARAMETERS PMODULE_XPIA&
    xpia_MEMLIBFREE(PMODULE_XPIA&)

endproc

proc __XPIA_ENDPROGRAM

    xpia_FREELIBRARYM(xpia_hModule&)

endproc

xpia_hModule&=xpia_LOADLIBRARYM(xpia_#)
Dispose xpia_#
Declare x&,y&,z&
Cls
Z&=Call(xpia_GetProcAddressM(xpia_hModule&,Funktionsname1),X&)
Print Addiere 999999 mal 37 = +Str$(z&)
WaitInput
End
 
06.05.2009  
 




Warnung : Doppeldefinition(en): XPIA_GETPROCADDRESSM
Funktion : __XPIA_ENDPROGRAM
Naehe: : ~320, proc XPIA_GETPROCADDRESSM


gilt als doppelt definiert, weil ich die Funktion XPIA_GETPROCADDRESSM als von Haus aus deklariert definiere - das war irgendwie notwendig in Verbindung mit dem Vorgänger-XPIA.

Vielleicht wäre es wg. der Kompatiblität zum Vorgängermodell sinnvoll, wenn ich diese Deklarierung aus XPSE nicht entferne und Du vielleicht für XPIA_GETPROCADDRESSM z.B. XPIA2_GETPROCADDRESSM anweist.

Bisher fest eingebaut sind XPIA_GETPROCADDRESSM und XPIA_HMODULE& .
 
06.05.2009  
 




Frank
Abbing
Ok, ich habe jetzt die Bezeichner GetXpiaProcAddress und XpiaModule& ausgewählt, gefallen mir so auch viel besser.
An ein paar Ecken ziept es noch mit XPIA-4 und XPSE. Aber ich denke, dass kann dann im praktischen Einsatz geklärt werden.
 
06.05.2009  
 



Wobei ich jedoch Bezeichner, welche systematisch bedingt in den Programmtext eingefügt werden und normalerweise in einem Programm nicht vorkommen, sicherheitshalber nicht mit einem Buchstaben beginnen würde sondern eher mit z.B. ungewöhnlicherem anführendem __.

Natürlich mag man zunächst nicht annehmen, dass jemand z.B. GetXpiaProcAddress selbst definiert, aber dank Murphy ist die Chance so gering nunmal nicht.

Ich glaube ich ziehe dieses Prinzip sicherheitshalber überall durch, vielleicht ist es damit ja Standard.

So nach dem Motto, wer Bezeichner mit __ anführt, begibt sich auf Prä-Ebene.
 
06.05.2009  
 




Frank
Abbing
Ja, aber sieht leider reichlich sch**ße aus...
 
06.05.2009  
 



Sowas von!
 
06.05.2009  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

3.567 Betrachtungen

Unbenanntvor 0 min.
p.specht26.01.2018
Georg Teles02.01.2016
funkheld04.01.2014
Ragnar Rehbein11.02.2013
Mehr...

Themeninformationen

Dieses Thema hat 2 Teilnehmer:

iF (4x)
Frank Abbing (4x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie