HOWTO: Using DDE
		
		
        
			Print
		
  
  
		ZTN1032
		
		
 
ID: ZTN1032
This Zetafax technical note applies to:
- Zetafax 5.5 client and later 
Summary
Addressing information can be passed across from a Windows application to the Zetafax client using Dynamic Data Exchange (DDE), prior to printing the document. The full range of options is available with the API add-on, but there is limited support without it.
Applications such as word processors may communicate with the Zetafax client directly using DDE commands.  Provided adequate details have first been given using the DDE commands, when a document is "printed" using either of the Zetafax printer drivers no dialog boxes will be displayed and the fax or faxes will be submitted to the fax server automatically.
This technical note includes three examples that may be used without the API upgrade.
More information
Before issuing any addressing commands, a DDE conversation must be established between the application and the Zetafax client program. The name of the DDE server is "Zetafax", and the topic for the purposes of addressing faxes is "Addressing".
The Zetafax client program should be put under the control of DDE by issuing a DDEControl DDE Execute call.
Addressing commands can then be issued using DDE Poke calls. Details of the commands which may be used are given below.
A message file should be created by printing to the Zetafax printer driver. Alternatively an ASCII file, or a suitable Epson or TIFF file renamed "ZETAFAX.SPL" may be copied to the spool file location used by the Zetafax client program typically either %windir% or the directory given by the TEMP/TMP environment variable (e.g. C:\TEMP\ or %windir%\TEMP\)
The message can be submitted to the Zetafax server for sending with a Send DDE Execute call, or for preview with a Preview DDE Execute call.
Further messages can be submitted by specifying a new addressee, organization, and fax number, creating a new message file, and then issuing a Send or Preview DDE Execute call. Note that each of the addressing settings, such as the choice of letterhead, will remain unchanged between messages until the appropriate DDE Poke call is made to alter it. If these settings need to be reset to their default values between messages, the Zetafax client program should be released from DDE control with a DDERelease DDE Execute call and then put back under DDE control with a DDEControl DDE Execute call.
After submitting the message or messages the Zetafax client program should be released from the control of DDE by issuing a DDERelease DDE Execute call.
The DDE conversation should finally be terminated properly.
The following WM_DDE_EXECUTE commands may be issued using the "Addressing" topic:
| Command | Description | 
| DDEControl | Puts the Zetafax client program under DDE control for addressing. | 
| Send | Submits a message to the Zetafax server for sending. | 
| Preview | Submits a message to the Zetafax server for preview. | 
| DDERelease | Releases the Zetafax client from DDE control. | 
The following table lists the items that may be poked (WM_DDE_POKE) using the "Addressing" topic whilst the Zetafax client program is under DDE control on all Zetafax configurations:
| Item | Parameters | 
| To | fax, recipientname, organization | 
| Fax | fax | 
| Name | recipientname | 
| Organisation | organisation | 
For a description of each command and its parameters see the Zetafax software guide page 466 'Embedded addressing commands',
With an API license the following additional items may be poked:
| Item | Parameters | 
| From | sendername | 
| Coversheet | coversheet | 
| Letterhead | letterhead | 
| Quality | quality | 
| Priority | priority | 
| After | time | 
| Time | time | 
| Header | header | 
| Attach | files | 
| Charge | chargecode | 
For a full description of each command and its parameters see the API manual shipped as part of the API add-on.
Example
CODE LISTING 
Option Explicit
Sub Wait(PauseTime)
'This routine waits for PauseTime seconds.
      Dim Start
      
      Start = Timer    ' Set start time.
      Do While Timer < Start + PauseTime
              DoEvents      ' Yield to other processes.
      Loop 
      
End Sub
Sub Size()
'This routine waits for the spool file size to change
      Dim Spool_file_Size, Spoolfile
      Spoolfile = System.PrivateProfileString ("", "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Printers\Zetafax FaxMerge Printer", "port") ' Get Variable for the Spoolfile on any system 
      Spool_file_Size = FileLen (Spoolfile)      ' Returns file length (bytes). 
      Do While Spool_file_Size = 0 
              DoEvents 
              Spool_file_Size = FileLen (Spoolfile)      ' Returns file length (bytes). 
      Loop 
