|
Taruni wrote: (almost all the ones I have gone through today are looking like small projects, making the things more complicated for me to understand)
That is because complex problems are solved by simplifying them into their constituent parts and solving the smaller problems. You are not likely to find a single example that walks through from your start to your end. That need is specific to you.
Taruni wrote: I would like to know about 1) what services are
This would be a good place for you to start[^]
led mike
|
|
|
|
|
std::vector<myclass> vec;
MyClass & get_selected()
{
std::list<myclass>::iterator it=vec.begin();
for (;it!=vec.end();++it) {
if (it->is_selected())
return &*it;
}
return NULL;
}
|
|
|
|
|
followait wrote: Is it the address of the element in the vector,
and is it safe?
Yes, &*it is the address of the vector element that the iterator refers to.
Whether it's "safe" or not depends on what you mean by "safe".
It is safe regarding if the address returned really is the address of the contained element.
But considering that you are handing out a non-const pointer or reference to the object, the caller may change it at will. This could of course be considered as "not safe" in some way.
However, your code snippet doesn't seem to compile correctly.
In your function declaration you say that the return type is a reference to a myclass object, but you actually return a pointer to it unless you've omitted something important. The return statement should read 'return *it; '.
"It's supposed to be hard, otherwise anybody could do it!" - selfquote "High speed never compensates for wrong direction!" - unknown
|
|
|
|
|
Design suggestion: you're probably better off following what the STL algorithms do in this case, and return an iterator:
std::vector<myclass> vec;
std::vector<myclass>::iterator get_selected()
{
for (std::vector<myclass>::iterator it=vec.begin();it!=vec.end();++it)
{
if (it->is_selected())
return it;
}
return vec.end();
}
or even use the algorithms provided in the STL...
std::vector<myclass> vec;
std::vector<myclass>::iterator get_selected()
{
return std::find_if(vec.begin(), vec.end(), std::mem_fun_ref(&myclass::is_selected));
}
|
|
|
|
|
|
I think you can't save this address, for example as a class member.
If you add new elements to the vector it may need additional memory,
which means he must allocate new memory for the whole vector and copy
all his data. So every address to the old memory will be invalid
afterwards.
|
|
|
|
|
Even if you change to returning an iterator, be careful about doing any operations that invalidate the iterator.
|
|
|
|
|
I tried to follow the naming convention of STL, but encounter a problem.
For example:
class round_rect
{
...
}
Sometimes, in the context, I need no special object name,
I tried to name it as round_rect, so it became:
round_rect round_rect;
I want to know how STL name this?
BTW: google suggests RoundRect , but if I want to keep the naming convention consistent,
the member function also need capital letters. However I prefer the STL way.
|
|
|
|
|
the_round_rect ?
See, that's why I like Camel-Casing things. I'd have this:
class RoundRect
{
...
};
RoundRect roundRect;
All hail the case-sensitivity of C++!
|
|
|
|
|
Hi I have an ATL plugin which needs to receive the "WM_DISPLAYCHANGE" message, when windows resolution changes.
I've added a handler as follows
class ATL_NO_VTABLE CWebPluginControl :
public CComObjectRootEx<ccomsinglethreadmodel>,
public IDispatchImpl,
public IPersistStreamInitImpl<cwebplugincontrol>,
public IOleControlImpl<cwebplugincontrol>,
public IOleObjectImpl<cwebplugincontrol>,
public IOleInPlaceActiveObjectImpl<cwebplugincontrol>,
public IViewObjectExImpl<cwebplugincontrol>,
public IOleInPlaceObjectWindowlessImpl<cwebplugincontrol>,
public ISupportErrorInfo,
public IPersistStorageImpl<cwebplugincontrol>,
public ISpecifyPropertyPagesImpl<cwebplugincontrol>,
public IQuickActivateImpl<cwebplugincontrol>,
public IDataObjectImpl<cwebplugincontrol>,
public IProvideClassInfo2Impl<&CLSID_WebPluginControl, &DIID__IWebPluginControlEvents, &LIBID_WebPluginLib>,
public IObjectSafetyImpl<cwebplugincontrol,>,
public IConnectionPointContainerImpl<cwebplugincontrol>,
public IConnectionPointImpl<cwebplugincontrol,&diid__iwebplugincontrolevents>,
public IPropertyNotifySinkCP<cwebplugincontrol>,
public IPersistPropertyBagImpl<cwebplugincontrol>,
public CComCoClass<cwebplugincontrol,>,
public CComControl <cwebplugincontrol>,
public CProxy_IWebPluginControlEvents<cwebplugincontrol>
...
CWebPluginControl();
~CWebPluginControl();
BEGIN_MSG_MAP(CWebPluginControl)
...
MESSAGE_HANDLER(WM_DISPLAYCHANGE, OnDisplayChange)
...</cwebplugincontrol></cwebplugincontrol></cwebplugincontrol></cwebplugincontrol></cwebplugincontrol></cwebplugincontrol></cwebplugincontrol></cwebplugincontrol></cwebplugincontrol></cwebplugincontrol></cwebplugincontrol></cwebplugincontrol></cwebplugincontrol></cwebplugincontrol></cwebplugincontrol></ccomsinglethreadmodel>
But my OnDisplayFunction never gets hit when i change resolutions. So my question is, does IE(using IE 7) forward this message? If so why am I not able to pick it up?
Thanks for your time,
Chris
|
|
|
|
|
The evidence certainly points to 'no', doesn't it?
The easiest way to check is to stick a conditional breakpoint on the BEGIN_MSG_MAP(CWebPluginControl) line, set to trigger when WM_DISPLAYCHANGE is received (looking at the definition of the BEGIN_MSG_MAP macro in atlwin.h , the message ID is sent in the parameter uMsg ). If this doesn't trigger, then you could use Spy++[^] or Winspector[^] to confirm that IE is receiving WM_DISPLAYCHANGE.
One possible work-around - check the screen resolution in each message handler and react appropriately when you detect a change. I would have thought that you'd get a WM_PAINT pretty soon after the resolution change, which you could use as a trigger.
|
|
|
|
|
Thanks, I tried your suggestion using the breakpoint and using spy++ and I see the message going into IE but not being passed to my plugin. So as you said I'm using the WM_PAINT message now, and detecting a resolution change.
Thanks,
Chris
|
|
|
|
|
I created a BHO project with C++ for IE, I retrieve a response time (end to end) for page. but I need more information : the download timing for each object in page, all request sending...
Have you any idea?
Thanks
|
|
|
|
|
It's been a while since I've looked at WebBrowser events, but I don't think you get a notification with a URL for each item in the page. You can listen for DownloadBegin and DownloadEnd , but those don't have any parameters; you're guaranteed to get one for each item that the browser downloads, but you don't get the actual URLs.
|
|
|
|
|
Thanks for response.
yes, it's right. but I found a tool(httpwatch,) that use add-ons to watch or spy Internet explorer, and of course without a proxy. so the solution is exist.
I would know how it's worked?
best regards.
|
|
|
|
|
Hi,
I have worked on ATL projects in VC2003 and above, but I have never created them from scratch. They have all originally been projects that evolved from VC6 code.
How do people handle deployment and dependencies of the projects? Under VC6 the .idl file is shown as being part of the project, and therefore you could modify where the .tlb and .h and .c files where generated. At my current company we have a .\TLB directory off the branch root. How can I make the .tlb file end up there? I cannot see either the idl file, or its project settings.
Peter
|
|
|
|
|
Hah Hah I've figured it out. The ATL project had been supplied to be by a collegue, and he had left the defaulted "Attributed" item in the ATL Project wizard.
If you create a project and clear this the .idl files appear just as they did with VC6.
|
|
|
|
|
How do people who create attributed atl projects manage the output files?
|
|
|
|
|
Does anyone know what valid values can be returned from FinalConstruct?
Originally I was helping out some colleagues on how to set the error information in an ATL component. They wanted to be able to set the COM error information. I showed them what to do so that their COM object implemented ISupportErrorInfo. They want to return information to the client if there is an error accessing certain state information needed for the COM object to do its job. So I told them to put their code in FinalConstruct, but they are saying that the error info in _com_error::Description() is blank. An HRESULT had been set in _com_error, but it just showed as a hex value when added to the watch window with m"_hRes, hr".
When they created their COM object they didn't know to click supports ISupportErrorInfo in the atl object wizard, so this has all been added by hand.
I tried to test this using a dummy com object implementation on my PC, but the client returns REGDB_E_CLASSNOTREG. I did find a nntp message saying that you should not set any rich error info in FinalConstruct but just to return an HRESULT. However if I return any HRESULT other than S_OK, the client returns REGDB_E_CLASSNOTREG.
I have tried other code of ours that tries to set rich error info with AtlReportError etc, but I don't think this ever gets called because they are just constructing other COM objects that usually succeed. When I deliberately change the active code line to set the error information then they too return REGDB_E_CLASSNOTREG.
|
|
|
|
|
Is it possible that the error code is right and their class *hasn't* yet been registered?
|
|
|
|
|
No, its runtime dependent. For example I can make FinalConstruct's return value dependent on the existence of a file returning S_OK if present and E_OUTOFMEMORY if not and REGDB_E_CLASSNOTREG is caught when the file is absent.
|
|
|
|
|
Ah, sorry - didn't quite pick up on that
Anyway - I knocked up a little ATL server project and a client and I get the same behaviour as you (good start). Stepping back through the call stack (and keeping an eye on the value of EAX as that's where function return values are stored), it would seem that the REGDB_E_CLASSNOTREG is introduced inside ole32.dll, i.e. by Windows, because after your InprocServer fails to construct properly, OLE attempts to load your class using other COM server types (e.g. out-of-process server).
To cut a long story short, the correct HRESULT gets passed back to your client so long as you use the correct <a href="http://msdn.microsoft.com/en-us/library/ms693716(VS.85).aspx">CLSCTX</a>[<a href="http://msdn.microsoft.com/en-us/library/ms693716(VS.85).aspx" target="_blank" title="New Window">^</a>] enumeration in your call to CoCreateInstance .
Here's the code I used which picks up the correct HRESULT - my server is an in-process server (i.e. implemented in an ATL DLL project).
::CoInitialize(0);
CComPtr<IUnknown> wibble;
HRESULT hr = wibble.CoCreateInstance(CLSID_paf, 0, CLSCTX_INPROC_SERVER);
To re-iterate, using the appropriate CLSCTX enumeral should allow you to retrieve the correct HRESULT .
|
|
|
|
|
Wow! Excellent work, thanks for your help.
It seems however that you cannot use ISupportErrorInfo, the _com_error::Description is blank. This does however seem to confirm what I read in the microsoft newsgroups, that your not supposed to set any rich error information inside FinalConstruct. This doesn't seemed to be mentioned in MSDN, but then neither is there any info on REGDB_E_CLASSNOTREG for that matter.
Many, many thanks the important thing is they can return an error code from CreateInstance.
Peter
|
|
|
|
|
My application working fine in the dev environment.But in the testing /production environment
it is not working because that environment has only
windows server 2003
IIS
.net2.0 framework
In my application I have Used some microsoft VC++ dll's also along with .net dll's.
Now Iam getting "RUNTime Error" pop-up screen message as below
" The Application has been terminated in an Unusual Way"
On googling i came to know that some dll's like msvcrt.dll of windows server 2003 has to be changed...But Iam not pretty sure about it..
In Production/test environment there is only framework installed ,but there is no visual studio installed on it.may be due that this error may occur...
So kindly post your suggestions and views to help me
I tried the following as suggested by you:
1. I have installled the redistributable package suggested by you.
after installing i restarted the PC even now also I got the same runtime pop-up error.
2. Then I checked even with the dependency walker for the dll.
I found that there is no miising dll.
3. Then I tried by installing Visual C++ express edition..even then also i got the same pop-up error.
Kindly help me.....
|
|
|
|
|
balu12345 wrote: The Application has been terminated in an Unusual Way
IIRC, this generally means an exception's being raised. The error could (shock! horror!) be in your own code - can you put WinDbg [^] on the server and debug it on there? Or even remote debug on the server?
Just noticed that VC++ Express is installed on the machine - you *could* debug with that. If your issue is with a Release build, turn on debug information for the Release build (you can do that without turning off any optimisations) and make sure you copy PDB files with the EXE.
|
|
|
|
|