|
|
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.
|
|
|
|
|
For example,
class line
{
private:
list<point> m_points;
list<point>::iterator m_selected_point;
}</point></point>
and if no point is selected, I can't write m_selected_point=NULL , how to write it?
redundantless
|
|
|
|
|
As you have control of the lsit and iterator, it should be safe enough. Lists are easier to do this with than vectors or deques, as list iterators are (IIRC) unaffected by insertions or deletions.
Instead of m_selected_point=NULL , use m_selected_point=m_points.end() .
|
|
|
|
|
Hello!
I am working on a C# COM-Server and a C++ COM client app. The client in fact loads a dll-plugin containing the COM client in a class that acts as a com event reciever:
extern "C"
__declspec(dllexport)
int ndofInit();
extern "C"
__declspec(dllexport)
void* ndofOpen(void* wnd);
extern "C"
__declspec(dllexport)
void ndofShutdown(void* deviceHandle);
[ event_receiver(com) ]
[ module(type=dll, name="NDOF") ]
class NDOFServer
{
public:
NDOFServer() {}
virtual ~NDOFServer();
...
}
Everytime I start the client I get the following error:
Debug Assertion failed!
Program ...
File: C:\Programme\Microsoft Visual Studio 8\VC\atlmfc\include\atlbase.h
Line 2706
Expression _pAtlModule == 0
Clicking Retry and returning to my code reveals that this error occurs when the constructor of NDOFServer() is called.
The constructor is called this way by the client app:
extern "C"
__declspec(dllexport)
int ndofInit()
{
if (sNdofServer == NULL)
sNdofServer = new NDOFServer();
return 1;
}
This error seems not to occur when the client plugin-DLL is used with another COM server offering the same classes etc. written in C++ (whose code I do not know).
I tried to switch some more or less relevant options in the project properties like:
- MFC usage static/shared/Windows shared
- ATL usage static/shared/none
- minimize CRT usage in ATL yes/no
- CLR support no/CLR
stdafx.h looks like this:
#if defined(_WIN32)
#ifndef WINVER // Allow use of features specific to #define WINVER 0x0501 // Change this to to target other
#endif
#ifndef _WIN32_WINNT // Allow use of features specific to
#define _WIN32_WINNT 0x0501 // (was 0x0501) Change to target other versions
#endif
#ifndef _WIN32_WINDOWS // Allow use of features specific to
#define _WIN32_WINDOWS 0x0410 // Change this to target Windows Me or later.
#endif
#ifndef _WIN32_IE // Allow use of features specific to IE
#define _WIN32_IE 0x0600 // Change this to target other versions of IE.
#endif
#define _ATL_APARTMENT_THREADED
#define _ATL_NO_AUTOMATIC_NAMESPACE
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS
#include <atlbase.h>
#include <atlcom.h>
<---->
//#include <atlwin.h>
//#include <atltypes.h>
//#include <atlctl.h>
//#include <atlhost.h>
--> commenting these headers out did neither help nor hurt
using namespace ATL;
#import "progid:AerionInput.Device" embedded_idl no_namespace
#endif //_WIN32
The C# DLL is nothing spectacular and the "main" class(or the first one being instanciated), which is not instanciated at this time. The COM-visible interface looks like this:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace AerionInput
{
[
Guid("CB3BF65E-0816-482A-BB11-64AF1E837812"),
InterfaceType(ComInterfaceType.InterfaceIsDual)
]
public interface ISimpleDevice
{
int Type
{
get;
}
IKeyboard Keyboard
{
get;
}
ISensor Sensor
{
get;
}
void Connect();
void Disconnect();
void LoadPreferences(string preferencesName);
}
}
And the AssemblyInfo.cs reads this like:
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
[assembly: AssemblyTitle("TDxInput")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("n/a")]
[assembly: AssemblyProduct("TDxInput")]
[assembly: AssemblyCopyright("Copyright © n/a 2008")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(true)]
[assembly: Guid("7858b9e0-5793-4be4-9b53-661d922790d2")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
I am doing this on Windows 2000 with Visual Studio 2005 Pro latest SP and .NET 2.0.50727 SP1.
|
|
|
|
|
Christian Bayer wrote: Debug Assertion failed!
Program ...
File: C:\Programme\Microsoft Visual Studio 8\VC\atlmfc\include\atlbase.h
Line 2706
Expression _pAtlModule == 0
It's been a while since I did any ATL dev but that seems like a fundamental ATL error. Meaning you don't have your project configured or initialized properly for ATL use. Do you have any experience using ATL? If not, and you want to use it, I recommend you take the time to study the technology enough to understand the basics. There are plenty of resource on MSDN and I would imagin also here on Code Project that would help, IF you are a beginner.
led mike
|
|
|
|
|