Introduction

Accessing the COM from a VC++ client. (I have tested it with VC++6.0 and VC++ .NET). Client uses the TypeLibrary (.TLB file).

For the sake of simplicity and ease of use for the developers, testing this code, I have used the Northwind database built into with the default installation of SQL Server database.

Modify the name of the SQL Server in the COM object to connect to your SQL Server.

Also, I have created a default user ID and password of scott / tiger to connect to the database. Either create this, or use an existing ID / password.

Part I: Creating a simple COM object in C#

COM objects are of the type ClassLibrary. The COM object generates a DLL file. To create a simple COM object from the VS Development Environment, select ....

New->Project->Visual C# Projects ->Class Library

Create a project named Database_COMObject.

Remember: Exposing the VC# objects to the COM world requires the following ...

The class must be public.

Properties, methods, and events must be public.

Properties and methods must be declared on the class interface.

Events must be declared in the event interface.

Other public members in the class that are not declared in these interfaces will not be visible to COM, but they will be visible to other .NET Framework objects. To expose properties and methods to COM, you must declare them on the class interface and mark them with a DispId attribute, and implement them in the class. The order the members are declared in the interface is the order used for the COM vtable. To expose events from your class, you must declare them on the events interface and mark them with a DispId attribute. The class should not implement this interface. The class implements the class interface (it can implement more than one interface, but the first implementation will be the default class interface). Implement the methods and properties exposed to COM here. They must be marked public and must match the declarations in the class interface. Also, declare the events raised by the class here. They must be marked public and must match the declarations in the events interface.

Every interface needs a GUID property set before the interface name. To generate the unique GUID, use the guidgen.exe utility and select the Registry Format.

The ClassInterfaceType.None indicates that no class interface is generated for the class. If no interfaces are implemented explicitly, the class will only provide late bound access through IDispatch. Users are expected to expose functionality through interfaces that are explicitly implemented by the class. This is the recommended setting for ClassInterfaceAttribute.

The ComSourceInterfaces(typeof(DBCOM_Events))] identifies a list of interfaces that are exposed as COM event sources for the attributed class. For our example, we do not have any events exposed.

Before you build the COM object, we have to register the object for COM Interop. To do this, right click the project name in the Solution Explorer. Click Properties. Click Configuration ->Build. Expand the output section. Set the Register for COM Interop to true.

In order for the COM object to be exposed, your class library assembly must also have a strong name. To create a strong name, use the utility SN.EXE.

sn -k Database_COM_Key.snk

Open the AssemblyInfo.cs and modify the line:

[assembly: AssemblyKeyFile("Database_COM_Key.snk")]

Build the object. The build also results into a type library that can be imported into your managed or unmanaged code.

Part II: Creating a Client using Visual C++ to access this COM Object

I have tested the COM object with the VC++ 6.0 and VC++ .NET environment. Create a simple project using the VC++ development environment. Import the type library using the #import directive. Create a Smart Pointer to the Interface.Execute, the exposed functions from the interface. Make sure to add the CoInitialize() call when the application loads.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.