• C

Calling a COM written in VB from a C program

Hi
 
   I have a COM object in VB, and I need
   to call it from a C program.
   Does anyone know how to do that?
     -= Gadi =-

lgadiAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

pjknibbsCommented:
If the COM object was written to use Automation standards (likely, given it's a VB COM object), you can call it the same as you would any other COM interface.
0
lgadiAuthor Commented:
Okay, but that's what I can't seem to get done. I'm not sure which APIs to
use (I was told about the CComPtr MFC object, but I need to use only C).
A short example of how it might be done could be great!
0
pjknibbsCommented:
Have you ever used COM before? I just ask to find out what level of detail you need!
0
Creating Active Directory Users from a Text File

If your organization has a need to mass-create AD user accounts, watch this video to see how its done without the need for scripting or other unnecessary complexities.

jhanceCommented:
Basically the process is as follows:

1) Call OleInitialize() or CoInitialize() from your program.

2) Use CLSIDFromProgID() (usually) to get the CLSID for the object from its "friendly" name.

3) Use CoCreateInstance() to get the object's IUnknown interface.

4) Use IUnknown::QueryInterface() using the pointer returned in #3 to get a pointer to the object's IDispatch interface.  This _IS_ the AUTOMATION interface pointer and is the key to the rest of this.

5) Use IDispatch::GetIDsOfNames() to get the dispIDs for all of the methods and properties on the Automation interface you'll be using from your C program.

6)Use IDispatch::Invoke() to actually call methods or properties on the interface.

7) when you're done, don't forget to call IDispatch::Release(), IUnknown::Release(), and CoUninitialize().

 
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
lgadiAuthor Commented:
jhance: I haven't tried your solution yet, as soon as I will, I'll let you know the results.
pjknibbs: Well, I've created a COM object using C++, but I've only invoked it using VB, and the whole thing is pretty much encapsulated there...So, I never did go through the entire process in C.
0
WynCommented:
That easy in C ?
0
WynCommented:
The class stuff and so on maybe hard to around or create it manually by struct.
0
lgadiAuthor Commented:
jhance: Okay, I started following your directions, but as I got to step 3, I typed CoCreateInstance, and the 3rd parameter there is REFIID, and the compiler says it must be initialized. The problem is I don't know how to initialize it... I think a wokring example (if possible) will prevent alot of problems, if none is available, I will happily settle for an explenation.
0
pjknibbsCommented:
Actually the REFIID is the FOURTH parameter of CoCreateInstance, and it's the GUID that uniquely identifies your Visual BASIC COM object. To clarify, all COM objects must be identified by a Globally Unique Identifier, a 128-bit number assigned when the control was created in the first place. You need to know this value to instantiate a COM object. If you don't already know this value for your COM object I'm not sure how you'd find it out without searching the registry.
0
jhanceCommented:
lgadi,

In almost all cases, refiid for CoCreateInstance will be IID_IUnknown.

Use it like this:

CLSID myClsid;
LPUNKNOWN pUnk;

if(!SUCCEEDED(CLSIDFromProgID(L"ObjectName.ControlName.1", &myClsid))){

 // Error
}

if(CoCreateInstance(myClsid, NULL, CLSCTX_ALL, IID_IUnknown,  (LPVOID *)&pUnk) != S_OK){

  // Error
}
else{
  // OK
}
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
C

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.