Click here to Skip to main content
Email Password   helpLost your password?

Introduction

  1. What is IUnknown? What methods are provided by IUnknown? 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.
  2. What are the purposes of AddRef, Release and QueryInterface functions? AddRef increments reference count of the object, Release decrements reference counter of the object and QueryInterface obtains a pointer to the requested interface.

  3. What should QueryInterface functions do if requested object was not found? Return E_NOINTERFACE and nullify its out parameter.
  4. How can would you create an instance of the object in COM? 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.
  5. What happens when client calls CoCreateInstance? 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.
  6. What the limitations of CoCreateInstance? Well, the major problems with CoCreateInstance is that it is only able to create 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.
  7. What is aggregation? How can we get an interface of the aggregated object? 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.
  8. C is aggregated by B, which in turn aggregated by A. Our client requested C. What will happen? 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.
  9. What is a moniker ? 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.
  10. What�s the difference, if any, between OLE and COM? 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.
  11. What�s the difference between COM and DCOM? 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.
  12. What is a dual interface? 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.
  13. Can you have two dual interfaces in one class? 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.
  14. What is marshalling by value? 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�.
  15. What is a multi-threaded apartment (MTA)? Single-threaded apartment (STA)? 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.
  16. Let�s assume we have object B and aggregated object C (in-proc server), created by B. Can you access any interface of B from C? What�s the difference between aggregated and contained objects? 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.
  17. What is ROT ? GIT ? Count pros and cons of both. 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.
  18. If you have an object with two interfaces, can you custom marshal one of them? 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.
  19. Is there a way to register in-proc server without regsvr32.exe? 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.
  20. What is VARIANT? Why and where would you use it? 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.
  21. How can you guarantee that only remote server is ever created by a client? Create an object (call CoCreateObjectEx()) with CLSCTX_REMOTE_SERVER flag.
  22. What is __declspec(novtable)? Why would you need this? __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)
  23. What is an IDL? IDL stands for Interface Definition Language. IDL is the language to describe COM interfaces.
  24. What is In-proc? 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.
  25. What is OLE? OLE is an object and embedding first implementation of COM spec available from MS before COM was officially named COM.
  26. Give examples of OLE usage. The most famous examples are probably drag and drop and structured storage implementations.
  27. What are 2 storage types for composite document? Storage and Stream.
  28. Is .doc document a compound document? Is it a structured storage? 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.
You must Sign In to use this message board.
 
 
Per page   
 FirstPrevNext
QuestionI failed with CoCreateInstanceFromFile
pikkaro
17:56 7 Jan '07  
I tried to use instance from file, not from registry.
I wonder I can use CoCreateInstanceFromFile method for this situation.
I found this method return E_INVALIDARGS but I don't know why.
Please help me, thank you.

Example code I used: HRESULT hr;
CoInitialize(NULL);

IMyObject myObject; // IMyObject : IUnknown

MULTI_QI qiResult[256];

hr = CoGetInstanceFromFile(NULL,NULL,&myObject,
CLSCTX_INPROC,STGM_READ,
_T("MyAllObjects.dll"),256,qiResult);

...

CoUninitialize();

Generalthread usage in structured storage?
cpp_prgmer
20:52 17 Sep '06  
I have the storage opened using StgOpenStorage using the flags STGM_READWRITE|STGM_TRANSACTED|STGM_SHARE_DENY_WRITE. Now is it possible to thread the writing activity to various streams in the same appln?
GeneralBig Problem
charfeddine_ahmed
3:41 11 Jul '06  
Is Agregation the solution to the following problem :

I have many resembling activex controls (third party components with their SDKs) ( resemblance in functionnality). they are controls that controls different types of IP Surveillance Camera. I need to develop an application that is independent of them, ie access them independently, so that when i add new control for a new camera, the application needs not be recompiled. so the code has to be external to the application, more than that the linking should be explicit and at execution time rather at load time.
I tried using a DLL which contains a Cwnd object that embeds the activex control in order to declare the EventSink map there and be able to capture events and then relay them to the application by telling the Dll to link to its caller module.
but i did'nt even succeed to make calls in the direct sense, ie application-->exp Dll functions-->Cwnd member functions-->activex specific members, so to create the object etc, the problem being MFC-class pointer can't pass between app and Dll !!?
So how to encapsulate the different activex components in an abstract one. i tried to see COM, but unsuccessfully: is there a sort of activex control inheritance at least (derivation)? Or can I apply containment ( by creation of new activeX control or a general COM component which would contains an object of the particular ActiveX)

