Here's an example of how to use TextPipe's command line interface from within a Microsoft Word macro:
'wait for single object code Const SYNCHRONIZE = &H100000 'Wait forever Const INFINITE = &HFFFF 'Windows functions that we need to call - must be at top of file Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _ ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, _ ByVal dwMilliseconds As Long) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Sub waitProcess(commandLine As String) ' The WaitForSingleObject function returns when one of the following occurs: ' - The specified object is in the signaled state. ' - The time-out interval elapses. ' ' The dwMilliseconds parameter specifies the time-out interval, in milliseconds. ' The function returns if the interval elapses, even if the object’s state is ' nonsignaled. If dwMilliseconds is zero, the function tests the object’s state ' and returns immediately. If dwMilliseconds is INFINITE, the function’s time-out ' interval never elapses. ' ' This example waits an INFINITE amount of time for the process to end. As a ' result this process will be frozen until the shelled process terminates. The ' down side is that if the shelled process hangs, so will this one. ' ' A better approach is to wait a specific amount of time. Once the time-out ' interval expires, test the return value. If it is WAIT_TIMEOUT, the process ' is still not signaled. Then you can either wait again or continue with your ' processing. ' ' DOS Applications: ' Waiting for a DOS application is tricky because the DOS window never goes ' away when the application is done. To get around this, prefix the app that ' you are shelling to with "command.com /c". ' ' For example: lPid = Shell("command.com /c " & commandLine, vbNormalFocus) ' Dim lPid As Long Dim lHnd As Long Dim lRet As Long If Trim$(commandLine) = "" Then Exit Sub 'can also use vbNormalFocus instead of vbHide lPid = Shell(commandLine, vbHide) If lPid <> 0 Then 'Get a handle to the shelled process. lHnd = OpenProcess(SYNCHRONIZE, 0, lPid) 'If successful, wait for the application to end and close the handle. If lHnd <> 0 Then lRet = WaitForSingleObject(lHnd, INFINITE) CloseHandle (lHnd) End If 'uncomment this line for debugging 'MsgBox "Just terminated.", vbInformation, "Shelled Application" End If End Sub Sub TextPipeCommandLineExample() ' ' Macro by Simon Carter, DataMystic ' Demonstrates running TextPipe on a Word Document using the ' Command Line ' Dim TaskId Dim TextPipePath Dim FilterName Dim pathname 'select the entire document Selection.WholeStory 'copy the entire document to the clipboard Selection.Copy 'TextPipe's location - we must use double quotes because of spaces in the name TextPipePath = """c:\Program Files\TextPipe\textpipe.exe""" 'The filter to run - we must use double quotes because of spaces in the name 'Because we copy the whole document to the clipboard, this filter must be 'set to process the clipboard FilterName = """/f=c:\Program Files\TextPipe\cleantext.fll""" 'run TextPipe via the command line and wait for it to finish waitProcess( TextPipePath & " " & FilterName & " /g /q " ) 'paste the result in, overwriting the original Selection.WholeStory Selection.Paste End Sub
Did you know? You can generate a command line for TextPipe using Tools Menu\Command line wizard.