There's a giant difference between the two. The list is too long to reproduce accurately in an SO post, I'll try to hit the highlights:
- A C++ DLL must export every function or class it wants to make available to the client code. A COM DLL only exports 4 functions with well-known names and behavior
- An application that uses a C++ DLL must describe that DLL's interface at link time, a COM server is bound at runtime
- An application that uses a C++ DLL must allow Windows to find the DLL at startup time, usually by having the DLL in the same directory as the EXE or on the Path. A COM DLL is found without the client app specifying where it is located. The registry is used at runtime to locate the DLL
- A COM server doesn't have to be a DLL. It can be anything, including a seperate process on the same machine or an executable located on another machine half-way around the world. The client code is oblivious to where it is located
Specific to the Automation subset of COM:
- A COM server is usable by any language that supports COM. Which in Windows is just about any of them.
https://stackoverflow.com/questions/12680981/com-vs-non-com-dll