|
Thanks for that, I have actually seen the first one of those before and have tried to take it apart and get what I need, as I said this is the first time I have tried using any sort of Component Object Model so I have found it hard trying to identify useless and useful code, the comments help a little but I was hoping for something that actually explained the different parts of the code rather than just saying what the parts do.
Thanks again,
Ben.
|
|
|
|
|
I have written an object supporting IPersistStreamInit.
Now I want to save/load it in/from ordinary (not structured file).
How to get IStream on ordinary file ? Or I must add an IPersistFile to my object ?
Thanks in advance,
Valery
|
|
|
|
|
You'll have to implement it yourself. Not very hard as IStream methods map pretty much 1:1 to the Win32 API.
--
I am perpetual, I keep the country clean.
|
|
|
|
|
Thank you for the reply, I'd rather implement IPersistFile on my object
|
|
|
|
|
Of course you should, but still - you need that IStream, and if you don't want to use structured storage, you'd have to implement your own class CFileStream : public IStream .
--
I am perpetual, I keep the country clean.
|
|
|
|
|
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.
|
|
|
|