here's some other details (Note for the ActiveX control I can access them via C++, by building an MFC proxy class ( Create New class-->MFC class from ActiveX ) then integrate that class into a container where i insert the EventSink Map. Well i succeeded 100% in integrating evry control, and capturing its events, etc, but it's just about encapsulation)
the details :
"
the activex control i'm talking about are as i understood a sort of COM objects, which are to me classes that can be instantiated at execution time, so the dll needs not an implicit link to the client exe.
i have an application that access different camera on the network through those particular activex control, the code being like this :
for example for an axis camera, in the main view window i call
m_Axis.Create(...,this,CRect(..),..); ( m_Axis being here an object of an MFC proxy class to an activeX control (Axis Camera Media Control)).
and of course i handle the onsize member function :
so you can see that the activex control is even responsible for rendering the video stream. other members do the connection, allow me to get a handle to the image being displayed, etc.
so my problem is that i do'nt want the code to be integrated into my application, in order for the application not to depend on those control. so i want some sort of specification such the application can load and talk independently to those objects.

the code would look like :
CcameraControl *_cam[5];
and when the user adds a camera to be controled by the application, a dialog prompting for its ip address, and very possibly its type, appears, then i use the type information to localize the control which is then loaded into a case of the table above.
so i need to encapsulate, create new controls for evry activex, such that those control have the same functions and can talk to the caller-application using a same mechanism.
here's what i tried :
i thought i must derive new classes from the activex control, such those classes have the same functions. they need to relay the control from the application to their parent specific services. and capture events back from their parent and relay them to the application, but here i came to the inevitable ad the impossible :
although succeeding in encapsulating the controls into uniform components, there is no WAY for those classes to be loaded at the execution time and behave as true plug-in components. for example for MFC, if there is a wa&y to write a dll that exports some classes dervived from mfc classes, that dll need be implicitly linked to the exe, and this latter wouldn't succeed even to load without her.

Is in COM, ATL a solution ?
So what i did was to create a simple dll, that can access mfc, then in the CWinApp object i declared a Cwnd object ( acontainer for the specific control) and to there i shifted an activex control data member: when the window is created, it creates the control in its area. i declared the eventsink map in the CWnd so to capture the events. and then you have simple plain exportable functions that enable the caller to create the internal CWnd object and calles its members. but since i need to pass a parent window (originating from the application interface classes) then the problem i talked about comes ( mfc pointer)

here's also what i tried :
a new MFC ActiveX project, thinking i can apply the containment principle :
an abstract, wrapper Control contains the specific one, relay the evnts in either senses, but it just didn't work, the specific activex control create function fails when the OnCreate container member function is called to load the global control"
Thank u in advance.
charfeddine_ahmed@yahoo.fr
GeneralI voted you down
Trollslayer
3:44 10 Oct '05  
because you have taken someone else's work and claimed it for your own.

The tigress is here Big Grin
GeneralWhat is IDispatch
Anonymous
19:24 23 Aug '05  
What is IDispatch and
How it related to IUnknown?
thanks
GeneralRe: What is IDispatch
guestcat
2:43 2 May '06  
IDispatch is an interface that is derived from IUnknown.
it contains some methods like GetIDsOfNames , Invoke etc...
This is mainly invented,, so that the clients that are unaware of the V-Table fundas can make use of COM server. ex: calling from javascript, vb etc.

The GetIDsofNames fn return the dispatch id of a method name, given it's name..

the Invoke method calls the actual method on the COM Server.
for more info refer MSDN.


- cheers
redCat


^-^
@|@
GeneralNice
melwyn
0:30 29 Jun '05  
Really nice and useful for interviews Smile
Please add to it when you get time. For e.g. what really happens behind the scenes when you call CoCreateInstance etc.
You get a 5 from me.

