|
I second Essential COM. The beginning chapters in ATL Internals give a very good overview of how some of the COM object details are done (and it's a good book to get anyway, it's not nearly as advanced as MFC Internals, and it's a nice ATL reference).
Once you're ready to do coding, check out my intro to COM article.
--Mike--
Best score on the mini-putt game: 26
My really out-of-date homepage
Sonork - 100.10414 AcidHelm
Big fan of Alyson Hannigan and Jamie Salé.
|
|
|
|
|
Michael Dunn wrote:
I second Essential COM.
Too late! I just bought 'Developers Workshop to COM and ATL' by Andrew Troelsen!
Read your article on Intro to COM.
I figured you were the right person to ask this question:
I program a lot using MFC but now I'm on the threshold of a new project where I would like to add functionality to internet explorer (and later also the office suite). In this special case I would like to add a toolbar with buttons and stuff where some of the buttons should simply copy selected text in the browser document for further processing (internal search engine) in my code.
Now, do I need to know how COM works in order to achieve this?
Thx Michael,
/Tommy
|
|
|
|
|
|
That one was on me...
Ok, as I have understood the situation, COM is a relatively new technology and people before COM must have been abled to communicate with other programs, right? After all, COM was invented to ease up the DLL mess, which is a mess I believe can do the same as COM but in a more cumbersome way...? Am I completely off track?
/T
|
|
|
|
|
No, COM has been around for a long time in computer terms. Win 95 used it. Before COM, IPC (inter-process communication) was done with DDE (dynamic data exchange), which was just plain clunky and inefficient.
COM still has the DLL mess however - servers can be in DLLs, which are subject to all the DLL Hell problems.
--Mike--
Rollin' in my 5.0
With the rag-top down so my hair can blow.
My really out-of-date homepage
Sonork - 100.10414 AcidHelm
Big fan of Alyson Hannigan and Jamie Salé.
|
|
|
|
|
Hi all,
I have a server running on Win2000, and I am trying to configure the client to run on Win98 without any luck. I have the client exe and type library on the client's machine, and I believe that all the necessary information has been registered into the registry. However, when I used OLE/COM object viewer to instantiate the object ( on Win98 ), I got a "Class not registered" error. Does anybody know what is missing?
Sunny
|
|
|
|
|
Hello Sunny,
- You should have Dcom98 installed on your machine, i think this is installed by default , if not look on your win98 cd or in msdn for dcom98.
-Second you shoud run the DCOMCNFG.EXE on both computers to configure the connect and security settings, if you don't have this file checkout the cd or msdn.
- Third for a default configuration on both computers try this
check Authentication to none,everyone allow access in server component in win2k and Connection Oriented tcp/ip as default protocol.
This should fix the normal error "class not registered" on the client computer(this normally is due to DCOMCNFG.EXE absence or misconfiguration )
Hope this helps,
Joao Vaz
|
|
|
|
|
This is probably a dumb question I am pretty new to ActiveX though. I built a simple ActiveX control using App wizard and got an OpenGL renderer running in my browser, but now I need to be able to load data. Can someone tell me how I am supposed to do this? I'd like to have a data file stored on the server and be able to open it in my ActiveX control.
Any help would really be appreciated,
Jackson
|
|
|
|
|
Check FILE
Mazy
"So,so you think you can tell,
Heaven from Hell,
Blue skies from pain,...
How I wish,how I wish you were here." Wish You Were Here-Pink Floyd-1975
|
|
|
|
|
Not sure I know what you mean. Could you give me a few more clues?
|
|
|
|
|
FILE is a structure and you can use it to open,read, or write files with it.You said you have a data file and you want to read it from your ACtiveX.
This is an example from MSDN:
FILE *stream, *stream2;
void main( void )
{
int numclosed;
if( (stream = fopen( "data", "r" )) == NULL )
printf( "The file 'data' was not opened\n" );
else
printf( "The file 'data' was opened\n" );
if( (stream2 = fopen( "data2", "w+" )) == NULL )
printf( "The file 'data2' was not opened\n" );
else
printf( "The file 'data2' was opened\n" );
if( fclose( stream ) )
printf( "The file 'data' was not closed\n" );
numclosed = _fcloseall( );
printf( "Number of files closed by _fcloseall: %u\n", numclosed );
}
Is that what you want or I misunderstood your problem?
Mazy
"So,so you think you can tell,
Heaven from Hell,
Blue skies from pain,...
How I wish,how I wish you were here." Wish You Were Here-Pink Floyd-1975
|
|
|
|
|
I guess I wasn't clear, I do know how to open close and read files. My problem is getting the file. If the ActiveX control is embedded in a webpage and the file is on the server with that page how do I open that file? Basically what I am trying to setup is something like Macromedia Flash.
|
|
|
|
|
Could you tell me how to Use Com Event in VC6.0?
For example:
In my program,I want to use 'Shell.Explorer'(Web Broswer),but how can I get its Event(NewWindow2,NavigateComplete2...) by MFC or SDK?
Thanks!
|
|
|
|
|
MFC:
First add it to your dialog, form,or anywhere you want,go to class wizard,select the class you put it there,then find the
ID of your component in left list box and select it,at this point you can see the event of your component inthe right list box and you can add it.
For SDK:
I never test it but just guess,you can see in your MFC, and see what codes it add to your class you do the same in your SDK projetc
Mazy
"So,so you think you can tell,
Heaven from Hell,
Blue skies from pain,...
How I wish,how I wish you were here." Wish You Were Here-Pink Floyd-1975
|
|
|
|
|
Take a look at < a href =www.voksoe.dk> this website for lots of IE toolband, explorer band samples that connects and uses WebBrowser events. Mostly these are ATL projects, but you'd get the drift.
#define MOSTLY_LEAN_AND_MEAN
|
|
|
|
|
i.e. www.viksoe.dk. sorry.
#define MOSTLY_LEAN_AND_MEAN
|
|
|
|
|
can any body tell me what's going on
when i compile my project with MVC++ 6.0 everything is fine
but when try it with MSVC++ 5.0 i get the next error and i rely have to get it working with 5.0
:
main.obj : error LNK2001: unresolved external symbol "long __stdcall ATL::AtlModuleInit(struct ATL::_ATL_MODULE *,struct ATL::_ATL_OBJMAP_ENTRY *,void *)" (?AtlModuleInit@ATL@@YGJPAU_ATL_MODULE@1@PAU_ATL_OBJMAP_ENTRY@1@PAX@Z)
main.obj : error LNK2001: unresolved external symbol "public: void __thiscall ATL::CComTypeInfoHolder::AddRef(void)" (?AddRef@CComTypeInfoHolder@ATL@@QAEXXZ)
main.obj : error LNK2001: unresolved external symbol "public: void __thiscall ATL::CComTypeInfoHolder::Release(void)" (?Release@CComTypeInfoHolder@ATL@@QAEXXZ)
main.obj : error LNK2001: unresolved external symbol "public: long __thiscall ATL::CComTypeInfoHolder::GetTypeInfo(unsigned int,unsigned long,struct ITypeInfo * *)" (?GetTypeInfo@CComTypeInfoHolder@ATL@@QAEJIKPAPAUITypeInfo@@@Z)
main.obj : error LNK2001: unresolved external symbol "public: long __thiscall ATL::CComTypeInfoHolder::GetIDsOfNames(struct _GUID const &,unsigned short * *,unsigned int,unsigned long,long *)" (?GetIDsOfNames@CComTypeInfoHolder@ATL@@QAEJABU_GUID@@PA
PAGIKPAJ@Z)
main.obj : error LNK2001: unresolved external symbol "public: long __thiscall ATL::CComTypeInfoHolder::Invoke(struct IDispatch *,long,struct _GUID const &,unsigned long,unsigned short,struct tagDISPPARAMS *,struct tagVARIANT *,struct tagEXCEPINFO *,
unsigned int *)" (?Invoke@CComTypeInfoHolder@ATL@@QAEJPAUIDispatch@@JABU_GUID@@KGPAUtagDISPPARAMS@@PAUtagVARIANT@@PAUtagEXCEPINFO@@PAI@Z)
main.obj : error LNK2001: unresolved external symbol "long __stdcall ATL::AtlInternalQueryInterface(void *,struct ATL::_ATL_INTMAP_ENTRY const *,struct _GUID const &,void * *)" (?AtlInternalQueryInterface@ATL@@YGJPAXPBU_ATL_INTMAP_ENTRY@1@ABU_GUID@@
PAPAX@Z)
|
|
|
|
|
One possibilty:
Link error 2001 happends when you use some function from a dll but you did not add that library to that project,so check if you use specific dll and if you add it to your project setting.
Mazy
"So,so you think you can tell,
Heaven from Hell,
Blue skies from pain,...
How I wish,how I wish you were here." Wish You Were Here-Pink Floyd-1975
|
|
|
|
|
Hello. I hope someone can help me.
what does this error mean and how can solve this:
[Linker Error] Unresolved external '__stdcall AtlModuleInit(_ATL_MODULE *, _ATL_OBJMAP_ENTRY *, void *)' referenced from C:\HW\TEST\TEST2\UNIT1.OBJ.
it is a borland C++ builder 4 compiler.
|
|
|
|
|
Hey all,
I have just started learning COM, and have been following the lab exercises from one of the commerical books. I am in the process of learning how to use dllhost.exe to host my Dll server( Originally, I had developed my server as an in process server without using ATL. ) The book told me to add the AppID to the registry by selecting the "Use Surrogate Process" in OLE/COM viewer. I did exactly that. However, when I tried to run the client, I got an error message that said: "No such interface supported".
The code that generated this error message is as follows:
IMyinterfacePtr p;
p.CreateInstance( __uuidof( CoMyClass ), NULL, CLSCTX_LOCAL_SERVER );
At first, I was very puzzled, but when I went back and looked at my object under the OLE/COM viewer, I can only see the IUnknown interface being exposed, but not IMyinterface.
Does anybody know what's happening? If so, what is the solution to the problem?
Your help is really apprepriate, since I am in this dark hole right now not being able to solve it.
Sunny
|
|
|
|
|
You have the IMyinterface declared inside the CoClass definition on the idl file ?
Joao Vaz
|
|
|
|
|
Yes, I have IMyinterface declared inside the CoClass definition. In fact, my idl file is shown below, using real variable names rather than IMyinterface:
//----------------------------------
/*
This IDL file describes all the COM-isms
contained in the CarServer Library
*/
// Bring in core IDL files.
import "oaidl.idl";
// IStats
[object, uuid(A533DA31-D372-11d2-B8CF-0020781238D4),
helpstring("Get info about this car")]
interface IStats : IUnknown
{
HRESULT DisplayStats();
HRESULT GetPetName([out, retval] BSTR* petName);
};
// IEngine
[object, uuid(A533DA30-D372-11d2-B8CF-0020781238D4),
helpstring("Rev your car & slow it down")]
interface IEngine : IUnknown
{
HRESULT SpeedUp();
HRESULT GetMaxSpeed ([out, retval] int* maxSpeed);
HRESULT GetCurSpeed ([out, retval] int* curSpeed);
};
// ICreateCar
[object, uuid(A533DA32-D372-11d2-B8CF-0020781238D4),
helpstring("This lets you create a car")]
interface ICreateCar : IUnknown
{
HRESULT SetPetName([in]BSTR petName);
HRESULT SetMaxSpeed([in]int maxSp);
};
[uuid(82BA20D1-F07D-11d2-B8E0-0020781238D4), version(1.0),
helpstring("CoCar server with TypeLib")]
library CarServer
{
importlib("stdole32.tlb");
[uuid(82BA20D2-F07D-11d2-B8E0-0020781238D4)]
coclass CoCar
{
[default] interface ICreateCar;
interface IStats;
interface IEngine;
};
};
//-------------------------------- END
Also, since I am talk to an out-of-process server( actually, to a dll hosted by dllhost.exe), do I need to include the proxies/stubs in my build workspace? I currently don't have them included. Is this the reason why it failed to run?
Sunny
|
|
|
|
|
Sunny, you updated the reg ?
After adding a AppId in the HKCR, you also changed the HKCR\CLSID of the CoClass to point to the updated AppId ?
Also you don't need to include the proxy/stub because you're using type library marshaling.
I also see that you're are using the best book to learn atl ... Developer's workshop to COM and ATL 3.0 by Andrew Troelsen
Joao Vaz
|
|
|
|
|
In an ATL ClassWizard generated Control that is used in VB, how do you create a hidden window that can fire events for your worker thread? I've been trying to do this using a GlobalInterfaceTable, and firing events work, but not when you call WaitForSingleObject() to wait for a request to InternetReadFileEx() to finish (cuz it's in VB and that locks up the program until it's done) How is that possible with an already made class? I tried sticking CWinImpl in the class declaration, but it contradicts CComControl so I cant use it. Is there a class that I can call dynamically or a class that doesnt have to have a Type specifier aka:"CWinImpl<cmyobject>" <-- which gives me the error cuz it has CComControl in the dec. any Pointers, Tips, or Hints?
~Timothy T. Rymer
www.digipen.edu
tim.xpertz.com
|
|
|
|
|
Tim, see my aswers bellow , the anonymous and the other
Joao Vaz
|
|
|
|
|