It has proved difficult to retrieve the printer Driver, DeviceName and Port
combination selected using the MhPrintDlg%() function (without using the 'Def'
version to change the default printer and using GetProgileStringto load the Windows,Device line)

However, with the help of the DIALOG.ZIP file uploaded by
Costas Kitsos (73667,1755) we have derived the following: 

The DevNames data Structure contains the following items:

   wDriverOffset : Offset to start of DriverName e.g. 'Canon LPB-8 III'
   wDeviceOffset : Offset to start of DeviceName e.g. 'LBPIII'
   wOutputOffset : Offset to start of PortName e.g. 'LPT1'
        wDefault : 1 if default printer choosen, 0 otherwise.

All offsets are relative to the base of the DevNames structure.

Maximum Sizes:
        32 for device + nul
         8 for driver + nul
         4 for port + nul
Total = 47 extra bytes

Type DevNames
    wDriverOffset As Integer
    wDeviceOffset As Integer
    wOutputOffset As Integer
    wDefault As Integer
    cNames As String * 47
End Type

Dim N As DevNames
Dim P As MhPrintDlog

If P.hDevNames <> 0 Then
    Address = GlobalLock(P.hDevNames)  ' Lock handle and obtain address
    Call hmemcpy(N, ByVal Address, Len(N)) ' Copy to VB variable.
    Ok = GlobalUnlock(P.hDevNames) ' Unlock handle.
    ' The Memory used by the Devnames structure may be freed with
    '
    '    Ok = GlobalFree(P.hDevNames)
    '
    ' but if you call the the printer dialog again you need it 
    ' to keep the settings currently in use

    ' Correct the offsets to to the base of the cNames string
    N.wDeviceOffset = N.wDeviceOffset - 7
    N.wDriverOffset = N.wDriverOffset - 7
    N.wOutputOffset = N.wOutputOffset - 7
    
    lenDevice = N.wDriverOffset - N.wDeviceOffset - 1
    lenDriver = N.wOutputOffset - N.wDriverOffset - 1
    ' and retrieve the strings
    PrnDevice$ = Mid$(N.cNames, N.wDeviceOffset, lenDevice)
    PrnDriver$ = Mid$(N.cNames, N.wDriverOffset, lenDriver)
    PrnPort$ = Mid$(N.cNames, N.wOutputOffset, 4)
End If

The PrnDevice$,PrnDriver$ and PrnPort$ may then be used
with CreateDC to generate a Printer device context whenever
printing is required. (Without presenting the common dialog):

    In Global module:
	Declare Function CreateDC Lib "GDI" (ByVal lpDriverName As String, ByVal 
lpDeviceName As String, ByVal lpOutput As String,ByVal pInitData As String) As 
Integer
        Declare Function DeleteDC Lib "GDI" (ByVal hDC As Integer) As Integer

    Where printing required:

        hDC = CreateDC(PrnDevice$, PrnDriver$, PrnPort$, hDevMode)
        '
        ' StartDoc Escape
        '    For each page:
        '        API Printing calls...
        '        NewPage Escape 
        ' EndDoc Escape
        lOk = DeleteDC(hDC)