End Sub
Sub Send_Fax()
'
' Send _Fax Macro
'
' This macro sends the current active document as a fax. It uses
' DDE to communicate with the Zetafax client.
'
      Dim chan                                              'Channel for DDE link
      Dim oldActivePrinter                      'Store current active printer
      On Error GoTo Send_Fax_Error
      
      'Set up DDE control of Zetafax
      chan = DDEInitiate(App:="Zetafax", Topic:="Addressing")
      DDEExecute Channel:=chan, Command:="[DDEControl]"
      
      'Set Zetafax as the default printer
      oldActivePrinter = ActivePrinter
      ActivePrinter = "Zetafax Printer"
      
      'Print the document
      Application.PrintOut FileName:="", Range:=wdPrintAllDocument, Item:= _
      wdPrintDocumentContent, Copies:=1, Pages:="", PageType:=wdPrintAllPages, _
      Collate:=True, Background:=False, PrintToFile:=False
      
      Call Wait(10)            'waits for spool file to be created
      Call Size                    'waits for spool file to close
      
      'Set the addressing options
      DDEPoke Channel:=chan, Item:="TO", Data:="020 7123 4567, Sam Smith, Smith and Sons"
      
      'Submit the fax and release DDE control
      DDEExecute Channel:=chan, Command:="[Send][DDERelease]"
      
      'Tidy up
      DDETerminate Channel:=chan
      'Reset ActivePrinter
      ActivePrinter = oldActivePrinter
      
Send_Fax_Exit :
      Exit Sub
Send_Fax_Error :
      MsgBox "Error: (" & Err.Number & ") " & Err.Description
      Resume Send_Fax_Exit
End Sub
Microsoft Excel
In this example the addressing information will come from cells B1, B2 and B3 for the fax number, recipient and organisation respectively, but the printer spool path is hard coded.
Note that to run the macro you must have the Zetafax client program running.

The following code listing contains the function Send_Fax, which is called when the 'Send' button is depressed.
CODE LISTING
Option Explicit
Sub Wait(PauseTime)
'This routine waits for PauseTime seconds.
      Dim Start
      
      Start = Timer    ' Set start time.
      Do While Timer < Start + PauseTime
              DoEvents      ' Yield to other processes.
      Loop 
      
End Sub
Sub Size()
'This routine waits for the spool file size to change
      Dim Spool_file_Size, Spoolfile
      Spoolfile = "c:\temp\zetafax.spl" 'Set Spoolfile to the printer spool path
      Spool_file_Size = FileLen (Spoolfile)      ' Returns file length (bytes).
      Do While Spool_file_Size = 0
              DoEvents 
              Spool_file_Size = FileLen (Spoolfile)      ' Returns file length (bytes).
      Loop 
End Sub
Sub send_fax()
'
' Send _Fax Macro
'
' This macro sends the current worksheet as a fax. It uses
' DDE to communicate with the Zetafax client.
'
      Dim chan                                              'Channel for DDE link
      Dim oldActivePrinter                      'Store current active printer
      On Error GoTo Send_Fax_Error
      
      'Set up DDE control of Zetafax
      chan = DDEInitiate("Zetafax", "Addressing")
      DDEExecute chan, "[DDEControl]"
      'Save current default printer
      oldActivePrinter = Application.ActivePrinter
      
      'Print the worksheet to Zetafax Printer
      Application.Worksheets.PrintOut ActivePrinter:="Zetafax Printer"
      Call Wait(10)            'waits for spool file to be created
      Call Size                    'waits for spool file to close
      'Set the addressing options reading from the worksheet
      DDEPoke chan, "FAX", Me.Range ("B1")
      DDEPoke chan, "NAME", Me.Range ("B2")
      DDEPoke chan, "ORGANISATION", Me.Range ("B3")
      'Submit the fax and release DDE control
      DDEExecute chan, "[Send][DDERelease]"
      'Tidy up
      DDETerminate chan 
      
      'Reset ActivePrinter
      Application.ActivePrinter = oldActivePrinter
      
Send_Fax_Exit :
      Exit Sub
Send_Fax_Error :
      MsgBox "Error: (" & Err.Number & ") " & Err.Description
      Resume Send_Fax_Exit
End Sub
References
For additional information on automation of faxes, please see the following Zetafax technical notes:
ZTN1011-HOWTO Using Embedded addressing
ZTN1013-HOWTO Using ZSUBMIT
ZTN1066-HOWTO Using the Zetafax API functions
ZTN1068-HOWTO Using the Zetafax API from Visual Basic
Last updated 11th May 2011 (GC/SV/MW)