|
Thanks a lot for your explanation.
You have said in the end that this is not how you would solve the problem. So how in your would you exactly solve the problem? Would you please explain it!
Thanks...
---
With best regards,
A Manchester United Fan
The Genius of a true fool is that he can mess up a foolproof plan!
|
|
|
|
|
As I stated in my previous post I would have the person who asked the original question to elaborate on the subject since as I understood the problem there is a more intuitive solution with preprocessor directives.
If the preprocessor directive solution is, for some strange reason, not applicable I would have used messages since the COM object already is, or could be developed to be, multithreaded.
In the original question a second problem is described briefly about how he/she was unable to use a message based solution. I don't know whether this is due to incompetence, poor design or something else since there's simply not enough information in the post.
Perhaps a solution like this[^] would do the trick.
LazyKancha wrote: So how in your would you exactly solve the problem?
As you might have guessed by now I cannot suggest a solution to the problem since I don't have enough information and since you are not the original poster I cannot get more information. What I meant was the suggested solution to be somewhat far-fetched since there is an obvious solution that is simpler and if that one isn't applicable there could be more to it than creating a abstract base class.
It was also a hint to you that there could be more to it than meets the eye and if you're having a problem you should post a question regarding your own problem. There is a possibility that the person that replied to the original post has misunderstood the question. There's also a possibility that you have misunderstood the question and hence cannot understand the answer. Even I may have misunderstood the original question and that's why I think it's important to be able to ask questions back to the person that sent the originial question.
However, I suspect that I would have tried to make the COM object class declaration visible to the dialog class since it would the simplest thing to do. But this requires some trade-offs such as the call has to be made from the same thread that created the COM server, i.e. it cannot be called from a worker thread inside the dialog class.
Hope this helps
--
Roger
It's suppose to be hard, otherwise anybody could do it!
|
|
|
|
|
Ok.. Let me explain my situation.
I have a COM component which exposes some methods and also implements Connection points. Now, this component contains a dialog derived from the CAxDialogImpl. There are buttons on this dialog. This dialog is displayed through a method in the COM component. I want to relay the button click event on the dialog to the client using the component.
Lets say that the Component exposes a Method .. umm DisplayMyMessage(). This method.. has the Cdlg.DoModal() code. When the user clicks on a buton on the Dialog, the client must be notified of the click event.
Can you help me out.......???
---
With best regards,
A Manchester United Fan
The Genius of a true fool is that he can mess up a foolproof plan!
|
|
|
|
|
At first, I suggest you try to add a function to your dialog class that takes a pointer to the COM server as argument and let the dialog class save it as a member variable.
Use that member variable to call the Fire_ButtonClicked event.
This would be the simplest solution I ment earlier.
This may not work as you desire since you'll be stuck inside the COM server's DisplayMyMessage() routine, or rather the local message loop of DoModal(), and the COM library may complain about this when you try to fire the event.
If this is the case I suggest you start a worker thread from DisplayMyMessage() and pop up the dialog from that thread instead. To be able to fire events from a secondary thread inside a COM server you can use Micheal Lindig's solution[^] which I've used several times with great success. His solution lets you forget about what thread you're firing events from and will take care of the marshalling for you "automatically".
The down-side is a slight performance draw-back since the interface has to be unmarshalled and queried for every call, but it's usually managable and will work (if implemented correctly ).
Hope this helps
--
Roger
It's suppose to be hard, otherwise anybody could do it!
|
|
|
|
|
Thanks a lot. Will try the Michael solution.
---
With best regards,
A Manchester United Fan
The Genius of a true fool is that he can mess up a foolproof plan!
|
|
|
|
|
Hello,
How to "catch" doble click on ANY lnk file, but before any windows message (for example, no CD in CD drive,...)?
I mean, how to do it if lnk file point to CD drive and no disk in drive?
And:
How to take the same if lnk file is internet shorcut?
Thank you.
|
|
|
|
|
|
When I used ATL to build a COM, It's named ATLObj.dll.
With a event of OnLButtonDblClk.Code like this:
BEGIN_MSG_MAP(CATLDiceObj)
CHAIN_MSG_MAP(CComControl<catldiceobj>)
DEFAULT_REFLECTION_HANDLER()
MESSAGE_HANDLER(WM_LBUTTONDBLCLK, OnLButtonDblClk)
END_MSG_MAP()
But when I added this Control into a ATL Dialog ,The "OnLButtonDblClk" event function is not responded and added into MFC Dialog is working well.
Can you tell me the reason why it can not respond the OnLButtonDblClk event?
Thanks in advance!
|
|
|
|
|
Make it look like this:
BEGIN_MSG_MAP(CATLDiceObj)
MESSAGE_HANDLER(WM_LBUTTONDBLCLK, OnLButtonDblClk)
DEFAULT_REFLECTION_HANDLER()
CHAIN_MSG_MAP(CComControl)
END_MSG_MAP()
Steve
|
|
|
|
|
But It can not pass to compile project.
Error is like that:
e:\atlocx\atldiceobj.h(89) : error C2955: 'CComControl' : use of class template requires template argument list
d:\microsoft visual studio\vc98\atl\include\atlctl.h(1371) : see declaration of 'CComControl'
e:\atlocx\atldiceobj.h(89) : error C2955: 'CComControl' : use of class template requires template argument list
d:\microsoft visual studio\vc98\atl\include\atlctl.h(1371) : see declaration of 'CComControl'
e:\atlocx\atldiceobj.h(89) : error C2352: 'ATL::CComControl<t,winbase>::ProcessWindowMessage' : illegal call of non-static member function
d:\microsoft visual studio\vc98\atl\include\atlctl.h(1365) : see declaration of 'ProcessWindowMessage'
|
|
|
|
|
I just re-ordered what you had already - If it compiled before why not now?
Steve
|
|
|
|
|
Sorry, I have make a mistake,so it can't compile success, and now it's ok.
But I am sorry to ask you again,it is still unable to respond to the event of OnLButtonDblClk.
|
|
|
|
|
I need to develop a COM component, which fire events.
In COM there is a method named M1 and an event named F1, M1 fires the event F1.
M1()
{
Fire_F1();
}
There will be two applications app1 and app2.
App2 will advise to the event F1 in the COM.
Now when app1 gets the interface of COM and calls M1, app2 should catch the event.
i.e app1->COM->app2.
I mean to establish communication between app1 and app2 thru COM.
I tried with atl dll, but I am not able to succeed.
Some one please help me.
|
|
|
|
|
Hello kk_mfc,
If I understood your specifications correctly, it's quite straightforward actually. Your COM Server must meet the following criteria :
1. It must be an EXE Server.
2. The COM component must be a SINGLETON.
3. The Class Factory of your COM Component must be registered with the REGCLS_MULTIPLEUSE flag (this is already the case by default).
I wrote an experimental COM EXE Server based on your specs. It works well. If you need it, email me directly :
bio_lim_2004@yahoo.com
and I'll send a copy to you.
Best Regards,
Bio.
|
|
|
|
|
Hi,
I randomly get a first chance exception when my application call CoUninitialize(). I dont get it all of the time and the code isnt always the same. I have seen codes 0x800706B5 and 0x80010108. It doesnt appear to cause any problems but it worries me that there may be some underlying issue.
My app is built with MSVC6.0 and I call CoInitializeEx(NULL,COINIT_MULTITHREADED) to intitialise COM
Any suggestions?
TIA
Tony
|
|
|
|
|
These error codes are RPC_S_UNKNOWN_IF and RPC_E_DISCONNECTED respectively. If you're just seeing them in the debugger's output window, and they're being handled - you don't get an unhandled exception message box - I wouldn't worry about them. IIRC the RPC layer which underlies COM does use exceptions to report problems, rather than returning error codes.
It probably just means that you're using DCOM and the target machine either isn't responding, isn't running the same OS as the client, or disappears while you have a reference to an object. I think you might also get RPC_E_DISCONNECTED if the process hosting an out-of-process object crashes or otherwise terminates while you've still got a reference open.
Stability. What an interesting concept. -- Chris Maunder
|
|
|
|
|
Thanks Mike,
As you say, the message is only output to the debug window, I just wondered why I got the error. I have used this code for years now and it hasnt fallen over, it was just morbid curiosity.
Thanks for the explanation.
Cheers,
Tony
|
|
|
|
|
Are you using normail pointers for Interfaces or Smart Pointers ?
S o h a i l K a d i w a l a
modified 21-Apr-21 21:01pm.
|
|
|
|
|
I am using normal pointers. The error is output to the debug window - I do not get an unhandled exception dialog.
Tony
|
|
|
|
|
I encounter errors while trying to compile com project with idl file attached. i assume the file is ok, because someone used it before, but perhaps i could fix that by changing compilator configuration...
error MIDL2311 : statements outside library block are illegal in mktyplib compatability mode : [ ] <br />
error MIDL2311 : statements outside library block are illegal in mktyplib compatability mode : [ Interface 'IPsipentaUISupport' ]<br />
error MIDL2096 : duplicated attribute : [uuid] [ Interface 'IPsipentaUISupport' ]<br />
thank you in advance for any ideas .
|
|
|
|
|
if not problem can you show .idl file ?
|
|
|
|
|
Quoting from MSDN -
MIDL2311: statements outside library block are illegal in mktyplib compatibility mode <br />
You may need to specify the /mktyplib203 command-line switch when you compile your IDL file.<br />
Note The Mktyplib.exe tool is obsolete. Use the MIDL compiler instead.
S o h a i l K a d i w a l a
-- modified at 5:57 Friday 21st April, 2006
modified 21-Apr-21 21:01pm.
|
|
|
|
|
I built a control using the MFC ActiveX control wizard in VC6 and I am able to add methods, properties, and events just fine. When the control is created, I start a new thread (CWinThread-based) in the constructor. The control is not visible during runtime; rather this worker thread runs in the background (reading the serial port and doing parsing operations) and sends back information to the host application via events. The way I did this was to make the thread class a friend of the control class so that the thread class could directly call the FireEvent___ functions. Is this the right way to do this? I've Googled this and also searched cp here but came up short on specific examples.
I ask this because when I test the control on VB6, sometimes the entire VB IDE shuts down (crash). When I test the control on VB.NET 2005, the event callback functions can't access any of the form controls (because the event function is called under the context of the control's worker thread). In LabView, the events fire back but all the arguments are zero; not the values that were passed to the FireEvent___ function (they are all signed long).
Thanks in advance!
|
|
|
|
|
Hello prcarp,
>> The way I did this was to make the thread class a friend of the control class so that the thread class could directly call the FireEvent___ functions. Is this the right way to do this?
This is not good enough. You basically need to marshal the event sinks of your control's client to the thread managed by your CWinThread-based class.
I have written a sample applcation that demonstrates this. Please email me :
bio_lim_2004@yahoo.com
and I'll send you the sample codes.
Best Regards,
Bio.
|
|
|
|
|
What is the difference between ActiveX and COM?
---
With best regards,
A Manchester United Fan
The Genius of a true fool is that he can mess up a foolproof plan!
|
|
|
|