|
Actually you can write COM in C#. It is a horrible implementation technology for COM. I have done this using a C# server and a C++ client.
In C# you declare an interface like this:
[Guid( "ert565645-EA16-4a8c-8CDD-434564565675" ),
InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface _<MyObjectName>
{
string InterfaceMethod1;
InterfaceMethod2
}
Your class then extends that interface:
[Guid( "3D655F63-118B-4e28-B1D5-30DD4AE77424" )]
public class <MyObjectName> : _<MyObjectName>
{
public string Method1()
{
return "Silly";
}
string InterfaceMethod1()
{
return Method1();
}
Stuff like that can work. It is difficult to work with and best advised to stay away from. When you return an object from a call in an interface you will run into problems that the interface does not know about the object and therefore making calls on that object becomes problematic. To deal with this problem you will have to add an attribute to the declaration of your Class. This Attribute [System.Runtime.InteropServices.ComVisible(true)] is added to the declaration of your class.
Please note that doing this flys in the face of everything that COM interactions stand for, but it does work. Also you will have to generate a hack header file to handle certain types used when the typelibrary is imported into your C++ code.
Regards
Ward
Frag
Try, Fail..Fail, Succeed
Tool Developer
Michigan, USA
|
|
|
|
|
Is it possible to save a Word Document to a stream using automation?
"After all it's just text at the end of the day. - Colin Davies
"For example, when a VB programmer comes to my house, they may say 'does your pool need cleaning, sir ?' " - Christian Graus
|
|
|
|
|
Yes you can save word file as stream through automaion
Further elaborate ur problem !
Cheers,
Vishal
|
|
|
|
|
He he he, you wouldn't work in management would you?
Another team on my project, has created code that inserts user data into fields in a word document.
I'm creating a web front end, that has to let the user view the document. I don't want the mess with temporary files, and I actually don't have the direct file access to the destination path.
So, instead of serializing the document to a file, I want to serialize it to a stream like IStream ( ).
"After all it's just text at the end of the day. - Colin Davies
"For example, when a VB programmer comes to my house, they may say 'does your pool need cleaning, sir ?' " - Christian Graus
|
|
|
|
|
|
Thanks!, it looks good...
"After all it's just text at the end of the day. - Colin Davies
"For example, when a VB programmer comes to my house, they may say 'does your pool need cleaning, sir ?' " - Christian Graus
|
|
|
|
|
Bugger, didn't do it for me.
The problem is: I have a pointer to a CoClass Document in memory, I don't want to save it to disk, which seems to be the only option in the _Document interface.
_Document does not inherit the IStorage or IStream interface, so to use structure storage, I would have to first store the Document on the harddisk, and then open it using eg. StgOpenStorage.
The idea was to stream the document to a web client without touching the harddisk.
"After all it's just text at the end of the day. - Colin Davies
"For example, when a VB programmer comes to my house, they may say 'does your pool need cleaning, sir ?' " - Christian Graus
|
|
|
|
|
I am unsure if you can store it as a stream. IIRC, word document files are storages, and not streams. I suppose you could save the OLE Structured Storage as a stream, but that's like storing a file system within a file - it probably doesn't do you any good.
--
My name in Katakana is ヨルゲン.
My name in German is Jörgen.
My name in Mandarin/Kanji is 乔尔根 西格瓦德森.
I blog too now[^]
|
|
|
|
|
Thanks, I was beginning to wonder if I was going blind, and just couldn't see the method name. The best thing I've come up with, is Get_XML().
"After all it's just text at the end of the day. - Colin Davies
"For example, when a VB programmer comes to my house, they may say 'does your pool need cleaning, sir ?' " - Christian Graus
|
|
|
|
|
hello
I found this
http://www.codeproject.com/com/DHTML_Interfaces.asp
here on cp but it only works for ie
is there any way in wich I could apply this for mozilla or does mozilla simply not use coms like ie does and if not how else could I achieve the same results
|
|
|
|
|
Help!
A series of business objects have been created in C# and COM Interop has been enabled to send objects back and forth between the Managed C# and the unmanaged C++ code.
After hurdling a series of obstacles to get these two worlds talking with each other, the problem of accessing the objects returned in a SAFEARRAY from the C# side is causing a problem.
Here is a code sample from the C# side.
The interface is _YohoFolders while the CoClass is YohoFolder.
ArrayListRule RuleFolders;
public object[] GetFolderArray()
{
return RuleFolders.ToArray();
}
object[] _YohoFolders.GetFolderArrayI()
{
return GetFolderArray();
}
However on the other side of the gap between Managed and Unmanaged the only elements that are accessible are the interfaces. Is there a methodology for passing back an Array of interfaces back to the C++ side of the fence? If so please let me know.
In the C++ world the code looks something like this:
MyNamespace::YohoSingleFolder pFolder;
pLeSafe = pAllFolders->GetFolderArrayI();
for( int i = 0; i < nTotalFolders; i++ )
pFolder = (MyNamespace::YohoSingleFolder)(pLeSafe[i].pvData);
End code
If anybody has any ideas, please let me know.
Thank you all in advance for looking at this.
Regards
Ward
Frag
Try, Fail..Fail, Succeed
Tool Developer
Michigan, USA
|
|
|
|
|
I found the solution to this. Actually by configuring things properly a person can directly access the object inside of the Unmanaged code. I am not sure this is a desired ability, but it can be done. It may be something that you would like to do, if so let me know and I will post the code.
Ward
Frag
Try, Fail..Fail, Succeed
Tool Developer
Michigan, USA
|
|
|
|
|
hi
i am new to COM and want to know the difference b/w COM component and ActiveX control.
thanks in anticipations
Muhammad Azam
|
|
|
|
|
|
Thanks a lot, i got it but one thing is still ambiguous........then why do we need ActiveX controls when we have COM ?
thanks in anticipation
Azam
|
|
|
|
|
Hello Azam,
Let take a example for understanding difference between COM DLL and ActiveX Control .
if you are done some Windows Programming, you must have use CreateWindow() (which help in creating window) api, this api is just a function with no user interface but when you use BUTTON on the Dialog box it have UI to interact with it.
same is difference betwwen COM DLL and ActiveX Control . COM Dll proviode you with backward functionality like CreateWindow and ACTIVE X Control provide you BOTH backward Functionality and UI (depend on your need) like BUTTON.
Hope you somewhat grasp the difference between COM DLL and ActiveX Control
"I Think this Will Help"
[Vote One Here,.....]
<h5
alok gupta="" <br=""> visit me at http://www.thisisalok.tk
|
|
|
|
|
thanks Sir........ now i got it clearly. thaks once again for making it clear to me
Azam
|
|
|
|
|
I have written a C++ COM object and I now wish to make some alterations to it.
My current understanding of COM is:
- You can't add or remove methods/properties from an interface, nor can you change parameters on existing methods.
Can someone give me a simple explanation (or point me to one) of why I can't add new methods/properties to an interface? I would have thought that as long as I don't change what's already there, it wouldn’t break binary compatibility. I wrote a small test DLL, built a C++ test app based on it, then added new methods to the interface without rebuilding the test app and it didn't break at runtime. Was I just lucky? Are some languages more/less forgiving about this than others?
- Am I allowed to add new values to an enum that is defined in my IDL?
- What if I have a situation like this:
interface MyInterface
{
[id(1)] HRESULT CreateVideo([out, retval] IVideo** p);
}
I now want to add IVideo2 which implements IVideo.
Assuming that it's illegal for me to simply add CreateVideo2([out, retval] IVideo2** p) to MyInterface, the alternative is to create a whole new MyInterface2 just for CreateVideo2(). But if MyInterface is referenced from another interface then I'd have to create a new version of that interface, except it would reference MyInterface2. And what if *that* interface is referenced by yet another interface? I could suddenly find myself doubling the number of interfaces just to accommodate one small change.
Can I instead change the CreateVideo() code to internally create an IVideo2 object but cast it back as IVideo? That way existing clients can still use the unchanged CreateVideo() interface, while newer clients can then cast the returned object back to IVideo2 and get all the new functionality. Or will this break binary compatibility anyway?
I realise that this is kind of ugly because it requires newer developers to know that they can cast the returned IVideo to IVideo2, but it would sure save a lot of my time as well as cut down on interface bloat.
Any thoughts or advice would be much appreciated!
Gary
|
|
|
|
|
Sir Garence wrote:
why I can't add new methods/properties to an interface?
If you add new methods, and keep the same GUID, you'll write code that starts up a COM object, based on that GUID, and will assume that method is there. for anyone who has your old component, the object will spin up, and blow up when that method is not there.
Christian
I have several lifelong friends that are New Yorkers but I have always gravitated toward the weirdo's. - Richard Stringer
|
|
|
|
|
Hi Christian,
Thanks for responding.
My main concern - and this is the most likely scenario - is older apps running against the newer component. If I add new methods or properties to existing interfaces (but don't remove or change what was already there), will this cause any runtime issues?
Thanks again,
Gary
|
|
|
|
|
On that front, you should be fine. But murphys law states that the reverse scenario will bite you at some point.
Christian
I have several lifelong friends that are New Yorkers but I have always gravitated toward the weirdo's. - Richard Stringer
|
|
|
|
|
Hi,
I'm discovering COM programmation. I've created a client - server application in .Net.
It works fine but for each client, a new server instance is created.
I would like to create only one instance of a server on a remote machine on which clientS could connect to it.
This is the site who helps me to create my client - server : http://my.execpc.com/~gopalan/dotnet/classic_com/com.net_quoteserver.html
Thks a lot
Denis
|
|
|
|
|
Hi sokettepower,
ur COM components appartment should be MTA (Multi-Threaded Appartment), I suppose !
Look out for more info. on STA, MTA and Proxy Stub.
Cheers,
Vishal
|
|
|
|
|
in the SetWindowsHookEx function, I set the _pModule->get_m_hInst() as the HINSTANCE parameter.
The relust of this code is a local hook on the procedure.
"Global hook procedures should be placed in a separate DLL". is com is a separate DLL
hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL,
LowLevelKeyboardProc,
_pModule->get_m_hInst(),
0);
a related article is talking about the subject in a standart DLL (not COM).
http://www.codeproject.com/win32/AntonioWinLock.asp
|
|
|
|
|
I don't see why it couldn't work. Why don't you just try it?
--
My name in Katakana is ヨルゲン.
My name in German is Jörgen.
My name in Mandarin/Kanji is 乔尔根 西格瓦德森.
I blog too now[^]
|
|
|
|