|
It seems Microsoft intentionally don't provide IStream on ordinary files, but I don't know why.
|
|
|
|
|
I can not appreciate the need for a ClassFactory. Why we dont create the object directly when we have its CLSID, instead of first creating ClassFactory which inturn creates the Object ? Why can anyone explain please...
|
|
|
|
|
So far the biggest reason I've seen is that you can implement nifty things such as component licensing. I don't know how common that is, but I know it's possible (using IClassFactory2).
IClassFactory gives you the option to do "cool stuff" without having to making the wanted COM objects dependent on it. Cool stuff might be downloading something from the net, or checking its own integrity before handing out object, or - whatever you want it to do.
--
I am perpetual, I keep the country clean.
|
|
|
|
|
The class factory controls how the COM server (the dll or exe) dishes out the inplementation objects. It can be programmed to hand out a new COM object for each call to CoCreateInstance, or it can continually hand back the same instance to all requesters. Other things are possible too...
Read "Inside COM" by Dale Rogerson for an excellent and thorough explanation of the use of class factories.
~Steve
|
|
|
|
|
You could still do that even if you only had DLLCoCreateInstance()...
I suppose the killer app for class factories is that you can use a class factory on another machine. That's hard to accomplish with a HMODULE and GetProcAddr() if the DLL you seek is on another machine..
--
Seraphim Shock. Gold for your ears.
|
|
|
|
|
I have constructed a COM object in VB6 that exposes various methods to handle custom files. This object works very well when I use it from a normal VB6 project, but when I use it through COM Interop in a C# application a strange error appear:
Inside one of the functions in the COM dll I use the FileExists method on a FileSystemObject. When this method is called from the C# code FileExists returns false, even though the file exists. When the same method is called with the same filename as parameter in VB everything works.
Anyone who have any idea of what I am doing wrong?
Rickard
|
|
|
|
|
Hello,
I am trying to learn to learn about the COM/OLE architecture and make COM/OLE components. I have been using OLE inside (2nd Edition) but it is outdated. The samples are old .. . And besides i dont think the book is that good. Can anyone suggest a better book to learn about COM/OLE WITHOUT ATL AND MFC..
Thank YOu
|
|
|
|
|
Inside COM (Dale Rogerson if my memory serves me)
Essential COM (Don Box)
And if the paths that I have followed/have tread against the flow/there is no need for sorrow
I am coming home
Return, Crüxshadows
|
|
|
|
|
Stefan is right, "Inside COM" is superb...
~Steve
|
|
|
|
|
Check out Developer's Workshop to COM and ATL 3.0 by Andrew Troelsen.
Kuphryn
|
|
|
|
|
Don Box's book is very good but in my opinion bad for starting out - it is too complicated, and at least in my case it overwhelmed me.
Troelsen's book is readily available and seemed good, I have only skimmed through it.
In my case me and my colleague learn with a lesser know book, 'The COM and COM+ Programming Primer' by Alan Gordon, Prentice Hall. Very clear style, good examples, easy to read and follow. Very recommended, I was given a few monthes ago a huuuuuge COM+ project to mantain and had no COM+ experience. This book I am reading it now for the second time and it is so good. Box's book I have but have not taken the time since it goes too deep, Gordon's is very practical. Troelsen I almost bought and will probably in the future.
Best luck,
Juan
|
|
|
|
|
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
|
|
|
|
|