This is an example of creating, invoking and instancing a COM component. The example outlines a simple data access class that allows navigation to the top, bottom, next and previous record. It should take you about 10 minutes to do this. All you have to do is copy-and-paste the program and the commands.
Step 1: Create a class definition with OLEPUBLIC
create project ComExamp
Copy-and-paste this class definition into 'Program1.PRG':
DEFINE CLASS cPerson AS Custom OLEPUBLIC
FirstName = SPACE(10)
LastName = SPACE(10)
cVersion = "1.2"
USE IN Person
This.FirstName = Person.FirstName
This.LastName = Person.LastName
FUNCTION FindInName( tcSubName )
LOCATE FOR UPPER ( tcSubName ) $ UPPER( FirstName + LastName )
RETURN ALLTRIM( This.FirstName - ( " " + This.LastName ) )
Step 2: Create a table and add some data
Copy-and-paste this code into new .PRG, and run it (Ctrl+E).
CREATE TABLE Person ( FirstName c(20), LastName c(20) )
INSERT INTO Person VALUES ( "George", "Harrison" )
INSERT INTO Person VALUES ( "John", "Lennon" )
INSERT INTO Person VALUES ( "Paul", "McCartney" )
INSERT INTO Person VALUES ( "Ringo", "Starr" )
Step 3: Build the project into a DLL
Compile the project into either a single-threaded or multi-threaded COM server DLL, filename: comdata.dll.
(paste this into the command window - make sure it runs - you have to hit enter, and the command has to still be in the command window.)
build dll comdata from ComExamp
Step 4: Register the DLL
In DOS (or from Windows, click on Start and then Run and then), do the following (you may have to provide the path to Regsvr32 and the DLL):
(you don't need to do this unless you are moving the dll to another machine. VFP registers it for you when you build it.)
Step 5: Invoke and use the COM component
* create the object
oPerson = CREATEOBJECT("comdata.cPerson")
* display the current person
* move to the next person and display
* release the object from memory
Tools, Macros, VB Editor
View, Code, Insert the code below,
Alt+Tab back to Excel, Tools, Macros, Macros, Run.
Public oPerson As Object
Set oPerson = CreateObject("comdata.cperson")
ActiveSheet.Cells(1, 1).Value = oPerson.FirstName
ActiveSheet.Cells(1, 2).Value = oPerson.LastName
ActiveSheet.Cells(2, 1).Value = oPerson.FirstName
ActiveSheet.Cells(2, 2).Value = oPerson.LastName
ActiveSheet.Cells(3, 1).Value = oPerson.FullName()
SET oPerson = Nothing
To make this go smoother, read and implement the error handler at Com Error Handling. It was left from here to keep it short.
Once you get this working, see DcomExample (coming soon as soon as I figure out what is needed, got it to work once, then couldn't get it to work again on another machine).
I refactored the code a little bit. There was nothing wrong with it for the purposes of this example, but when working with COM you should take extra care to avoid any possible error. I created a new function called OpenData which insures that the person table is open and then added code to call it in all of the necessary methods. I also added code to the Init method to place VFP in unattended mode to prevent any modal dialogs from coming up if VFP was started as an automation server. -- Mike Feltman
I am unfactoring it back to something simple. If you want to see all of Mike's work, look here: _ Com Component Example 11 -- CFK grrrr ;)
I think someone said it is better to use the Session object for COM stuff. :)
DEFINE CLASS cPerson AS Session OLEPUBLIC
See COM, Com Discussion Exam 70-155 Study Group Exam 70-155 Study Guide
Contributors: Carl Karsten Mike Feltman
Category Exam 70-155 Hot Topic, Category C _ O _ M Category Code Samples