| Forum |  |  |  |  |  |  |  |  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.
  | 
 |  |  |  |  |  |  |  |  | 
 
 
 |  |  |  |  | | 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.
 | 
 |  |  |  |  |  |  |  |  | 
 
 
 |  |  |  |  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
 | 
 |  |  |  |  |  |  |  |  | 
 
 
 |  |  |  |  | | 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& .
 | 
 |  |  |  |  |  |  |  |  | 
 
 
 |  |  |  |  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.
 | 
 |  |  |  |  |  |  |  |  | 
 
 
 |  |  |  |  | | 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.
 | 
 |  |  |  |  |  |  |  |  | 
 
 
 |  |  |  |  Frank
 Abbing
 | | Ja, aber sieht leider reichlich sch**ße aus...  | 
 |  |  |  |  |  |  |  |  | 
 
 
 |  |  |  |  | | Sowas von!  | 
 |  |  |  |  |  |  |  |  | 
 
 
 | 
 Antworten| Themenoptionen | 3.848 Betrachtungen | 
 ThemeninformationenDieses Thema hat 2 Teilnehmer: |