Gibt es eigentlich eine Art Vermeidungs-Taktik für False Positives?
Das Progrämmchen mal hier:
Code: Alles auswählen
; ***** GUI Modus
; für die Konfiguration des Compilers im jeweiligen Slot stehen folgende Platzhalter zur Verfügung:
; %s Quellcode
; %x Executable
; Diese sind in den Optionen zwingend(!) zu zu benutzen.
; Die einfachste Kommandozeilenoption des PureBasic Compilers sieht als Beispiel dann so aus: %s /exe %x
; Für FreeBASIC im GUI Modus sehen die Optionen so aus: -s gui %s -x %x
; Das Programm tauscht die Platzhalter durch die entsprechenden Dateinamen aus.
; Dadurch ist sichergestellt, dass Quellcode und kompilierte Binary den gleichen Namen haben und sich auch im selben
; Verzeichnis befinden.
; ***** Konsolen Modus
; während im GUI Modus in den Slots verschiedene Konfigurationen eingestellt und getestet werden können,
; gilt es im Konsolen Modus diese Konfigurationen zu benutzen.
; -c <n> Nummer des Slots dessen Konfiguration benutzt werden soll
; -s <sourcefile> Dateiname des Quelltextes der kompiliert und ausgeführt werden soll
; -p yes Schalter, ob dem kompilierten Programm bestimmte Parameter mitgegeben werden soll.
; Wenn ja dann öffnet sich vor Programmstart eine EingabeBox.
; Bei Weglassen wird keine EingabeBox erscheinen.
; Bespiel für Aufruf:
; <launcherpfad> -c 0 -s c:\qellcode.pb
; Beispiele für das Einbinden des Launchers in Notepad++
; Notepad++ besitzt sogenannte Environment Variablen. Die hier wichtige ist $(FULL_CURRENT_PATH), das ist
; die aktuelle geöffnete Datei. Über die F5 Taste bzw das "Ausführen" Menü kann dann der Launcher in N++ eingebunden werden.
; <launcherpfad> -c 0 -s "$(FULL_CURRENT_PATH)"
; <launcherpfad> -c 1 -s "$(FULL_CURRENT_PATH)" -p yes
; Somit kann man mit Hilfe dieses kleinen Programmes Notepad++ als IDE benutzen, aus welcher man seinen Code "direkt starten" kann.
EnableExplicit
Declare.i RunMyProgram (exefile.s, parameter.s, outputmode.i=1)
Declare.i RunSequence (compiler.s, options.s, source.s, prequest.i=0)
Declare.s QuotationChecked (text.s)
;Programmzeugs
#numSlots=100;hiermit kann man die Anzahl der Compilerkonfigurationen selbst bestimmen
Dim cmpfile.s(#numSlots-1)
Dim cmpoptions.s(#numSlots-1)
Define.s sourcefile,tmp,ParameterQualifier,ParameterContent
Define.i SlotIndex,AddContentMode,EssentialsFound,ParameterCount,i,AskForExeParameter
;GUI, File
Define.i Event,FileHandle
Global.i Combo_CmpSlot
Global.i Label_Cmpfile,String_Cmpfile,Button_Cmpfile_FR
Global.i Label_Options,String_Options,Button_Srcfile_FR
Global.i Check_Parameter
SetCurrentDirectory( GetPathPart( ProgramFilename() ) );Exeverzeichnis zum Arbeitsverzeichnis machen
FileHandle=ReadFile(#PB_Any ,"config.cfg")
If FileHandle
For SlotIndex=0 To #numSlots-1
cmpfile(SlotIndex) = ReadString(FileHandle)
cmpoptions(SlotIndex)=ReadString(FileHandle)
Next SlotIndex
sourcefile=ReadString(FileHandle)
CloseFile(FileHandle)
EndIf
;Consolenparameter Parser
AskForExeParameter=0
ParameterQualifier=""
ParameterContent=""
EssentialsFound=0
AddContentMode=0
ParameterCount=CountProgramParameters()
For i=1 To ParameterCount
ParameterContent=ProgramParameter()
ParameterQualifier=LCase(ParameterContent)
If AddContentMode
Select AddContentMode
Case 1
SlotIndex=Val(ParameterContent)
If SlotIndex<0
SlotIndex=0
EndIf
If SlotIndex>3
SlotIndex=3
EndIf
EssentialsFound=EssentialsFound+1
Case 2
sourcefile=ParameterContent
EssentialsFound=EssentialsFound+1
Case 3
If LCase(ParameterContent)="yes"
AskForExeParameter=1
Else
AskForExeParameter=0
EndIf
EndSelect
EndIf
AddContentMode=0
Select ParameterQualifier
Case "-c"
AddContentMode=1
Case "-s"
AddContentMode=2
Case "-p"
AddContentMode=3
EndSelect
Next i
;*************
If EssentialsFound=2 ;wenn die beiden wichtigen Consolenparameter gefunden wurden
;Rufe Compiler auf, compiliere den Quellcode und starte das Compilat
RunSequence (cmpfile(SlotIndex), cmpoptions(SlotIndex), sourcefile, AskForExeParameter)
Else ;wenn keine Parameter gefunden dann GUI öffnen
If OpenWindow(#PB_Any, 0, 0,310,130, "Launcher", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
Combo_CmpSlot =ComboBoxGadget(#PB_Any, 70, 10, 200, 20)
Label_Cmpfile =TextGadget(#PB_Any,10,42,50,20,"Compiler:",#PB_Text_Right )
String_Cmpfile =StringGadget(#PB_Any,70,40,200,20,"")
Button_Cmpfile_FR =ButtonGadget(#PB_Any,280,40,20,20,"..")
Label_Options =TextGadget(#PB_Any,10,72,50,20,"Options:",#PB_Text_Right )
String_Options =StringGadget(#PB_Any,70,70,200,20,"")
Button_Srcfile_FR =ButtonGadget(#PB_Any,140,100,130,20,"Select Source And Run")
Check_Parameter =CheckBoxGadget(#PB_Any, 70, 100, 70, 20, "Parameter")
SlotIndex=0
For i=0 To #numslots-1
AddGadgetItem(Combo_CmpSlot,-1,"Compiler Slot " + Str(i))
Next i
SetGadgetState(Combo_CmpSlot, SlotIndex)
SetGadgetText(String_Cmpfile, cmpfile(SlotIndex))
SetGadgetText(String_Options, cmpoptions(SlotIndex))
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case Combo_CmpSlot
SlotIndex=GetGadgetState(Combo_CmpSlot)
SetGadgetText(String_Cmpfile, cmpfile(SlotIndex))
SetGadgetText(String_Options, cmpoptions(SlotIndex))
Case String_Cmpfile
cmpfile(SlotIndex)=GetGadgetText(String_Cmpfile)
Case String_Options
cmpoptions(SlotIndex)=GetGadgetText(String_Options)
Case Button_Cmpfile_FR
tmp=""
tmp=OpenFileRequester("Compiler", cmpfile(SlotIndex),"",0)
If tmp<>""
cmpfile(SlotIndex)=tmp
SetGadgetText(String_Cmpfile, cmpfile(SlotIndex))
EndIf
Case Button_Srcfile_FR
tmp=""
tmp=OpenFileRequester("Source", sourcefile,"",0)
If tmp<>""
If GetGadgetState(Check_Parameter)=#PB_Checkbox_Checked
AskForExeParameter=1
Else
AskForExeParameter=0
EndIf
sourcefile=tmp
RunSequence (cmpfile(SlotIndex), cmpoptions(SlotIndex), sourcefile, AskForExeParameter)
EndIf
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
EndIf
EndIf
;zum Schluss aufräumen
SetCurrentDirectory( GetPathPart( ProgramFilename() ) )
FileHandle=CreateFile(#PB_Any ,"config.cfg")
If FileHandle
For SlotIndex=0 To #numSlots-1
WriteStringN(FileHandle, cmpfile(SlotIndex))
WriteStringN(FileHandle, cmpoptions(SlotIndex))
Next SlotIndex
WriteStringN(FileHandle, sourcefile)
CloseFile (FileHandle)
EndIf
End 0
;******************************************************************************
;******************************************************************************
;******************************************************************************
Procedure.i RunMyProgram (exefile.s, parameter.s, outputmode.i=1)
Define xhandle.i,ReturnCode.i, Flags.i
Define.s ProgramOutput,ErrorOutput
Select outputmode
Case 0
Flags=0
xhandle=RunProgram(exefile, parameter, "", Flags )
Case 1
Flags=#PB_Program_Open |#PB_Program_Read | #PB_Program_Error
xhandle=RunProgram(exefile, parameter, "", Flags )
If xhandle
While ProgramRunning(xhandle)
If AvailableProgramOutput(xhandle)
ProgramOutput= ProgramOutput + ReadProgramString(xhandle) + Chr(13)
ErrorOutput= ErrorOutput + ReadProgramError(xhandle) + Chr(13)
EndIf
Wend
ReturnCode=ProgramExitCode(xhandle)
EndIf
CloseProgram(xhandle)
If ReturnCode
MessageRequester("Error:", ProgramOutput + ErrorOutput, #PB_MessageRequester_Ok | #PB_MessageRequester_Info)
EndIf
EndSelect
ProcedureReturn ReturnCode
EndProcedure
Procedure.i RunSequence (compiler.s, options.s, source.s, prequest.i=0)
Define.s tmpsourcefile,tmpexefile,tmpoptions,exeparameter
Define.i CReturncode,EReturncode
If compiler<>""
SetCurrentDirectory(GetPathPart(source))
tmpsourcefile=QuotationChecked(source)
tmpexefile=ReplaceString(tmpsourcefile, GetExtensionPart(tmpsourcefile), "exe")
;im Optionsstring nun die Platzhalter durch die entsprechenden Strings ersetzen
tmpoptions=ReplaceString(options,"%s",tmpsourcefile)
tmpoptions=ReplaceString(tmpoptions,"%x",tmpexefile)
CReturncode= RunMyProgram(compiler, tmpoptions, 1 )
If CReturncode=0 ;falls Compilierung erfolgreich, Compilat aufrufen
If prequest
exeparameter=InputRequester("Parameter","","")
EndIf
EReturncode= RunMyProgram(tmpexefile, exeparameter, 0)
EndIf
EndIf
EndProcedure
Procedure.s QuotationChecked (text.s)
;so vorhanden, erstmal äussere Anführungszeichen entfernen
;weiter innen liegende sollten erhalten bleiben
If Left(text,1)=Chr(34) And Right(text,1)=Chr(34)
text= Mid(text,2,Len(text)-2)
EndIf
;falls ein Space enthalten ist, äussere Anführungszeichen wieder hinzufügen
If FindString(text, Chr(32))>0
text=Chr(34) + text + Chr(34)
EndIf
ProcedureReturn text
EndProcedure
Es gibt einen GUI Modus, bei dem man Compiler & Parameter austesten und in einen "Config-Slot" packt.
Später soll dann nur der entsprechende "Slot" aufgerufen werden und das im Editor befindliche Programm soll entsprechend kompiliert und ausgeführt werden.
Mutton