Question about MS Comm Control

Hi all!!

I'm trying to write a class module with some functions to communicate with the device attached to the comm port.

I am aware that the MS Comm Control is able to do this with forms but is it possible to use the component using late binding?? i.e. create the instance of the component during runtime as my project does not contain any forms at all

Who is Participating?
Per recommendation, points refunded and question closed.

CS Moderator
I'm not sure of this, since I have never used the Comm control...but I would say, yes that is possible...

If I am mistaking please correct me folks...

i think its not possible. alternatively you can take a form with the Comm Control and without showing the form( simply by loading ) you can take the reference of the control on the form.

Ultimate Tool Kit for Technology Solution Provider

Broken down into practical pointers and step-by-step instructions, the IT Service Excellence Tool Kit delivers expert advice for technology solution providers. Get your free copy now.

It is a common VB practice to have a hidden form with several ActiveX controls that require a form.  This hidden form just acts as a repository for your form-based controls.  In VB.NET this is no longer a problem.  Of course VB.NET is only in Beta 2 right now.  I assume most companies won't be upgrading until a year from now or so.

If your control shows up in the component window, then it needs a form.  If instead, you just have a reference to the type library, and your control does not show up in the component window, then you don't need a form to host the control.
I agree that it is not necessary to drop the control on a form, but it can be very time-consuming/cumbersom.  The following example can be used to bring up the common dialog control. Use like 'msgbox fnGetPath("Title")'

I know it's not the control you want, but the amount of code to do it without a form may make you think twice about this

'---------start of code
Private Const ALLFILES = "All Files"

' Declarations for Windows Common Dialogs procedures
  strFilter As String             ' Filter string
  intFilterIndex As Long          ' Initial Filter to display.
  strInitialDir As String         ' Initial directory for the dialog to open in.
  strInitialFile As String        ' Initial file name to populate the dialog with.
  strDialogTitle As String        ' Dialog title
  strDefaultExtension As String   ' Default extension to append to file if user didn't specify one.
  lngFlags As Long                ' Flags (see constant list) to be used.
  strFullPathReturned As String   ' Full path of file picked.
  strFileNameReturned As String   ' File name of file picked.
  intFileOffset As Integer        ' Offset in full path (strFullPathReturned) where the file name (strFileNameReturned) begins.
  intFileExtension As Integer     ' Offset in full path (strFullPathReturned) where the file extension begins.
End Type

    lStructSize As Long
    hWndOwner As Long
    hInstance As Long
    lpstrFilter As String
    lpstrCustomFilter As String
    nMaxCustrFilter As Long
    nFilterIndex As Long
    lpstrFile As String
    nMaxFile As Long
    lpstrFileTitle As String
    nMaxFileTitle As Long
    lpstrInitialDir As String
    lpstrTitle As String
    Flags As Long
    nFileOffset As Integer
    nFileExtension As Integer
    lpstrDefExt As String
    lCustrData As Long
    lpfnHook As Long
    lpTemplateName As String
End Type

Declare Function API_GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" _
  (pOpenfilename As API_WINOPENFILENAME) _
As Boolean

Public Function fnGetPath(strTitle As String) As String
  ' Comments  : Simple file open routine. For additional options, use GetFileOpenEX()
  ' Parameters: strInitialDir - path for the initial directory, or blank for the current directory
  '             strTitle - title for the dialog
  ' Returns   : string path, name and extension of the file selected
  Dim fOK As Boolean
  Dim typOpenFile As API_OPENFILE
  Dim strFilter As String
  Dim strInitialDir As String

  On Error GoTo PROC_ERR
  strInitialDir = CurDir
  ' Set reasonable defaults for the structure
  strFilter = CreateFilterString("Word Files (*.doc)", "*.doc", "Text Files (*.txt)", "*.txt", "Excel Files (*.xls)", "*.xls")
  If strInitialDir <> "" Then
    typOpenFile.strInitialDir = strInitialDir
    typOpenFile.strInitialDir = CurDir()
  End If
  If strTitle <> "" Then
    typOpenFile.strDialogTitle = strTitle
  End If
  typOpenFile.strFilter = strFilter
  typOpenFile.lngFlags = &H1000 Or &H1
  ' Convert the  structure to a Win structure
  Convert2Win typOpenFile, typWinOpen
  ' Call the Common dialog
  fOK = API_GetSaveFileName(typWinOpen)
  ' Convert the Win structure back to a  structure
  ConvertWin2 typWinOpen, typOpenFile
  fnGetPath = typOpenFile.strFullPathReturned
  Exit Function
  fnGetPath = ""
  Resume PROC_EXIT

End Function