Cheers,
Mel
GeneralRe: Nice
Blue_Aqua
1:34 29 Jun '05  
Hi,

There is a very nice article that answers ur questions..


Introduction to COM Part II - Behind the Scenes of a COM Server
By Michael Dunn

A tutorial for programmers new to COM that explains the internals of COM servers, and how to write your own interfaces in C++

http://www.codeproject.com/com/comintro2.asp

cheers
Generalhelp on perf error
jacksmith123
4:26 9 Jul '06  
Hi,

I am trying to run some service on win2k3 which was running perfectly fine on win2k, but its giving me the following error code 80004015 on win2k3.

This service is trying to initialize the perf counters using

IRunningObjectTable->Register(ROTFLAGS_ALLOWANYCLIENT|ROTFLAGS_REGISTRATIONKEEPSALIVE ,this,Moniker,&RegisterKey).

This is failing to register the perf counters but service is working fine with the error code "80004015". This happens when we try to register a CLSID that has an APPID with RunAs account different from your server's identity.

when I do the following changes then its starts working, but I guess that is not the right approach,

1. Add the following value in registry ie appid{}/RunAs. i.e. RunAs = Interactive User.

2. Installing and run the service with administrator account but not as local service.

Can you please let me know if you know any other way i can do the things so that i can run the service as local system.

Thanks in advance,

Regards,
Jack

PS : plz CC your reply on jacksmith123ster@gmail.com

GeneralHow to extract COM information from a DLL ?
Rogerio Silva
9:14 28 Jun '05  
Hi,

How to extract COM information from a DLL ?
I'm trying to get this information to register COM objects;
Thank you

Rogerio
GeneralRe: How to extract COM information from a DLL ?
Blue_Aqua
23:09 28 Jun '05  
use VB ...!
add this dll to a dummy project using project references.
once this dll is added..

use the intellisense feature of VB to see all the methods and properties that are exposed..Smile

dim obj as XXXX
Now obj. will list all info..

Simple..


GeneralRe: How to extract COM information from a DLL ?
Rogerio Silva
4:43 29 Jun '05  
Hi,

I just want to do this manually. Using Windows API. I'm using VC++

Thanks
GeneralRe: How to extract COM information from a DLL ?
Anonymous
11:58 29 Jun '05  
If it has typelib in resources, use LoadTypeLib and then returned ITypeLib*. If it is not, there is no way.
GeneralRe: How to extract COM information from a DLL ?
windows_linuxOVL
22:59 24 Nov '05  
Hi,

iam also looking for a good answer, and i implemented in the following way.

You can use CLSIDFromProgIDEx to get the info if you know the progID.
to get the progid you need to enumerate the registry for the given file.

it may be very basic.

regards
....
GeneralRe: How to extract COM information from a DLL ?
Shashikant_2006
20:53 17 Jul '06  
Whenever a COM dll is created, a type library is also created(by compiling the .idl file) which has all the info abt the interfaces which are used in COM(their ID,name,signature,methods,CLSID & co-class of the component,even the unique id of the type library).we have to import this type library using #import if we r developing CO client by ATL.Then by smart pointers we can create COM objects by using CreateInstance() fubction.Dont forget to use CoInitialize(NULL).

Never complain,never explain,just do your work.
GeneralOh Gawd -- not again!
fwsouthern
11:44 24 Jun '05  
Duh!
GeneralRe: Oh Gawd -- not again!
Blue_Aqua
21:34 27 Jun '05  
dear friend,I have taken so much pain to collect these nice questions and share it with everybody ...

Atleast be a bit kind with ur words..Smile .


ciao
GeneralRe: Oh Gawd -- not again!
mcbain
1:00 30 Jun '05  
eh... I don't really think you've put soooo much pain into collecting these questions. All of them are a copy&paste from http://www.techinterviews.com/?p=103...


/ Fred
GeneralRe: Oh Gawd -- not again!
Andrea75
3:43 27 Jul '05  
Smile really bad stuff...


Last Updated 24 Jun 2005 | Advertise | Privacy | Terms of Use | Copyright © CodeProject, 1999-2010