Common ActiveX/COM/DCOM/ATL Interview Questions
You could mention the following:
It is a generally good idea to have an answer for this question if you claim you
know COM in your resume. Otherwise, you may consider your interview failed at
this point. IUnknown is the base interface of COM. All other interfaces must
derive directly or indirectly from IUnknown. There are three methods in that
interface: AddRef, Release and QueryInterface.
AddRef increments reference count of the object, Release decrements reference
counter of the object and QueryInterface obtains a pointer to the requested
interface.
Return E_NOINTERFACE and nullify its out parameter.
Well, it all depends on your project. Start your answer from CoCreateInstance or
CoCreateInstanceEx, explain the difference between them. If interviewer is still
not satisfied, you'll have to explain the whole kitchen behind the scenes,
including a difference between local server and inproc server, meaning and
mechanism of class factory, etc. You may also mention other methods of object
creation like CoGetInstanceFromFile, but discussion will likely turn to
discussion of monikers then.
Again, all depends on the level of detail and expertise of interviewer. Start
with simple explanation of class object and class factory mechanism. Further
details would depend on a specific situation.
Well, the major problems with CoCreateInstance is that it is only able to create
a one object and only on local system. To create a remote object or to get
several objects, based on single CLSID, at the same time, one should use
CoCreateInstanceEx.
Aggregation is the reuse mechanism, in which the outer object exposes interfaces
from the inner object as if they were implemented on the outer object itself.
This is useful when the outer object would always delegate every call to one of
its interfaces to the same interface in the inner object. Aggregation is
actually a specialized case of containment/delegation, and is available as a
convenience to avoid extra implementation overhead in the outer object in these
cases. We can get a pointer to the inner interface, calling QueryInterface of
the outer object with IID of the inner interface.
QueryInterface to A will delegate request to B which, in turn, will delegate
request for the interface to C. This pointer will be returned to the client.
An object that implements the IMoniker interface. A moniker acts as a name that
uniquely identifies a COM object. In the same way that a path identifies a file
in the file system, a moniker identifies a COM object in the directory
namespace.
OLE is build on top of COM. The question is not strict, because OLE was built
over COM for years, while COM as a technology was presented by Microsoft a few
years ago. You may mention also that COM is a specification, while OLE is a
particular implementation of this specification, which in today's world is not
exactly true as well, because what people call COM today is likely
implementation of COM spec by Microsoft.
Again, the question does not require strict answer. Any DCOM object is yet a COM
object (DCOM extends COM) and any COM object may participate in DCOM
transactions. DCOM introduced several improvements/optimizations for distributed
environment, such as MULTI_QI (multiple QueryInterface()), security contexts
etc. DCOM demonstrated importance of surrogate process (you cannot run in-proc
server on a remote machine. You need a surrogate process to do that.) DCOM
introduced a load balancing.
Dual interface is one that supports both - IDispatch interface and
vtbl-based interface. Therefore, it might be used in scripting environment like
VBScript and yet to use power and speed of vtbl-based interface for
non-scripting environment. Discussion then may easily transform into analyzing
of dual interface problems - be prepared to this twist.
Yes. You may have two dual interfaces in one class, but only one of them
may be default. The bottom line is that you cannot work with two dual interfaces
at the same time due to nature of dual interface!
To support two dual interfaces in VB you would write something like: dim d1 as IDualInterface1 dim d2 as IDualInterface2 set d1 = new MyClassWithTwoDuals set d2 = d1 In ATL's class you would have to use macro COM_INTERFACE_ENTRY2(IDispatch, IDualInterface1), to distinguish between different dual interfaces.
Some objects can essentially be considered static: regardless of which methods
are called, the state of the object does not change. Instead of accessing such
an object remotely, it is possible to copy the static state of the object
and create a new object with the same state information on the caller
side. The caller won't be able to notice the difference, but calls will be more
efficient because they do not involve network round trips. This is called
"marshaling by value".
This is pretty difficult question to describe shortly. Anyway, apartments were
introduced by Microsoft in NT 3.51 and late Windows 95 to isolate the problem of
running legacy non-thread safe code into multithreaded environment. Each thread
was "encapsulated" into so called single-threaded apartment. The
reason to create an object in apartment is thread-safety. COM is
responsible synchronize access to the object even if the object inside of the
apartment is not thread-safe. Multithreaded apartments (MTA, or free threading
apartment) were introduced in NT 4.0. Idea behind MTA is that COM is not
responsible to synchronize object calls between threads. In MTA the developer is
responsible for that. See "Professional DCOM Programming" of Dr.
Grimes et al. or "Essential COM" of Don Box for the further discussion
on this topic.
Yes, you can. This is fundamental postulate of COM: "If you can get there
from here, you can get there from anywhere", i.e. QI'ing for IUnknown you
may proceed and to get a pointer to any other interface, supported by the
object. Aggregated object exposes its interface directly, without visible
intervention of the object container. Contained object is created within the
object container and its interfaces might be altered or filtered by the object
container.
By definition, running object table (ROT) is a globally accessible table
on each computer that keeps track of all COM objects in the running state that
can be identified by a moniker. Moniker providers register an object in the
table, which increments the object's reference count. Before the object can be
destroyed, its moniker must be released from the table.
Global Interface Table (GIT) allows any apartment (either single- or multi-threaded) in a process to get access to an interface implemented on an object in any other apartment in the process.
No! The decision to use custom marshaling is an all-or-nothing decision; an
object has to custom marshal all its interfaces or none of them.
Yes. Call DllRegisterServer() from the client. Do not forget to call
DLLUnregisterServer() from the same client. You may also use Registrar object
for the same purpose or use direct manipulation of the windows registry.
VARIANT is a huge union containing automation type. This allows easy conversion
of one automation type to another. The biggest disadvantage of VARIANT is size
of the union.
Create an object (call CoCreateObjectEx()) with CLSCTX_REMOTE_SERVER flag.
__declspec(novtable) is a Microsoft's compiler optimization. The main idea of
this optimization is to strip the vtable initialization code from abstract class
(for abstract class the vtable is empty, while it is initialized in contructor)
MSDN has an excellent article on this topic (search for "ATL Virtual
Functions and vtables")
IDL stands for Interface Definition Language. IDL is the
language to describe COM interfaces.
In-proc is in-process COM object, i.e. COM object that implemented as DLL and
supposed to be hosted by a container. When you have to instantiate the in-proc
object remotely, you may use DLLHost.exe application that was design specially
for this purpose.
OLE is an object and embedding first implementation of COM spec available from
MS before COM was officially named COM.
The most famous examples are probably drag and drop and structured storage
implementations.
Storage and Stream.
Compound document is a document that contains information about other documents
hosted in this document. All office documents _may_ be compound documents, but
may be not. Word documents from version 6.0 and up are stored as structured
storage.
|