Private Function CreateFilterString(ParamArray varFilt() As Variant) As String
  ' Comments  : Builds a Windows formatted filter string for "file type"
  ' Parameters: varFilter - parameter array in the format:
  '                          Text, Filter, Text, Filter ...
  '                         Such as:
  '                          "All Files (*.*)", "*.*", "Text Files (*.TXT)", "*.TXT"
  ' Returns   : windows formatted filter string
  Dim strFilter As String
  Dim intCounter As Integer
  Dim intParamCount As Integer

  On Error GoTo PROC_ERR
  ' Get the count of paramaters passed to the function
  intParamCount = UBound(varFilt)
  If (intParamCount <> -1) Then
    ' Count through each parameter
    For intCounter = 0 To intParamCount
      strFilter = strFilter & varFilt(intCounter) & Chr$(0)
    ' Check for an even number of parameters
    If (intParamCount Mod 2) = 0 Then
      strFilter = strFilter & "*.*" & Chr$(0)
    End If
  End If

  CreateFilterString = strFilter
  Exit Function
  CreateFilterString = ""
  Resume PROC_EXIT
End Function

Private Sub Convert2Win(Struct As API_OPENFILE, Win_Struct As API_WINOPENFILENAME)
  ' Comments  : Converts the passed API structure to a Windows structure
  ' Parameters: Struct - record of type API_OPENFILE
  '             Win_Struct - record of type API_WINOPENFILENAME
  ' Returns   : Nothing
  Dim strFile As String * 512

  On Error GoTo PROC_ERR
  Win_Struct.hWndOwner = Application.hWndAccessApp
  Win_Struct.hInstance = 0

  If Struct.strFilter = "" Then
    Win_Struct.lpstrFilter = ALLFILES & Chr$(0) & "*.*" & Chr$(0)
    Win_Struct.lpstrFilter = Struct.strFilter
  End If
  Win_Struct.nFilterIndex = Struct.intFilterIndex

  If Struct.strInitialFile <> "" Then
    Win_Struct.lpstrFile = Struct.strInitialFile & String$(512 - Len(Struct.strInitialFile), 0)
    Win_Struct.lpstrFile = String(512, 0)
  End If
  Win_Struct.nMaxFile = 511
  Win_Struct.lpstrFileTitle = String$(512, 0)
  Win_Struct.nMaxFileTitle = 511

  Win_Struct.lpstrTitle = Struct.strDialogTitle
  Win_Struct.lpstrInitialDir = Struct.strInitialDir
  Win_Struct.lpstrDefExt = Struct.strDefaultExtension

  Win_Struct.Flags = Struct.lngFlags

  Win_Struct.lStructSize = Len(Win_Struct)
  Exit Sub
  Resume PROC_EXIT
End Sub

Private Sub ConvertWin2(Win_Struct As API_WINOPENFILENAME, Struct As API_OPENFILE)
  ' Comments  : Converts the passed API structure to a Windows structure
  ' Parameters: Win_Struct - record of type API_WINOPENFILENAME
  '             Struct - record of type API_OPENFILE
  ' Returns   : Nothing
  On Error GoTo PROC_ERR
  Struct.strFullPathReturned = Left(Win_Struct.lpstrFile, InStr(Win_Struct.lpstrFile, vbNullChar) - 1)
  Struct.strFileNameReturned = RemoveNulls(Win_Struct.lpstrFileTitle)
  Struct.intFileOffset = Win_Struct.nFileOffset
  Struct.intFileExtension = Win_Struct.nFileExtension
  Exit Sub
  Resume PROC_EXIT
End Sub

Private Function RemoveNulls(strIn As String) As String
  ' Comments  : Removes terminator from a string
  ' Parameters: strIn - string to modify
  ' Return    : modified string
  Dim intChr As Integer

  intChr = InStr(strIn, Chr$(0))

  If intChr > 0 Then
    RemoveNulls = Left$(strIn, intChr - 1)
    RemoveNulls = strIn
  End If

End Function
'---------end of code
The MSComm control is an ocx and as such requires a container form in order to operate.
Add your MSComm Control to a dummy form and make the forms visible property to false. You can then access all the functionality of the control.

The code above will work only with the common control as it also exposes it's methods through a dll comdlg32.dll

The MSComm control doesn't.

If you want to do this type of thing without the MSComm control. You will have to use other API calls to do it.
boonhui78Author Commented:
Hi everyone!

Guess I've found a way to do it already =)

All I did was to include the component (MS Comm Control 6.0) in my class module and then under the Class Initialize procedure I just need to put in the code below...
Set objComm = CreateObject("MSCommLib.MSComm")

Many thanks,
Hmm, yes well, that's late-binding and not early-binding, but if it works for you...
Can you let us know if your late binding technique worked.

boonhui78Author Commented:
Hi Vincent!

It works =)

How are you handling the OnComm event for the MSComm Control ?


boonhui78Author Commented:
Hi Vincent,

I don't need the OnComm event as my program does it's on polling on the input buffer

boonhui78, an EE Moderator will handle this for you.
Moderator, my recommended disposition is:

    Refund points and save as a 0-pt PAQ.
    *** I think five separate 'experts' said it was impossible.  lol

DanRollins -- EE database cleanup volunteer
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.