|
Hello,
I need some help please, I have made a COM server and i am dead sure that its right(copied it from somewhere actually), but i sure i am doing somehting wrong on the client side. Following is the code for the client :
#include <objbase.h>
#include <stdio.h>
#include "IAdd.h"
#include <iostream.h>
/////////////////#import "mycom.dll"
const IID IID_IAdd = {0x048b3f36,0xbad5,0x4d4e,{0xa5,0x16,0xc8,0x8b,0xe9,0xff,0x02,0x0a}};
static const GUID CLSID_AddObject =
{ 0x7209ef49, 0x5fb8, 0x4bdf, { 0xb4, 0xc5, 0x8b, 0x95, 0xb8, 0xbb, 0x27, 0x82 } };
void main()
{
long n1 = 100;
long n2 = 200;
long nOutPut = 0;
CoInitialize(NULL);
IAdd *pAdd;
CoCreateInstance(CLSID_AddObject,NULL,
CLSCTX_INPROC_SERVER ,IID_IAdd, (void **)(&pAdd));
pAdd->SetFirstNumber(n1);
pAdd->SetFirstNumber(n2);
pAdd->DoTheAddition(&nOutPut);
cout<
|
|
|
|
|
Omar Alvi wrote:
well my server implemets IClassFactory and my custom interface IAdd which adds two numbers.... but my client is not working , i debuged the application
and found that pAdd after the CoCreateInstance is NULL ..... and that is the problem how to correct it ?????
CoCreateInstance will return you an error number as an HRESULT, what error number do you get This will help you track down the problem.
Omar Alvi wrote:
Secondly i dont understand one concept, Once i have made the server and it registers itself automatically. How should my client know the CLSID, u must have seen this at the top of main() :
If you use
#import "mycom.dll" named_guids
then the guids will automatically be imported. If you are using #import you might want to use the smartpointers rather than using CoCreateInstance. You can also use __uuidof(IAdd) to get the UUID too.
Michael
But you know when the truth is told,
That you can get what you want or you can just get old,
Your're going to kick off before you even get halfway through.
When will you realise... Vienna waits for you? - "The Stranger," Billy Joel
|
|
|
|
|
Thanks for helping,
the error i am getting is (in hex): 0x800401f9 dont know what this means ?
Also is there any other method except import thingy...for import to work i placed my dll in the clients folder, what if the dll is on another pc...thank you, hope to hear from u soon
|
|
|
|
|
Omar Alvi wrote:
the error i am getting is (in hex): 0x800401f9 dont know what this means ?
According to google
One common HRESULT you'll see when working with DLLs is 0x800401F9. This result usually means OLE couldn't find your DLLGetClassObject or DLLCanUnloadNowfunctions. Perhaps they are not exported, or the names don't match exactly.
This MSDN article http://support.microsoft.com/default.aspx?scid=kb;en-us;258942[^] seems to suggest the same thing.
Is this COM dll based on ATL?
Omar Alvi wrote:
for import to work i placed my dll in the clients folder, what if the dll is on another pc
#import is a compile time command, the location of the dll at runtime doesn't matter. Basically all #import does is to create a class wrapper for the COM dll. I find it easier and quicker to use #import, but CoCreateInstance is okay too.
Michael
But you know when the truth is told,
That you can get what you want or you can just get old,
Your're going to kick off before you even get halfway through.
When will you realise... Vienna waits for you? - "The Stranger," Billy Joel
|
|
|
|
|
Thanks again,
Well i am not using ATL or MFC, and i have exported the DLLGetClassObject or DLLCanUnloadNowfunctions. WEll i saw this code on CodeGuru and i am using the same, except that i havent included the TypeLib support that was there in the orignal code. Rest is the same the orignal one works and mine doesnt ............
|
|
|
|
|
What does your .def file look like?
--
If there was a problem, Yo, I'll solve it!
Check out the hook while my DJ revolves it.
|
|
|
|
|
Tip: if you ever get a HRESULT which you don't recognize, do a "find in files" through your system include files. It's bound to be there, somewhere with a symbolic name.
--
If there was a problem, Yo, I'll solve it!
Check out the hook while my DJ revolves it.
|
|
|
|
|
How can i deploy a MTS Server
when i am using com componnets to connect remote com object it giving the error interface not supported
|
|
|
|
|
hello,
I have made one COM, which returns network groups, users etc. When i run it, (use it in vb) it will crash. It runs function once but if then i press anything it will crash.
Can anybody please help me?
Thanx a Lot.
Jigar.
|
|
|
|
|
Did you AddRef() the interface pointer before returning it? I'm assuming you're passing an interface pointer to VB as a [out, retval] parameter.
If not, you better read up on the rules of COM.
--
If there was a problem, Yo, I'll solve it!
Check out the hook while my DJ revolves it.
|
|
|
|
|
hi
i want to know how a COM Component developed in Visual c++ using ATL Library , will be invoked in Visual Basic so that the connection to the Object remains active means server can send information to client with out client call to server.
Same like the IConnectionPoint. Advise () so in vc++.
NOT Like this
Dim WithEvents obj As Word.Application
...
Set obj = New Word.Application
regards
shahzad
|
|
|
|
|
You need to implement a source interface in your COM object via IConnectionPointContainer . The ATL wizard will do this for you. I can't remember how it works in VC6, but in VS.NET, you can check "Connection Points" on the "Options" page of the wizard.
The wizard will give you an interface IYourInterface. This is the interface you specified for your object. It will also give you a dispinterface called _IYourInterfaceEvents. This is the source interface which VB will recognize with WithEvents.
Just add your event functions in that interface. Then when you are done (or whenever you modify this interface), right click on your COM class in the Class View, and select "Add -> Add Connection Point". The IDE will now generate (or update if you've done this before) the proxy class for firing the events (resides in the file _IYourInterfaceEvents_CP.h). This template class is inherited by your COM class (the wizard set this up, you don't have to do it manually). It provides Fire_XXX-functions for you to use within the methods of your COM class. If you have defined an event like this: void OnEvent(long x, BSTR y) , the corresponding firing function will look like this: Fire_OnEvent(long x, long y) . If you call such a fire function, the proxy class will automatically call all event sinks with the parameters you provided.
Was this what you needed to know?
--
If there was a problem, Yo, I'll solve it!
Check out the hook while my DJ revolves it.
|
|
|
|
|
Hello, I am having a frustrating problem. While I am not an expert in COM, I have done my share.
I am trying to connect to a program that exposes an ActiveX interface, it supplies the Type Library file (.tbl) which I have imported into my C++ project, however, it does not register its self with the registery. Also, there isn't a CLSID available. So none of the normal C++ functions work. Did I mention that accessing it through VB works? (well VBscript).
It ends up that the program I am trying to access only registers in OLE's Running Object Table. I can use CoGetObject() (of course there isn't many examples of it) to find it, but then my program is unable to call the functions and crashes when m_lpDispatch->Invoke() is called in the InvokeHelper function.
My CoGeObject looks like this:
BIND_OPTS bind_op;
REFIID riid = IID_IDispatch;
IBACtalkActiveXInterface * p_ibac = NULL;
int result = CoGetObject(OLESTR("bactalk.activex.interface"), &bind_op, rrid, (void **)&p_ibac);
p_ibac->SendTimeSync();
I'm not sure what is going on. My main question is why does it work in VB and not in C++. Arg. I've tried everything I can think of, so any insight would be most helpful. Should I not use the COleDispatchDriver derived class any more?
Thanks,
Nathan Brown
|
|
|
|
|
If it works in VB, then it should work in C++, because the C++ is more powerful than VB (VBS etc). But not vice versa .
Can you give some VB code working well for you?
With best wishes,
Vita
|
|
|
|
|
Hello, I would have though that C++ wouldn't have this problem. A sample bit of code that they give, and that I have tested (in VB script) is this:
Dim bt As Object
Set bt = GetObject ( "BACtalk.ActiveX.Interface" )
bt.SendTimeSync
I just can't make the same thing work in C++. Is there some magic function I should be using? I thought I was getting somewere with CoGetObject(), but no. Any further help would be aprecciated. If I had a choice, I would probably do this in C# and it would work.
Nathan Brown
|
|
|
|
|
Try to use this fragment of code. If it doesn't work, try to check the hr value and tell this value to us.
BIND_OPTS bind_op;
REFIID riid = IID_IDispatch;
IDispatch* p_ibac = NULL;
HRESULT hr = CoGetObject(OLESTR("bactalk.activex.interface"), &bind_op, rrid, (void **)&p_ibac);
if( SUCCEEDED(hr) )
{
LPOLESTR lpsz = OLESTR("SendTimeSync");
DISPID dispid;
hr = p_ibac -> GetIDsOfNames(IID_NULL, (LPOLESTR*)&lpsz, 1, LOCALE_USER_DEFAULT, &dispid);
if( SUCCEEDED(hr) )
{
DISPPARAMS dispparams = { NULL, NULL, 0, 0};
VARAINT varRet;
VariantInit(&varRet);
hr = p_ibac -> Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT,
DISPATCH_METHOD|DISPATCH_PROPERTYGET, &dispparams, &varRet, NULL, NULL);
VariantClear(&varRet);
}
}
With best wishes,
Vita
|
|
|
|
|
Thanks for the help and encouragement. What ended up working is calling CoGetObject() with IID_IUnknown first, then querying for the IID_IDispatch interface. For whatever reason, I can't have the IID_IDispatch in the CoGetObject and expect anything to work, even an IUnknown level function.
Nathan Brown
|
|
|
|
|
Is the COM object you are trying to connect to via the ROT an out-proc server? If so, make sure you've registered the proxy server dll for that server.
I meddled with the ROT a week ago, and experienced similar strange behaviors. I access the ROT directly with monikers and the IRunningObjectTable interface, but that's basically what happens inside the CoGetObject() function anyhow. Anyway, it seemed to me that I got either a malfunctioning proxy or a proxy for the wrong interface. Don't ask how I have these clues, long story.. But one would think that I'd get a E_XXX back from the ROT if it can't give me a correct proxy.
Anyhow, I built a proxy server dll for the out-proc server, registered and everything worked just fine.
--
If there was a problem, Yo, I'll solve it!
Check out the hook while my DJ revolves it.
|
|
|
|
|
I had seen your message on that before I posted, but I wasn't sure if it was the same problem. Also, I don't understand exactly what you were explaining.
How does a proxy DLL work? More importantly, are there any examples of one available?
If you are talking about something that came with the application I am trying to interface, then I don't know of any proxy DLLs. I tried registering any DLLs that looked like they might register, and also the .exe (with -RegServer), but none of that worked.
Thanks for any help.
Nathan Brown
|
|
|
|
|
Nathan Brown wrote:
How does a proxy DLL work? More importantly, are there any examples of one available?
A proxy DLL contains code for the proxy and stub for one or more interfaces. Whenever you make a COM call across an apartment boundary (between "threads" and processes (local or network)), the data passed back and forth must be marshalled - especially between processes since they do not share memory. Now, there's a lot of details here which I will not go into (mainly because I don't I'm competent enough to give a good explanation, and a forum post is way too short). I advise you to pick up a book on the subject - Don Box' Essential COM is a good read.
Nathan Brown wrote:
If you are talking about something that came with the application I am trying to interface, then I don't know of any proxy DLLs.
Ah, so you haven't written this app yourself? I see. Well, I've read that sometimes the proxy/stub DLL is not needed. The system itself should be able to "compile a proxy/stub" on the fly for any OLE automation compatible interface described in a TLB (.DLL, .EXE, .OCX, or .TLB). But contrary to this statement (can't remember if I read it in MSDN or Don Box' Essential COM), it does not always work. So basically, for your particular problem (no source for the application/automation server), I do not know a solution.
However, the proxy/stub DLL I was talking are normally built with DLL-servers by default. Try generating such a project and take a look at the proxy/stub project which is automatically attached to the solution.
--
If there was a problem, Yo, I'll solve it!
Check out the hook while my DJ revolves it.
|
|
|
|
|
I want to write user name and password in login window of Yahoo messenger from my application.
Till now I am able to get Handle to Login window using Getclass and GetwindowText.My plan is to get the handle of Login window , then that of edit boxes of Login window. Then to paste text into edit boxes. The problem is how to know whether this login (which is a dialog box) or edit boxes belongs to Yahoo messenger or a particular window.
|
|
|
|
|
I'm trying to add a property to a "COleControl" derived control. The problem is that the type of that property is another ATL Class in the same project, and I don't seem to know how to do that.
Anyone has any ideas?
Gush
|
|
|
|
|
I'm working on a background UI plugin for WMP9, and I'm wanting to add custom hotkeys. Looking through the documentation, it appears that the IWMPPluginUI::TranslateAccelerator(LPMSG lpmsg) function would work the best for that; but, unfortunately, I have no idea how to notify WMP9 of my accelerator table. How should one go about doing that?
|
|
|
|
|
HEllo people,
I am a begineer at COM and i am facing difficulties in understanding it. I wanna learn to make components without using ATL and MFC first. CAn anyone direct me to some good resource no the net, which along with the theory guides you how to make a component step by step. Most of the articles that i have come across are in theory too much and implemetation is not dicussed in that detail.
Thank you...
|
|
|
|
|
Check out MindCracker.
http://www.mindcracker.com/mindcracker/c_cafe/com.asp
Check out MSDN.
Kuphryn
|
|
|
|
|