I propose this code for example do to jaPBe plugin, is for PB 4.00 or more and i had auto installation in jaPBe Plugin folder if plugin is running without jaPBe.
Code: Select all
;- Global
Global jaPBe_Handle
Global jaPBe_Version
Global jaPBe_CompilerMsg.s
Global jaPBe_CompilerType
Global jaPBe_FileName.s
Global jaPBe_Selection
Global jaPBe_CurrentWord
Global jaPBe_CompleteText
Global jaPBe_CurrentLine
Global jaPBe_IncludePath.s
Global jaPBe_jaPBeEXE.s
Global jaPBe_PBPath.s
#timeout = 5000
;- Window-Message
#mywm_Plugin_GetCurrentFileName = #WM_USER + 12
#mywm_Plugin_GetSelection = #WM_USER + 13
#mywm_Plugin_GetCurrentWord = #WM_USER + 14
#mywm_plugin_GetCompleteText = #WM_USER + 15
#mywm_plugin_GetCurrentLine = #WM_USER + 16
#mywm_plugin_GetCurrentPosition = #WM_USER + 17
#mywm_Plugin_Cancel = #WM_USER + 18
#mywm_plugin_DisablejaPBe = #WM_USER + 19
#mywm_plugin_EnablejaPBe = #WM_USER + 20
#mywm_Plugin_CompileRun = #WM_USER + 21
#mywm_plugin_Run = #WM_USER + 22
#mywm_plugin_CreateExecutable = #WM_USER + 23
#mywm_plugin_GetCompileThis = #WM_USER + 24
#mywm_Plugin_GetIncludePackPath = #WM_USER + 25
#mywm_Plugin_IncreaseBuild = #WM_USER + 26
#mywm_plugin_SaveAll = #WM_USER + 27
#mywm_plugin_Save = #WM_USER + 28
#mywm_Plugin_jaPBePath = #WM_USER + 29
#mywm_Plugin_PureBasicPath = #WM_USER + 30
#mywm_Plugin_CompileDebug = #WM_USER + 31
#mywm_Plugin_RestartCompiler = #WM_USER + 32 ; gnozal
#mywm_Plugin_DeleteCurrentTab = #WM_USER + 33 ; gnozal
#mywm_Plugin_LockCurrentTab = #WM_USER + 34 ; gnozal
;- Window-CopyData
#WMCD_OpenFile = 1
#WMCD_InsertText = 2
#wmCD_ReplaceCompleteText = 3
#wmcd_ReplaceCurrentLine = 4
#wmcd_NewText = 5
#wmcd_Fatal_Error = 6
#wmcd_Assembler_Error = 7
#wmcd_Linker_Error = 8
#wmcd_Syntax_Error = 9
#wmcd_Compilation_Finished = 10
#comp_Fatal_Error = 6
#comp_Assembler_Error = 7
#comp_Linker_Error = 8
#comp_Syntax_Error = 9
#comp_Compilation_Finished = 10
Procedure SendDataS(ziel, Type, Message$)
cd.COPYDATASTRUCT
cd\dwData = Type
cd\cbData = Len(Message$) + 1
cd\lpData = @Message$
ProcedureReturn SendMessage_(ziel, #WM_COPYDATA, WindowID(1), cd)
EndProcedure
Procedure SendData(ziel, Type, adr, len)
cd.COPYDATASTRUCT
cd\dwData = Type
cd\cbData = len + 1
cd\lpData = adr
ProcedureReturn SendMessage_(ziel, #WM_COPYDATA, WindowID(1), cd)
EndProcedure
Procedure Callback(WindowId, message, wParam, lParam)
Result = #PB_ProcessPureBasicEvents
If message = #WM_COPYDATA
*cd.COPYDATASTRUCT = lParam
Result = #False
If wParam = jaPBe_Handle
Select *cd\dwData
Case #mywm_Plugin_jaPBePath
jaPBe_jaPBeEXE = PeekS(*cd\lpData)
Result = #True
Case #mywm_Plugin_PureBasicPath
jaPBe_PBPath = PeekS(*cd\lpData)
Result = #True
Case #mywm_Plugin_GetIncludePackPath
jaPBe_IncludePath = PeekS(*cd\lpData)
Result = #True
Case #mywm_plugin_GetCompileThis
jaPBe_FileName = PeekS(*cd\lpData)
Result = #True
Case #mywm_Plugin_GetCurrentFileName
jaPBe_FileName = PeekS(*cd\lpData)
Result = #True
Case #mywm_Plugin_GetSelection
jaPBe_Selection = GlobalAlloc_(#GMEM_FIXED, *cd\cbData)
If jaPBe_Selection
CopyMemory(*cd\lpData, jaPBe_Selection, *cd\cbData)
Result = #True
EndIf
Case #mywm_Plugin_GetCurrentWord
jaPBe_CurrentWord = GlobalAlloc_(#GMEM_FIXED, *cd\cbData)
If jaPBe_CurrentWord
CopyMemory(*cd\lpData, jaPBe_CurrentWord, *cd\cbData)
Result = #True
EndIf
Case #mywm_plugin_GetCompleteText
jaPBe_CompleteText = GlobalAlloc_(#GMEM_FIXED, *cd\cbData)
If jaPBe_CompleteText
CopyMemory(*cd\lpData, jaPBe_CompleteText, *cd\cbData)
Result = #True
EndIf
Case #mywm_plugin_GetCurrentLine
jaPBe_CurrentLine = GlobalAlloc_(#GMEM_FIXED, *cd\cbData)
If jaPBe_CurrentLine
CopyMemory(*cd\lpData, jaPBe_CurrentLine, *cd\cbData)
Result = #True
EndIf
Default
If *cd\dwData >= #wmcd_Fatal_Error And *cd\dwData <= #wmcd_Compilation_Finished
jaPBe_CompilerMsg = PeekS(*cd\lpData, *cd\cbData)
If jaPBe_CompilerMsg = Chr(255)
jaPBe_CompilerMsg = ""
EndIf
jaPBe_CompilerType = *cd\dwData
Result = #True
EndIf
EndSelect
Else
MessageRequester("jaPBe-Plugin", "I got a message NOT from jaPBe!")
EndIf
EndIf
ProcedureReturn Result
EndProcedure
;- Send
Procedure jaPBe_LockCurrentTab(Locked.l) ; gnozal : Lock current source tab
ProcedureReturn SendMessage_(jaPBe_Handle, #mywm_Plugin_LockCurrentTab, Locked, 0)
EndProcedure
Procedure jaPBe_DeleteCurrentTab() ; gnozal : Delete current source tab
ProcedureReturn SendMessage_(jaPBe_Handle, #mywm_Plugin_DeleteCurrentTab, 0, 0)
EndProcedure
Procedure jaPBe_RestartCompiler() ; gnozal : Restart compiler [use before exiting pluging]
ProcedureReturn SendMessage_(jaPBe_Handle, #mywm_Plugin_RestartCompiler, 0, WindowID(1))
EndProcedure
Procedure jaPBe_OpenFile(File$) ; Open the given File in jaPBe
SendDataS(jaPBe_Handle, #WMCD_OpenFile, File$)
EndProcedure
Procedure jaPBe_InsertTextS(Text$) ; Insert the Text in the current Source Code
SendDataS(jaPBe_Handle, #WMCD_InsertText, Text$)
EndProcedure
Procedure jaPBe_InsertText(adr, len) ; Insert the Text in the current Source Code
SendData(jaPBe_Handle, #WMCD_InsertText, adr, len)
EndProcedure
Procedure jaPBe_ReplaceTextS(Text$) ; Replace the complete Text in the current Source Code
SendDataS(jaPBe_Handle, #wmCD_ReplaceCompleteText, Text$)
EndProcedure
Procedure jaPBe_ReplaceText(adr, len) ; Replace the complete Text in the current Source Code
SendData(jaPBe_Handle, #wmCD_ReplaceCompleteText, adr, len)
EndProcedure
Procedure jaPBe_ReplaceCurrentLineS(Text$) ; Replace the current Line in the current Source Code
SendDataS(jaPBe_Handle, #wmcd_ReplaceCurrentLine, Text$)
EndProcedure
Procedure jaPBe_ReplaceCurrentLine(adr, len) ; Replace the current Line in the current Source Code
SendData(jaPBe_Handle, #wmcd_ReplaceCurrentLine, adr, len)
EndProcedure
Procedure jaPBe_NewTextS(Text$) ; Open in jaPBe a new text and fill it with the text
SendDataS(jaPBe_Handle, #wmcd_NewText, Text$)
EndProcedure
Procedure jaPBe_NewText(adr, len) ; Open in jaPBe a new text and fill it with the text
SendData(jaPBe_Handle, #wmcd_NewText, adr, len)
EndProcedure
Procedure jaPBe_EnablejaPBe() ; Enable that the user can control jaPBe
ProcedureReturn PostMessage_(jaPBe_Handle, #mywm_plugin_EnablejaPBe, 0, WindowID(1))
EndProcedure
Procedure jaPBe_DisablejaPBe() ; Disable any User-control over jaPBe
ProcedureReturn PostMessage_(jaPBe_Handle, #mywm_plugin_DisablejaPBe, 0, WindowID(1))
EndProcedure
Procedure jaPBe_SaveAll() ; Save all open Source
ProcedureReturn SendMessage_(jaPBe_Handle, #mywm_plugin_SaveAll, 0, WindowID(1))
EndProcedure
Procedure jaPBe_Save() ; Save Current File
ProcedureReturn SendMessage_(jaPBe_Handle, #mywm_plugin_Save, 0, WindowID(1))
EndProcedure
;- Get
; Waring: This routines use windowevent(), so maybe you lost messages
Procedure.s jaPBe_GetIncludePackPath() ; Returns the path to the Include-Pack
jaPBe_IncludePath = ""
If SendMessage_(jaPBe_Handle, #mywm_Plugin_GetIncludePackPath, 0, WindowID(1))
timeout = ElapsedMilliseconds() + #timeout ; maximal 5 sekunden warten
Repeat
WindowEvent()
Delay(1)
Until jaPBe_IncludePath <> "" Or ElapsedMilliseconds() > timeout
EndIf
ProcedureReturn jaPBe_IncludePath
EndProcedure
Procedure.s jaPBe_GetjaPBeExeName() ; Returns the path to jaPBe
jaPBe_jaPBeEXE = ""
If SendMessage_(jaPBe_Handle, #mywm_Plugin_jaPBePath, 0, WindowID(1))
timeout = ElapsedMilliseconds() + #timeout ; maximal 5 sekunden warten
Repeat
WindowEvent()
Delay(1)
Until jaPBe_jaPBeEXE <> "" Or ElapsedMilliseconds() > timeout
EndIf
ProcedureReturn jaPBe_jaPBeEXE
EndProcedure
Procedure.s jaPBe_GetPBPath() ; Returns the path to PureBasic
jaPBe_PBPath = ""
If SendMessage_(jaPBe_Handle, #mywm_Plugin_PureBasicPath, 0, WindowID(1))
timeout = ElapsedMilliseconds() + #timeout ; maximal 5 sekunden warten
Repeat
WindowEvent()
Delay(1)
Until jaPBe_PBPath <> "" Or ElapsedMilliseconds() > timeout
EndIf
ProcedureReturn jaPBe_PBPath
EndProcedure
Procedure.s jaPBe_GetCurrentFileName() ; Returns the Current file name (String)
jaPBe_FileName = ""
If SendMessage_(jaPBe_Handle, #mywm_Plugin_GetCurrentFileName, 0, WindowID(1))
timeout = ElapsedMilliseconds() + #timeout ; maximal 5 sekunden warten
Repeat
WindowEvent()
Delay(1)
Until jaPBe_FileName <> "" Or ElapsedMilliseconds() > timeout
EndIf
ProcedureReturn jaPBe_FileName
EndProcedure
Procedure.s jaPBe_GetCompileThis() ; Returns the CompileThis file or "" (String)
jaPBe_FileName = ""
If SendMessage_(jaPBe_Handle, #mywm_plugin_GetCompileThis, 0, WindowID(1))
timeout = ElapsedMilliseconds() + #timeout ; maximal 5 sekunden warten
Repeat
WindowEvent()
Delay(1)
Until jaPBe_FileName <> "" Or ElapsedMilliseconds() > timeout
EndIf
ProcedureReturn jaPBe_FileName
EndProcedure
Procedure jaPBe_GetSelection() ; Returns a address with the selected Text or 0, if no Text selected
If jaPBe_Selection
GlobalFree_(jaPBe_Selection)
jaPBe_Selection = 0
EndIf
If SendMessage_(jaPBe_Handle, #mywm_Plugin_GetSelection, 0, WindowID(1))
timeout = ElapsedMilliseconds() + #timeout ; maximal 5 sekunden warten
Repeat
WindowEvent()
Delay(1)
Until jaPBe_Selection Or ElapsedMilliseconds() > timeout
EndIf
ProcedureReturn jaPBe_Selection
EndProcedure
Procedure.s jaPBe_GetSelectionS() ; Returns a String with the selected Text
Result = jaPBe_GetSelection()
If Result
ProcedureReturn PeekS(Result)
Else
ProcedureReturn ""
EndIf
EndProcedure
Procedure jaPBe_GetCurrentWord() ; Returns a address with the Word under the cursor or 0 if no word under the cursor
If jaPBe_CurrentWord
GlobalFree_(jaPBe_CurrentWord)
jaPBe_Selection = 0
EndIf
If SendMessage_(jaPBe_Handle, #mywm_Plugin_GetCurrentWord, 0, WindowID(1))
timeout = ElapsedMilliseconds() + #timeout ; maximal 5 sekunden warten
Repeat
WindowEvent()
Delay(1)
Until jaPBe_CurrentWord Or ElapsedMilliseconds() > timeout
EndIf
ProcedureReturn jaPBe_CurrentWord
EndProcedure
Procedure.s jaPBe_GetCurrentWordS() ; Returns a String with the Word under the cursor or 0 if no word under the cursor
Result = jaPBe_GetCurrentWord()
If Result
ProcedureReturn PeekS(Result)
Else
ProcedureReturn ""
EndIf
EndProcedure
Procedure jaPBe_GetCompleteText() ; Returns a address with the complete text or 0 if no text
If jaPBe_CompleteText
GlobalFree_(jaPBe_CompleteText)
jaPBe_CompleteText = 0
EndIf
If SendMessage_(jaPBe_Handle, #mywm_plugin_GetCompleteText, 0, WindowID(1))
timeout = ElapsedMilliseconds() + #timeout ; maximal 5 sekunden warten
Repeat
WindowEvent()
Delay(1)
Until jaPBe_CompleteText Or ElapsedMilliseconds() > timeout
EndIf
ProcedureReturn jaPBe_CompleteText
EndProcedure
Procedure.s jaPBe_GetCompleteTextS() ; Returns a String with the complete text
Result = jaPBe_GetCompleteText()
If Result
ProcedureReturn PeekS(Result)
Else
ProcedureReturn ""
EndIf
EndProcedure
Procedure jaPBe_GetCurrentLine() ; Returns a address with the current line or 0, if the line is empty
If jaPBe_CurrentLine
GlobalFree_(jaPBe_CurrentLine)
jaPBe_CurrentLine = 0
EndIf
If SendMessage_(jaPBe_Handle, #mywm_plugin_GetCurrentLine, 0, WindowID(1))
timeout = ElapsedMilliseconds() + #timeout ; maximal 5 sekunden warten
Repeat
WindowEvent()
Delay(1)
Until jaPBe_CurrentLine Or ElapsedMilliseconds() > timeout
EndIf
ProcedureReturn jaPBe_CurrentLine
EndProcedure
Procedure.s jaPBe_GetCurrentLineS() ; Returns a String with the current line
Result = jaPBe_GetCurrentLine()
If Result
ProcedureReturn PeekS(Result)
Else
ProcedureReturn ""
EndIf
EndProcedure
Procedure WaitForCompilerMsg_()
Repeat
WindowEvent() : Delay(100)
Until jaPBe_CompilerType
EndProcedure
Procedure jaPBe_CompileRun() ; Compile and Run the current SourceCode 0=Error, returns #comp_...; jaPBe_CompilerMsg contains message
jaPBe_CompilerType = 0
If SendMessage_(jaPBe_Handle, #mywm_Plugin_CompileRun, 0, WindowID(1))
WaitForCompilerMsg_()
EndIf
ProcedureReturn jaPBe_CompilerType
EndProcedure
Procedure jaPBe_CompileDebug() ; Compile and Run the current SourceCode 0=Error, returns #comp_...; jaPBe_CompilerMsg contains message
jaPBe_CompilerType = 0
If SendMessage_(jaPBe_Handle, #mywm_Plugin_CompileDebug, 0, WindowID(1))
WaitForCompilerMsg_()
EndIf
ProcedureReturn jaPBe_CompilerType
EndProcedure
Procedure jaPBe_Run() ; Run the last compiled SourceCode 0=Error
ProcedureReturn SendMessage_(jaPBe_Handle, #mywm_plugin_Run, 0, WindowID(1))
EndProcedure
Procedure jaPBe_CreateExecutable() ; Create a Executable 0=Error, returns #comp_; jaPBe_CompilerMsg contains message
jaPBe_CompilerType = 0
If SendMessage_(jaPBe_Handle, #mywm_plugin_CreateExecutable, 0, WindowID(1))
WaitForCompilerMsg_()
EndIf
ProcedureReturn jaPBe_CompilerType
EndProcedure
Procedure jaPBe_IncreaseBuild() ; Increase the build-counter of the current-main-file
ProcedureReturn SendMessage_(jaPBe_Handle, #mywm_Plugin_IncreaseBuild, 0, WindowID(1))
EndProcedure
; get without windowevent
Procedure jaPBe_GetCurrentPos()
ProcedureReturn SendMessage_(jaPBe_Handle, #mywm_plugin_GetCurrentPosition, 0, WindowID(1))
EndProcedure
Procedure jaPBe_Active()
GetWindowThreadProcessId_(jaPBe_Handle, @EditorProcessID)
ProcessHandle = OpenProcess_(#PROCESS_QUERY_INFORMATION, 0, EditorProcessID)
a = GetExitCodeProcess_(ProcessHandle, @b)
If b <> $103 Or a = 0 ; still_active
Result = #False
Else
Result = #True
EndIf
CloseHandle_(ProcessHandle)
ProcedureReturn Result
EndProcedure
If OpenWindow(1, 0, 200, 200, 200, "jaPBe-Plugin", #PB_Window_Invisible)
SetWindowCallback(@Callback())
a$ = ProgramParameter()
If a$ = "jaPBe"
jaPBe_Handle = Val(ProgramParameter())
jaPBe_Version$ = ProgramParameter()
;- here is space for your plugin
; by default, the japbe-editor is disabled while the plugin runs.
; when you want, that the editor should work, call
; jaPBe_EnablejaPBe()
; Important: Never delete the follow line!
PostMessage_(jaPBe_Handle, #mywm_Plugin_Cancel, 0, WindowID(1))
Else
MessageRequester("jaPBe Plugin", "This is a jaPBe-Plugin" + Chr(10) + "You can't run it without jaPBe" + Chr(10) + Chr(10) + "To install Plugin automatically, select 'jaPBe.exe' in next requester.", 0)
jaPBe_Path.s = OpenFileRequester("Select jaPBe to install plugin automatically", "", "jaPBe.exe|jaPBe.exe", 0)
If jaPBe_Path And LCase(GetFilePart(jaPBe_Path)) = "japbe.exe"
If CopyFile(ProgramFilename(), GetPathPart(jaPBe_Path) + "Plugin\" + GetFilePart(ProgramFilename()))
MessageRequester("jaPBe Plugin", "Your plugin is installed, you will find it in menu 'Tools' of jaPBe." + Chr(10) + "(If jaPBe is open, restart it)")
Else
MessageRequester("jaPBe Plugin error", "Can't install plugin !")
EndIf
EndIf
EndIf
CloseWindow(1)
Else
MessageRequester("jaPBe Plugin", "Can't open a window!", 0)
EndIf
; Free some stuff
If jaPBe_Selection
GlobalFree_(jaPBe_Selection)
EndIf
If jaPBe_CurrentWord
GlobalFree_(jaPBe_CurrentWord)
EndIf
If jaPBe_CompleteText
GlobalFree_(jaPBe_CompleteText)
EndIf
If jaPBe_CurrentLine
GlobalFree_(jaPBe_CurrentLine)
EndIf
End