Rename VBX control from MSComm to KPComCtl

Files: mscomm.{c,h,def,rc,bmp} -> kpcomctl.{c,h,def,rc,bmp}
Output: mscomm.vbx -> kpcomctl.vbx
Types: MsCommDataT -> KpComCtlDataT, MsCommCtlProc -> KpComCtlProc
LIBRARY name: MSCOMM -> KPCOMCTL
VB control name: MSComm -> KPComCtl

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Scott Duensing 2026-02-24 20:16:02 -06:00
parent 4218da32eb
commit bf5268ade8
7 changed files with 74 additions and 77 deletions

View file

@ -1,4 +1,4 @@
// mscomm.c - MSComm VBX control implementation
// kpcomctl.c - KPComCtl VBX control implementation
//
// Provides high-speed serial communications for 16-bit Visual Basic 4.
// Implements MODEL, control procedure, property/event handling, and
@ -13,7 +13,7 @@
#include <string.h>
#include "vbapi.h"
#include "serial.h"
#include "mscomm.h"
#include "kpcomctl.h"
// -----------------------------------------------------------------------
// Global data
@ -23,23 +23,23 @@ HANDLE ghInstance = NULL;
// -----------------------------------------------------------------------
// Convenience macro for re-dereferencing control data after VB API calls
// -----------------------------------------------------------------------
#define DEREF(hctl) ((MsCommDataT FAR *)VBDerefControl(hctl))
#define DEREF(hctl) ((KpComCtlDataT FAR *)VBDerefControl(hctl))
// -----------------------------------------------------------------------
// Forward declarations - Control procedure
// -----------------------------------------------------------------------
LONG FAR PASCAL _export MsCommCtlProc(HCTL hctl, HWND hwnd, USHORT msg, USHORT wp, LONG lp);
LONG FAR PASCAL _export KpComCtlProc(HCTL hctl, HWND hwnd, USHORT msg, USHORT wp, LONG lp);
LRESULT FAR PASCAL _export NotifyWndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
// -----------------------------------------------------------------------
// Forward declarations - Internal functions (alphabetical)
// -----------------------------------------------------------------------
static void closePort(HCTL hctl, MsCommDataT FAR *pData);
static void fireOnComm(HCTL hctl, MsCommDataT FAR *pData, int16_t eventCode);
static LONG handleGetProperty(HCTL hctl, MsCommDataT FAR *pData, USHORT iProp);
static LONG handleSetProperty(HCTL hctl, MsCommDataT FAR *pData, USHORT iProp, LONG lp);
static void closePort(HCTL hctl, KpComCtlDataT FAR *pData);
static void fireOnComm(HCTL hctl, KpComCtlDataT FAR *pData, int16_t eventCode);
static LONG handleGetProperty(HCTL hctl, KpComCtlDataT FAR *pData, USHORT iProp);
static LONG handleSetProperty(HCTL hctl, KpComCtlDataT FAR *pData, USHORT iProp, LONG lp);
static void initControlData(HCTL hctl);
static int16_t openPort(HCTL hctl, MsCommDataT FAR *pData);
static int16_t openPort(HCTL hctl, KpComCtlDataT FAR *pData);
static void processEventNotify(HCTL hctl, int16_t commId);
static void processReceiveNotify(HCTL hctl, int16_t commId);
static void processTransmitNotify(HCTL hctl, int16_t commId);
@ -63,29 +63,29 @@ static char szInputMode[] = "Text\0Binary";
// Property descriptors
// -----------------------------------------------------------------------
// offset default enum list enumMax
static PROPINFO propCommPort = { "CommPort", PF_fSetMsg | PF_fGetData | DT_SHORT, OFFSETIN(MsCommDataT, commPort), 0, 1L, NULL, 0 };
static PROPINFO propCommPort = { "CommPort", PF_fSetMsg | PF_fGetData | DT_SHORT, OFFSETIN(KpComCtlDataT, commPort), 0, 1L, NULL, 0 };
static PROPINFO propSettings = { "Settings", PF_fSetMsg | PF_fGetMsg | DT_HSZ, 0, 0, 0L, NULL, 0 };
static PROPINFO propPortOpen = { "PortOpen", PF_fSetMsg | PF_fGetData | DT_BOOL, OFFSETIN(MsCommDataT, portOpen), 0, 0L, NULL, 0 };
static PROPINFO propPortOpen = { "PortOpen", PF_fSetMsg | PF_fGetData | DT_BOOL, OFFSETIN(KpComCtlDataT, portOpen), 0, 0L, NULL, 0 };
static PROPINFO propInput = { "Input", PF_fGetMsg | PF_fNoShow | DT_HSZ, 0, 0, 0L, NULL, 0 };
static PROPINFO propOutput = { "Output", PF_fSetMsg | PF_fNoShow | DT_HSZ, 0, 0, 0L, NULL, 0 };
static PROPINFO propInBufferSize = { "InBufferSize", PF_fSetMsg | PF_fGetData | DT_SHORT, OFFSETIN(MsCommDataT, inBufferSize), 0, 4096L, NULL, 0 };
static PROPINFO propOutBufferSize = { "OutBufferSize", PF_fSetMsg | PF_fGetData | DT_SHORT, OFFSETIN(MsCommDataT, outBufferSize), 0, 4096L, NULL, 0 };
static PROPINFO propInBufferSize = { "InBufferSize", PF_fSetMsg | PF_fGetData | DT_SHORT, OFFSETIN(KpComCtlDataT, inBufferSize), 0, 4096L, NULL, 0 };
static PROPINFO propOutBufferSize = { "OutBufferSize", PF_fSetMsg | PF_fGetData | DT_SHORT, OFFSETIN(KpComCtlDataT, outBufferSize), 0, 4096L, NULL, 0 };
static PROPINFO propInBufferCount = { "InBufferCount", PF_fGetMsg | PF_fNoShow | DT_SHORT, 0, 0, 0L, NULL, 0 };
static PROPINFO propOutBufferCount= { "OutBufferCount",PF_fGetMsg | PF_fNoShow | DT_SHORT, 0, 0, 0L, NULL, 0 };
static PROPINFO propRThreshold = { "RThreshold", PF_fSetData| PF_fGetData | DT_SHORT, OFFSETIN(MsCommDataT, rThreshold), 0, 0L, NULL, 0 };
static PROPINFO propSThreshold = { "SThreshold", PF_fSetData| PF_fGetData | DT_SHORT, OFFSETIN(MsCommDataT, sThreshold), 0, 0L, NULL, 0 };
static PROPINFO propHandshaking = { "Handshaking", PF_fSetMsg | PF_fGetData | DT_ENUM, OFFSETIN(MsCommDataT, handshaking), 0, 0L, szHandshaking, 3 };
static PROPINFO propInputLen = { "InputLen", PF_fSetData| PF_fGetData | DT_SHORT, OFFSETIN(MsCommDataT, inputLen), 0, 0L, NULL, 0 };
static PROPINFO propInputMode = { "InputMode", PF_fSetData| PF_fGetData | DT_ENUM, OFFSETIN(MsCommDataT, inputMode), 0, 0L, szInputMode, 1 };
static PROPINFO propDTREnable = { "DTREnable", PF_fSetMsg | PF_fGetData | DT_BOOL, OFFSETIN(MsCommDataT, dtrEnable), 0, 1L, NULL, 0 };
static PROPINFO propRTSEnable = { "RTSEnable", PF_fSetMsg | PF_fGetData | DT_BOOL, OFFSETIN(MsCommDataT, rtsEnable), 0, 1L, NULL, 0 };
static PROPINFO propRThreshold = { "RThreshold", PF_fSetData| PF_fGetData | DT_SHORT, OFFSETIN(KpComCtlDataT, rThreshold), 0, 0L, NULL, 0 };
static PROPINFO propSThreshold = { "SThreshold", PF_fSetData| PF_fGetData | DT_SHORT, OFFSETIN(KpComCtlDataT, sThreshold), 0, 0L, NULL, 0 };
static PROPINFO propHandshaking = { "Handshaking", PF_fSetMsg | PF_fGetData | DT_ENUM, OFFSETIN(KpComCtlDataT, handshaking), 0, 0L, szHandshaking, 3 };
static PROPINFO propInputLen = { "InputLen", PF_fSetData| PF_fGetData | DT_SHORT, OFFSETIN(KpComCtlDataT, inputLen), 0, 0L, NULL, 0 };
static PROPINFO propInputMode = { "InputMode", PF_fSetData| PF_fGetData | DT_ENUM, OFFSETIN(KpComCtlDataT, inputMode), 0, 0L, szInputMode, 1 };
static PROPINFO propDTREnable = { "DTREnable", PF_fSetMsg | PF_fGetData | DT_BOOL, OFFSETIN(KpComCtlDataT, dtrEnable), 0, 1L, NULL, 0 };
static PROPINFO propRTSEnable = { "RTSEnable", PF_fSetMsg | PF_fGetData | DT_BOOL, OFFSETIN(KpComCtlDataT, rtsEnable), 0, 1L, NULL, 0 };
static PROPINFO propCDHolding = { "CDHolding", PF_fGetMsg | PF_fNoShow | DT_BOOL, 0, 0, 0L, NULL, 0 };
static PROPINFO propCTSHolding = { "CTSHolding", PF_fGetMsg | PF_fNoShow | DT_BOOL, 0, 0, 0L, NULL, 0 };
static PROPINFO propDSRHolding = { "DSRHolding", PF_fGetMsg | PF_fNoShow | DT_BOOL, 0, 0, 0L, NULL, 0 };
static PROPINFO propBreak = { "Break", PF_fSetMsg | PF_fGetData | DT_BOOL, OFFSETIN(MsCommDataT, breakState), 0, 0L, NULL, 0 };
static PROPINFO propCommEvent = { "CommEvent", PF_fGetData| PF_fNoShow | DT_SHORT, OFFSETIN(MsCommDataT, commEvent), 0, 0L, NULL, 0 };
static PROPINFO propNullDiscard = { "NullDiscard", PF_fSetMsg | PF_fGetData | DT_BOOL, OFFSETIN(MsCommDataT, nullDiscard), 0, 0L, NULL, 0 };
static PROPINFO propEOFEnable = { "EOFEnable", PF_fSetData| PF_fGetData | DT_BOOL, OFFSETIN(MsCommDataT, eofEnable), 0, 0L, NULL, 0 };
static PROPINFO propBreak = { "Break", PF_fSetMsg | PF_fGetData | DT_BOOL, OFFSETIN(KpComCtlDataT, breakState), 0, 0L, NULL, 0 };
static PROPINFO propCommEvent = { "CommEvent", PF_fGetData| PF_fNoShow | DT_SHORT, OFFSETIN(KpComCtlDataT, commEvent), 0, 0L, NULL, 0 };
static PROPINFO propNullDiscard = { "NullDiscard", PF_fSetMsg | PF_fGetData | DT_BOOL, OFFSETIN(KpComCtlDataT, nullDiscard), 0, 0L, NULL, 0 };
static PROPINFO propEOFEnable = { "EOFEnable", PF_fSetData| PF_fGetData | DT_BOOL, OFFSETIN(KpComCtlDataT, eofEnable), 0, 0L, NULL, 0 };
static PROPINFO propParityReplace = { "ParityReplace", PF_fSetMsg | PF_fGetMsg | DT_HSZ, 0, 0, 0L, NULL, 0 };
// -----------------------------------------------------------------------
@ -138,16 +138,16 @@ static PEVENTINFO eventList[] = {
// -----------------------------------------------------------------------
// MODEL definition
// -----------------------------------------------------------------------
static char szCtlName[] = "MSComm";
static char szCtlName[] = "KPComCtl";
MODEL modelMsComm = {
MODEL modelKpComCtl = {
VB300_VERSION, // usVersion
MODEL_fInitMsg | MODEL_fInvisAtRun,// fl
(PCTLPROC)MsCommCtlProc, // pctlproc
(PCTLPROC)KpComCtlProc, // pctlproc
0, // fsClassStyle
WS_CHILD, // flWndStyle
sizeof(MsCommDataT), // cbCtlExtra
IDB_MSCOMM, // idBmpPalette
sizeof(KpComCtlDataT), // cbCtlExtra
IDB_KPCOMCTL, // idBmpPalette
szCtlName, // npszDefCtlName
NULL, // npszClassName
NULL, // npszParentClassName
@ -169,7 +169,7 @@ MODEL modelMsComm = {
//
// No VB API calls here, so pData remains valid throughout.
// -----------------------------------------------------------------------
static void closePort(HCTL hctl, MsCommDataT FAR *pData)
static void closePort(HCTL hctl, KpComCtlDataT FAR *pData)
{
if (pData->commId >= 0) {
if (pData->breakState) {
@ -199,7 +199,7 @@ static void closePort(HCTL hctl, MsCommDataT FAR *pData)
// WARNING: After this function returns, any previously obtained pData
// pointer is INVALID. Callers must re-deref via DEREF(hctl).
// -----------------------------------------------------------------------
static void fireOnComm(HCTL hctl, MsCommDataT FAR *pData, int16_t eventCode)
static void fireOnComm(HCTL hctl, KpComCtlDataT FAR *pData, int16_t eventCode)
{
pData->commEvent = eventCode;
VBFireEvent(hctl, IEVENT_ONCOMM, NULL);
@ -210,7 +210,7 @@ static void fireOnComm(HCTL hctl, MsCommDataT FAR *pData, int16_t eventCode)
// -----------------------------------------------------------------------
// handleGetProperty - Process VBM_GETPROPERTY for message-based props
// -----------------------------------------------------------------------
static LONG handleGetProperty(HCTL hctl, MsCommDataT FAR *pData, USHORT iProp)
static LONG handleGetProperty(HCTL hctl, KpComCtlDataT FAR *pData, USHORT iProp)
{
switch (iProp) {
case IPROP_SETTINGS:
@ -308,7 +308,7 @@ static LONG handleGetProperty(HCTL hctl, MsCommDataT FAR *pData, USHORT iProp)
// -----------------------------------------------------------------------
// handleSetProperty - Process VBM_SETPROPERTY for message-based props
// -----------------------------------------------------------------------
static LONG handleSetProperty(HCTL hctl, MsCommDataT FAR *pData, USHORT iProp, LONG lp)
static LONG handleSetProperty(HCTL hctl, KpComCtlDataT FAR *pData, USHORT iProp, LONG lp)
{
int16_t val;
@ -511,7 +511,7 @@ static LONG handleSetProperty(HCTL hctl, MsCommDataT FAR *pData, USHORT iProp, L
// -----------------------------------------------------------------------
static void initControlData(HCTL hctl)
{
MsCommDataT FAR *pData;
KpComCtlDataT FAR *pData;
HSZ hsz;
pData = DEREF(hctl);
@ -553,7 +553,7 @@ static void initControlData(HCTL hctl)
// Saves all needed control data to locals before VB API calls to avoid
// stale pointer issues. Re-derefs when writing results back.
// -----------------------------------------------------------------------
static int16_t openPort(HCTL hctl, MsCommDataT FAR *pData)
static int16_t openPort(HCTL hctl, KpComCtlDataT FAR *pData)
{
int16_t commId;
int16_t port;
@ -653,7 +653,7 @@ static int16_t openPort(HCTL hctl, MsCommDataT FAR *pData)
// -----------------------------------------------------------------------
static void processEventNotify(HCTL hctl, int16_t commId)
{
MsCommDataT FAR *pData;
KpComCtlDataT FAR *pData;
UINT evtMask;
evtMask = serialGetEventMask(commId, EV_CTS | EV_DSR | EV_RLSD | EV_RING | EV_ERR | EV_BREAK);
@ -721,7 +721,7 @@ static void processEventNotify(HCTL hctl, int16_t commId)
// -----------------------------------------------------------------------
static void processReceiveNotify(HCTL hctl, int16_t commId)
{
MsCommDataT FAR *pData;
KpComCtlDataT FAR *pData;
COMSTAT stat;
pData = DEREF(hctl);
@ -744,7 +744,7 @@ static void processReceiveNotify(HCTL hctl, int16_t commId)
// -----------------------------------------------------------------------
static void processTransmitNotify(HCTL hctl, int16_t commId)
{
MsCommDataT FAR *pData;
KpComCtlDataT FAR *pData;
COMSTAT stat;
pData = DEREF(hctl);
@ -796,7 +796,7 @@ LRESULT FAR PASCAL _export NotifyWndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM
{
if (msg == WM_COMMNOTIFY) {
HCTL hctl;
MsCommDataT FAR *pData;
KpComCtlDataT FAR *pData;
int16_t commId;
UINT notifyCode;
@ -836,9 +836,9 @@ LRESULT FAR PASCAL _export NotifyWndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM
// VBX Control procedure
// =======================================================================
LONG FAR PASCAL _export MsCommCtlProc(HCTL hctl, HWND hwnd, USHORT msg, USHORT wp, LONG lp)
LONG FAR PASCAL _export KpComCtlProc(HCTL hctl, HWND hwnd, USHORT msg, USHORT wp, LONG lp)
{
MsCommDataT FAR *pData;
KpComCtlDataT FAR *pData;
switch (msg) {
case VBM_INITIALIZE:
@ -913,7 +913,7 @@ BOOL FAR PASCAL _export VBINITCC(USHORT usVersion, BOOL fRuntime)
return FALSE;
}
return VBRegisterModel(ghInstance, &modelMsComm);
return VBRegisterModel(ghInstance, &modelKpComCtl);
}

View file

@ -1,7 +1,7 @@
; mscomm.def - Module definition for MSComm VBX control
; kpcomctl.def - Module definition for KPComCtl VBX control
LIBRARY MSCOMM
DESCRIPTION 'MSComm Serial Communications Control for VB4'
LIBRARY KPCOMCTL
DESCRIPTION 'KPComCtl Serial Communications Control for VB4'
EXETYPE WINDOWS
CODE PRELOAD MOVEABLE DISCARDABLE

View file

@ -1,14 +1,14 @@
// mscomm.h - MSComm VBX control definitions
// kpcomctl.h - KPComCtl VBX control definitions
//
// Property/event IDs, comm event constants, and control instance data.
#ifndef MSCOMM_H
#define MSCOMM_H
#ifndef KPCOMCTL_H
#define KPCOMCTL_H
// -----------------------------------------------------------------------
// Resource IDs
// -----------------------------------------------------------------------
#define IDB_MSCOMM 8000
#define IDB_KPCOMCTL 8000
#ifndef RC_INVOKED
@ -128,12 +128,12 @@ typedef struct {
BOOL dsrState; // Shadow state: DSR line level
BOOL cdState; // Shadow state: CD (RLSD) line level
HSZ hszParityReplace; // Parity error replacement character
} MsCommDataT;
} KpComCtlDataT;
// -----------------------------------------------------------------------
// Hidden notification window class name
// -----------------------------------------------------------------------
#define NOTIFY_CLASS "MsCommNotify"
#define NOTIFY_CLASS "KpComCtlNotify"
// -----------------------------------------------------------------------
// Global instance handle (set in LibMain)
@ -142,4 +142,4 @@ extern HANDLE ghInstance;
#endif // RC_INVOKED
#endif // MSCOMM_H
#endif // KPCOMCTL_H

7
vbx/kpcomctl.rc Normal file
View file

@ -0,0 +1,7 @@
// kpcomctl.rc - KPComCtl VBX resource script
//
// Defines the toolbox bitmap displayed in the VB IDE custom controls palette.
#include "kpcomctl.h"
IDB_KPCOMCTL BITMAP kpcomctl.bmp

View file

@ -1,4 +1,4 @@
# makefile - MSComm VBX control for MSVC 1.52
# makefile - KPComCtl VBX control for MSVC 1.52
#
# Build: nmake
# Clean: nmake clean
@ -11,17 +11,14 @@
# The stock Windows 3.1 COMM.DRV enables the 16550 FIFO for receive only,
# with a trigger level of 14 (leaving only 2 bytes of headroom). This causes
# overruns at baud rates above 9600 under load. For reliable operation at
# 57600 or 115200, install CyberCom V1.1.0.0P -- a freeware drop-in
# replacement included in ..\drivers\CYBERCOM.DRV. It enables both RX and TX
# FIFOs with a trigger level of 8, dramatically reducing interrupt overhead.
# 57600 or 115200, install KPCOMM.DRV (built from ..\drv\) or CyberCom
# V1.1.0.0P (..\drivers\CYBERCOM.DRV).
#
# Install:
# 1. Copy ..\drivers\CYBERCOM.DRV to \WINDOWS\SYSTEM
# 2. Edit SYSTEM.INI [boot] section: comm.drv=cybercom.drv
# Install (KPCOMM):
# 1. Copy ..\drv\KPCOMM.DRV to \WINDOWS\SYSTEM
# 2. Edit SYSTEM.INI [boot] section: comm.drv=kpcomm.drv
# 3. Add to [386Enh] section: COM1FIFO=1 (for each port in use)
# 4. Restart Windows
#
# CyberCom is free for non-commercial use. (C) CyberSoft Corp 1993
CC = cl
LINK = link
@ -51,28 +48,28 @@ LFLAGS = /NOD /NOE /AL:16
LIBS = sdllcew libw commdlg vbapi
# Output
TARGET = mscomm.vbx
TARGET = kpcomctl.vbx
# Objects
OBJS = mscomm.obj serial.obj
OBJS = kpcomctl.obj serial.obj
# -----------------------------------------------------------------------
# Build rules
# -----------------------------------------------------------------------
all: $(TARGET)
$(TARGET): $(OBJS) mscomm.def mscomm.res vbapi.lib
$(LINK) $(LFLAGS) $(OBJS), $(TARGET),,$(LIBS), mscomm.def
$(RC) mscomm.res $(TARGET)
$(TARGET): $(OBJS) kpcomctl.def kpcomctl.res vbapi.lib
$(LINK) $(LFLAGS) $(OBJS), $(TARGET),,$(LIBS), kpcomctl.def
$(RC) kpcomctl.res $(TARGET)
mscomm.obj: mscomm.c mscomm.h vbapi.h serial.h
$(CC) $(CFLAGS) mscomm.c
kpcomctl.obj: kpcomctl.c kpcomctl.h vbapi.h serial.h
$(CC) $(CFLAGS) kpcomctl.c
serial.obj: serial.c serial.h
$(CC) $(CFLAGS) serial.c
mscomm.res: mscomm.rc mscomm.h mscomm.bmp
$(RC) -r mscomm.rc
kpcomctl.res: kpcomctl.rc kpcomctl.h kpcomctl.bmp
$(RC) -r kpcomctl.rc
# -----------------------------------------------------------------------
# Generate VBAPI.LIB from vbapi.def if not present

View file

@ -1,7 +0,0 @@
// mscomm.rc - MSComm VBX resource script
//
// Defines the toolbox bitmap displayed in the VB IDE custom controls palette.
#include "mscomm.h"
IDB_MSCOMM BITMAP mscomm.bmp