Question about MS Comm Control

Posted on 2001-08-21
Last Modified: 2012-06-21
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

Question by:boonhui78
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 3
  • 2
  • +5
LVL 19

Expert Comment

ID: 6409168
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...

LVL 39

Expert Comment

ID: 6409231
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.


Expert Comment

ID: 6409423
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.
PeopleSoft Has Never Been Easier

PeopleSoft Adoption Made Smooth & Simple!

On-The-Job Training Is made Intuitive & Easy With WalkMe's On-Screen Guidance Tool.  Claim Your Free WalkMe Account Now


Expert Comment

ID: 6409889
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

Expert Comment

ID: 6410310
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.

Author Comment

ID: 6411825
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,

Expert Comment

ID: 6413246
Hmm, yes well, that's late-binding and not early-binding, but if it works for you...

Expert Comment

ID: 6413259
Can you let us know if your late binding technique worked.


Author Comment

ID: 6416028
Hi Vincent!

It works =)


Expert Comment

ID: 6416824
How are you handling the OnComm event for the MSComm Control ?



Author Comment

ID: 6421239
Hi Vincent,

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

LVL 49

Expert Comment

ID: 7202414
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

Accepted Solution

Netminder earned 0 total points
ID: 7216012
Per recommendation, points refunded and question closed.

CS Moderator

Featured Post

On Demand Webinar - Networking for the Cloud Era

This webinar discusses:
-Common barriers companies experience when moving to the cloud
-How SD-WAN changes the way we look at networks
-Best practices customers should employ moving forward with cloud migration
-What happens behind the scenes of SteelConnect’s one-click button

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The debugging module of the VB 6 IDE can be accessed by way of the Debug menu item. That menu item can normally be found in the IDE's main menu line as shown in this picture.   There is also a companion Debug Toolbar that looks like the followin…
If you have ever used Microsoft Word then you know that it has a good spell checker and it may have occurred to you that the ability to check spelling might be a nice piece of functionality to add to certain applications of yours. Well the code that…
Get people started with the process of using Access VBA to control Outlook using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Microsoft Outlook. Using automation, an Access applic…
Get people started with the process of using Access VBA to control Excel using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Excel. Using automation, an Access application can laun…
Suggested Courses
Course of the Month9 days, 18 hours left to enroll

624 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question