A Comparison of the ActiveX Programming Interface with the DLL Interface using DriverLINX
By Dave Sherman,
Keithley Instruments, Inc.
Introduction
DriverLINX is a set of 32-bit drivers for data acquisition hardware and can be used in development environments such as
Microsoft Visual Basic or Visual C++. The underlying concept of DriverLINX programming is that the user specifies a service
request and submits it to the DriverLINX Application Programming Interface (API). This service request has various properties
that specify the hardware to use, the type of operation to be performed, and whether it will be a foreground or background
(message-
based) operation. A foreground operation would involve making direct application requests, such as setting a digital
output line or reading an analog input. A background operation would involve an application that, once started, runs by itself
while the main application is doing something else. When the background application is complete, a Windows message (such
as "the buffer has filled" or "the task has completed") is posted to the application.
DLL API programming
When programming in C++, the DLL interface is recommended. This involves creating a service request in the form of a data
structure, the members of which reflect the parameters for the data acquisition task. The program first has to open an instance
of the DriverLINX driver for the particular hardware being used and the driver needs to have a handle to the window
requesting the task. A pointer to the service request structure then must be declared and memory is allocated using the C++
"new" operator. Once the necessary members of the structure are set, the pointer is passed as an argument to the DriverLINX
function, which executes the request. If messaging is to be used, the programmer has to create the appropriate "WindowProc"
function, and decode the message parameters to see if the message was posted by DriverLINX and then take the appropriate
action.
ActiveX API programming
Users of Microsoft Visual Basic or Borland Delphi are instructed to use the ActiveX interface for developing applications. This
is done by loading an ActiveX control into the application and setting the same parameters that would be set for the service
request in C++. Many of the details involved in using C++, such as declaring the service request, allocating memory for the
service request structure, initializing the members of the structure, and processing messages, are handled automatically in the
ActiveX control. A Visual Basic user need only set the properties of the service request, calling one of the methods built into
the control to execute the service request, then making use of the predefined message handling functions to process the
results of the service request. This greatly simplifies the steps involved in making a service request,and reduces the possibility
of errors, such as forgetting to de-allocate the memory used by the service request or neglecting to close the DriverLINX
driver properly.
Using the ActiveX API in Visual C++
Microsoft Visual C++ has the ability to use ActiveX controls when building an application using the Microsoft Foundation
Classes (MFC). When making an MFC application, the programmer enables the option of adding support for ActiveX controls.
This makes all of the registered ActiveX controls in Windows available, including the DriverLINX ActiveX controls. If the
programmer wants to use this control in his Visual C++ project, he adds the control as a component in his project. With this
done, the programmer sets the members of the service request by calling a function that sets that parameter, such as
SetReq_op(), which sets the requested operation. A nice feature of Visual C++ called Intellisense(r) provides a list of all the
functions in the ActiveX control, which appears as the code is written, allowing the user to see the correct coding of the
functions. The DLL interface, in contrast, requires the programmer to know exactly the name of the data structure member
being set; otherwise, the compiler will produce errors because it doesn't recognize the name of the member.
Compare OCX to DLL API of DriverLINX