Not sure if you are able to solve this, but here's the version that works with Win 10 x64...
Code: Select all
;=========================================================
; GetPBInfo.pb by Danilo
; Version: PureBasic 5.10
; see: https://www.purebasic.fr/english/viewtopic.php?t=53701
;
; - add out Procedures by Denis
; - arranging out code by gurj on [pb_v5.61]
; - other various mods
;=========================================================
; works with 5.73
; works with 6.00 LTS
;
EnableExplicit
Global log.s
#Compiler = #PB_Compiler_Home + "compilers\pbcompiler.exe"
Procedure StartCompiler()
ProcedureReturn RunProgram(#Compiler,"/STANDBY","",#PB_Program_Open|#PB_Program_Read|#PB_Program_Write|#PB_Program_Hide)
EndProcedure
Procedure StopCompiler(compiler)
WriteProgramStringN(compiler, "END")
WaitProgram(compiler,5000)
CloseProgram(compiler)
EndProcedure
Procedure SendCompilerCommand(compiler,command$)
If ProgramRunning(compiler)
WriteProgramStringN(compiler, command$)
EndIf
EndProcedure
Procedure.s GetCompilerOutput(compiler)
If AvailableProgramOutput(compiler)
ProcedureReturn ReadProgramString(compiler)
EndIf
EndProcedure
Procedure FillList(compiler,List OUT.s(),space=0)
Protected out$
Protected space$=Space(space)
While out$<>"OUTPUT"+#TAB$+"COMPLETE" And Left(out$,5)<>"ERROR"
out$=GetCompilerOutput(compiler)
If out$ And out$<>"OUTPUT"+#TAB$+"COMPLETE" And Left(out$,5)<>"ERROR" And FindString("0123456789",Mid(out$,1,1))=0
AddElement(out())
out()=space$+out$
EndIf
Wend
EndProcedure
Procedure FillConstantList(compiler,List OUT.s(),space=0)
Protected out$
Protected space$=Space(space)
While out$<>"OUTPUT"+#TAB$+"COMPLETE" And Left(out$,5)<>"ERROR"
out$=GetCompilerOutput(compiler)
If out$<>"" And out$<>"OUTPUT"+#TAB$+"COMPLETE" And Left(out$,5)<>"ERROR" And FindString("0123456789",Mid(out$,2,1))=0
If FindString("01",Mid(out$,1,1))
out$ = "#"+Mid(out$,2,Len(out$)-1)
out$ = ReplaceString(out$,#TAB$," = ")
out$ = ReplaceString(out$,"# = ","#")
ElseIf FindString("2",Mid(out$,1,1))
Protected i, found_non_printable = #False
Protected oldout$ = out$
Protected sconst_value$ = StringField(oldout$,3,Chr(9))
out$ = "#"+StringField(oldout$,2,#TAB$)
For i = 1 To Len(sconst_value$)
If Asc(Mid(sconst_value$,i)) < 32 Or Asc(Mid(sconst_value$,i)) > 126
found_non_printable = #True
EndIf
Next i
If out$ = "#TAB$"
out$ + " = Chr(9)"
ElseIf out$ = "#HT$"
out$ + " = Chr(9)"
ElseIf out$ = "#CRLF$"
out$ + " = Chr(13) + Chr(10)"
ElseIf out$ = "#LFCR$"
out$ + " = Chr(10) + Chr(13)"
ElseIf out$ = "#LF$"
out$ + " = Chr(10)"
ElseIf out$ = "#CR$"
out$ + " = Chr(13)"
ElseIf out$ = "#DOUBLEQUOTE$"
out$ + " = Chr(34)"
ElseIf out$ = "#DQUOTE$"
out$ + " = Chr(34)"
ElseIf found_non_printable = #False
out$ + " = " + #DQUOTE$ + StringField(oldout$,3,#TAB$) + #DQUOTE$
Else
out$ + " ="
Protected temp$ = StringField(oldout$,3,#TAB$)
For i = 0 To Len(sconst_value$)-1
out$ + " Chr("+Str(PeekB(@temp$+(i*SizeOf(Character)))) + ") +"
Next
EndIf
out$ = RTrim(out$,"+")
out$ = Trim(out$)
Else
log + out$+#LF$
EndIf
out$ = Trim(out$)
If out$
AddElement(out())
out()=space$+out$
EndIf
EndIf
Wend
EndProcedure
Procedure GetStructureList(compiler,List OUT.s())
If ProgramRunning(compiler)
SendCompilerCommand(compiler,"STRUCTURELIST")
FillList(compiler,out())
EndIf
EndProcedure
Procedure GetProcedureList(compiler,List OUT.s())
If ProgramRunning(compiler)
SendCompilerCommand(compiler,"FUNCTIONLIST")
FillList(compiler,out())
EndIf
EndProcedure
Procedure GetConstantsList(compiler,List OUT.s())
If ProgramRunning(compiler)
SendCompilerCommand(compiler,"CONSTANTLIST")
FillConstantList(compiler,out())
EndIf
EndProcedure
Procedure GetInterfaceList(compiler,List OUT.s())
If ProgramRunning(compiler)
SendCompilerCommand(compiler,"INTERFACELIST")
FillList(compiler,out())
EndIf
EndProcedure
Procedure GetStructureInfo(compiler,struct$,List OUT.s())
If ProgramRunning(compiler)
SendCompilerCommand(compiler,"STRUCTURE"+#TAB$+struct$)
FillList(compiler,out(),4)
EndIf
EndProcedure
Procedure GetInterfaceInfo(compiler,interf$,List OUT.s())
If ProgramRunning(compiler)
SendCompilerCommand(compiler,"INTERFACE"+#TAB$+interf$)
FillList(compiler,out(),4)
EndIf
EndProcedure
Procedure WaitCompilerReady(compiler)
Protected out$
While out$<>"READY" And Left(out$,5)<>"ERROR"
out$ = GetCompilerOutput(compiler)
If out$
log + out$+#LF$
EndIf
Wend
EndProcedure
Define pb, out$
NewList constants.s()
NewList structures.s()
NewList procedures.s()
NewList interfaces.s()
NewList structureInfo.s()
NewList interfaceInfo.s()
pb = StartCompiler()
If pb
WaitCompilerReady(pb)
GetStructureList(pb,structures())
log + "found "+Str(ListSize(structures()))+" structures"+#LF$
GetProcedureList(pb,procedures())
log + "found "+Str(ListSize(procedures()))+" procedures"+#LF$
GetConstantsList(pb,constants())
log + "found "+Str(ListSize(constants()))+" constants"+#LF$
SortList(constants(),#PB_Sort_Ascending|#PB_Sort_NoCase)
GetInterfaceList(pb,interfaces())
log + "found "+Str(ListSize(interfaces()))+" interfaces"+#LF$
ClearList(structureInfo())
ForEach structures()
AddElement(structureInfo())
structureInfo()="Structure "+structures()
GetStructureInfo(pb,structures(),structureInfo())
AddElement(structureInfo())
structureInfo()="EndStructure"
AddElement(structureInfo())
structureInfo()=""
Next
ClearList(interfaceInfo())
ForEach interfaces()
AddElement(interfaceInfo())
interfaceInfo()="Interface "+interfaces()
GetInterfaceInfo(pb,interfaces(),interfaceInfo())
AddElement(interfaceInfo())
interfaceInfo()="EndInterface"
AddElement(interfaceInfo())
interfaceInfo()=""
Next
If CreateFile(0,"pb"+#PB_Compiler_Version+" Structures.txt")
ForEach structureInfo()
WriteStringN(0,structureInfo())
Next
CloseFile(0)
EndIf
If CreateFile(0,"pb"+#PB_Compiler_Version+" Interfaces.txt")
ForEach interfaceInfo()
WriteStringN(0,interfaceInfo())
Next
CloseFile(0)
EndIf
If CreateFile(0,"pb"+#PB_Compiler_Version+" Constants.txt")
ForEach constants()
WriteStringN(0,constants())
Next
CloseFile(0)
EndIf
If CreateFile(0,"pb"+#PB_Compiler_Version+" Procedures.txt")
ForEach procedures()
WriteStringN(0,procedures())
Next
CloseFile(0)
EndIf
If CreateFile(0,"pb"+#PB_Compiler_Version+".log")
WriteString(0,log)
CloseFile(0)
EndIf
StopCompiler(pb)
MessageRequester( "GetPBInfo","Done, open the folder to view the results.")
EndIf