|
Thank for the answer,
I’m using the example from MSDN. Everything is working fine. The only problem is as mentioned; I need first to convert the PWSR to LPCWSTR and later on to LPCTSTR.
How can convert the PWLX_NOTIFICATION_INFO variables Username and Domain to LPCWSTR? And how to convert LPCWSTR to LPCTSTR?
thanks
dabayi
|
|
|
|
|
Hi
I am reading in an XML(ish) file and want to pass the file handle off to different member functions depending on the section being read. New sections are being added so I wanted the code to be 'maintainable'. I am creating a map of pairs and want to call the sectionhandler for the section. I've come up with the following up to now :-
class MyFileClass
{
private:
void Section1Handler() {
void Section2Handler() {
void Section3Handler() {
public:
void ReadFile();
};
void MyFileClass::ReadFile()
{
map <string , void (MyFileClass::*)() > functionMap;
functionMap["<Section1>"] = Section1Handler;
functionMap["<Section2>"] = Section2Handler;
functionMap["<Section3>"] = Section3Handler;
ifstream myfile(....)
string myBuffer;
while (myfile)
{
getline(myfile , myBuffer)
functionMap[myBuffer]; <--- clearly won't work - it just returns the address.
//I've tried things like *(functionMap[myBuffer])(); but getting nowhere
}
}
Whilst the code might not be perfect above, it gives the idea of what I am trying to do. Call a function directly related to the content of myBuffer. That way, a new sectionhandler can be added and inserted into the map, instead of
if (myBuffer == "Section1") Section1Handler;
else if (myBuffer == "Section2") Section2Handler;
which, now I've looked at it again, doesn't seem that hard to maintain does it really? But regardless of that, I really would like to know what I'm doing wrong WRT the map of member function pointers...
Regards
Angel
*********************************************
The sooner you fall behind, the longer you have to catch up.
|
|
|
|
|
You need to explicitly supply the object reference that the member function will be called on. So, as your code is in a member function of your class, use this:
(this->*functionMap[s])();
HTH!
Stuart Dootson
'Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p'
|
|
|
|
|
Many thanks Stuart - worked a treat.....except, if they add a new section to the XML without telling me I bombout - so I have to first makesure the handler is in the map :-
FuncMAP::iterator iter = funcMap.find(SectionSubString);
if (iter != funcMap.end())
(this->iter)(); <-- error C2064: term does not evaluate to a function
I really have tried to sort this myself - honest!! - I've tried
(this->*iter)();
(this->*(*iter))();
for now I am using the following - but that entails two map scans instead of one with the iterator
if (funcMap.find(SectionSubString) != funcMap.end())
(this->*(funcMap[SectionSubString]))();
I tried the following :-
void (MyClass::*)() fPtr; <--- can't determine what this line should be..
fPtr = funcMap[SectionSubString];//get the address
if (fPtr)//if the address is valid
(this->*fptr)() ;//call it
I've also trawled the web for something similar and come up blank....
Basically I knew virtually nothing about member function pointers, how to call them, how to define a variable to hold one etc. I still don't know much, but I can at least store one in a map and call it (if I know it is going to exist!). Any help again, much appreciated.
*********************************************
The sooner you fall behind, the longer you have to catch up.
|
|
|
|
|
Remember that std::map::iterator returns a reference to a std::pair , where first is the key and second is the value. So, you want this code to find and (safely) call your function:
FuncMAP::iterator iter = funcMap.find(SectionSubString);
if (iter != funcMap.end())
{
(this->*(iter->second))() ;
}
Stuart Dootson
'Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p'
|
|
|
|
|
Thanks again....I can't blame that one on my lack of member function pointer knowledge can I? My STL is also in doubt!
Now, to find my next problem....
*********************************************
The sooner you fall behind, the longer you have to catch up.
|
|
|
|
|
Sorry if this seems like a dumb question but ...
In the past I've built ATL components using only regular COM CoClasses.
Now I am working on a wrapper component to allow some legacy C++ code to be called via COM.
I've created just the basic standard ATL DLL framework with a single method that delegates the actual implementation to some legacy C++ code that I have. I pass in two strings which are source and target file paths. Then the legacy code is to be called to perform the actual work.
But I cannot call a method on the standard C++ class because even though I create a class instance, the compiler throws a C2228 error during a method call.
My ATL code looks something like:
**********************************************************************************************
STDMETHODIMP CMyWrapper::ExecuteLegacyParse(BSTR bstrSource, BSTR bstrTarget)
{
//Convert the input BSTRs to ANSI C Strings because ANSI Win32 API calls are required
USES_CONVERSION;
char* lpszSource = OLE2A(bstrSource);
char* lpszTarget = OLE2A(bstrTarget);
//So far, so good!
//Create an instance of CLegacyParse class
//No error occurs when creating the legacy CLegacyParse class which is a standard
//C++ class
CLegacyParse LegacyParse();
//So far, so good!
//The following line will not compile! I get a C2228 error - object on the left
//side of the operand must be a class/struct blah blah blah ...
int nResult = LegacyParse.ParseDocument(lpszSource, lpszTarget);
return S_OK;
}
**********************************************************************************************
So my question is, why am I able to create an instance of my CLegacyParse class (again, this is just a generic C++ class, not a CoClass), but I am not able to call a method because the compiler does not recognize my class instance reference, even though it allows the prerequisite instantiation of the C++ legacy class with no errors or warnings???
Is this a problem of COM _stdcall not being compatible with ordinary _cdecl call or something else?
Also, if I just cut and paste my legacy C++ methods into the wrapper COM CoClass as non-com private methods, and supply the function prototypes in the header, the component works fine.
But I don't want to do this because it obfuscates the fact that I simply want to create a COM callable wrapper around existing legacy C++ classes.
PLus I also want to understand exactly why it does not work calling the methods in a generic C++ class as opposed to calling them as private methods within the CoClass.
TIA
Robert
|
|
|
|
|
Hi,
following problem:
I have two different com objects which should support connection points. Both have the same interface (derived) and now both should have the same connection point to use 'follow up' code and the sink for both objects like:
CComQIPtr<imyinterface> p;
if(something == 1)
p.CreateInstance("Dummy.Interface");
else
p.CreateInstance("OtherDummy.Interface");
...
and here comes the problem to advise the sink I have to give the DIID_ ... and they are different for both objects:
p.Advise(pUnk, DIID_DummyEvents, &dw) and p.Advise(pUnk, DIID_OtherDummyEvents, &dw)
what I want for both is
p.Advise(pUnk, DIID_Events, &dw)
AND
in the 'sink' class once again the same. want to use same sink for both objects cause both events should be handled the same way!
Some ideas to solve this misery???
thx&greets
|
|
|
|
|
Hi all ,
I have a an ATL dialog box with a few Edit Boxes in it
and I wanted to add a ListView Control . It worked fine
but when I add the List Control using the Resource editor
I get an assertion failure (::IsWindow()fails) whenever
I call ShowWindow(SW_NORMAL) :
CClientDlg* pDlg=NULL; //MY DIALOG CLASS CClientDlg:public CDialogImpl
pDlg=new CClientDlg;
if(pDlg!=NULL)
{
pDlg->Create(NULL);
pDlg->ShowWindow(SW_NORMAL) //ASSERTION FAILURE ::IsWindow()
}
OnInitDialog(...) isnt being called during Create if I add the ListView control
and so I think this is why IsWindow fails when tested in ShowWindow . My intention
was to have a CListViewCtrl (from ATLControls.h) as a member of CClientDlg and attach
my control IDC_LIST to it in OnInitDialog(...)but im not even getting this far ...
LRESULT CClientDlg::OnInitDialog(UINT uMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled)
{
m_list.Attach(GetDlgItem(IDC_LIST)); //MY LIST VIEW CLASS CListViewCtrl m_list;
return 1;
}
If anyone can see my error or suggest an alternative method i would be very grateful.
Abel.
|
|
|
|
|
|
Thanks Mike - that's sorted it .
|
|
|
|
|
I have developed a sink ATL Dll using microsoft sample code for exchange store events but nothing happens when I try to debug my C++ code for the com object. I attach my visual C++ debuger to the processes inetinfo.exe and then to store.exe but apperenlty the com object is not being created when I send a message to administrator through outlook web access. I my running Exchange 2003.
Anything special needs to be done?
Thanks
In Advance
Majid
|
|
|
|
|
I want to generate random numbers.
plz. help me...
|
|
|
|
|
Hi,
I was looking at the spirit stl extensions, and I was wondering if it's possible to use it to parse a unicode (wide character) string in VC++ 6. I know that the source editor in vc6 only supports single-wide characters, but I was thinking maybe I can use _T() to make all of the strings wide, and then that spirit will be smart enough to do everything OK.
Is this a feasible idea? The strings that I want to parse are in unicode and use special unicode delimiters for their commands (which makes it easier to distinguish commands from normal text, so that's why I need unicode.
Any help would be appreciated.
Thanks,
Brucer
|
|
|
|
|
1. Spirit and VC6 aren't the best of friends - lets be honest, templates and VC6 aren't the best of friends . If you can upgrade to VC7.1, you'll be doing yourself a big favour, IMHO. Not only does VC7.1 ICE less, but it compiles code using Spirit (and many other parts of Boost, to be honest) much faster.
2. It would appear that Spirit does support wide characters to some extent - at least, the primitives (e.g. ch_p, str_p) take their character type as a template parameter.
3. To make strings wide in VC++, don't use _T() unless you can guarantee you're compiling with the UNICODE or _UNICODE macros defined. Instead, use wide string and character literals by prexifing an 'L' - e.g.
L"This is a wide string"
L'W'
4. You're probably more likely to get a coherent response to your queries on the Spirit Users mailing list[^].
Just to give you some encouragement - I've seen posts on the Spirit list about parsing binary (NOT character) data with Spirit. If you can do that, Unicode ought to be a snap!
HTH!!
Stuart Dootson
'Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p'
|
|
|
|
|
Hi,
I’m using collection with ATL and I have the following problem:
I would like to access the items in the collection from a function in the collection class and call a function
In order to create the collection I’ve used the collection wizard from this site.
The collection is vector of ICard items as followed (CCard is simple ATL object):
<br />
typedef ICollectionOnSTLImpl<IDispatchImpl<ICards, &IID_ICards>,<br />
vector< CAdapt< CComPtr<ICard> > >,<br />
ICard*,<br />
_CopyItfFromAdaptItf<ICard>,<br />
CComEnumICardVariantOnSTLvector><br />
ICardsImpl;<br />
class ATL_NO_VTABLE CCards : <br />
public CComObjectRootEx<CComSingleThreadModel>,<br />
public CComCoClass<CCards, &CLSID_Cards>,<br />
public ISupportErrorInfo,<br />
public ICardsImpl<br />
{<br />
I’ve tried to do it like this (CardToString is a function in CCard class and not part of the interface):
<br />
m_coll[i-1].CardToString(str);<br />
I am getting the following compilation error:
error C2039: 'CardToString' : is not a member of 'CAdapt<class atl::ccomptr<struct="" icard=""> >'
what should I do in order to access item functions that are not part of the interface in the collection?
|
|
|
|
|
Hallo,
How please to convert PWSTR to LPCTSTR ?
Thanks s a lot for helping
dabayi
|
|
|
|
|
W2A() should work. It's a macro that is in atl.h I think.
-- Rocky Dean Pulley
|
|
|
|
|
Thanks a lot.
That was the answer.
dabayi
|
|
|
|
|
|
hi,
i got this code -
<br />
CommandBar menuBar = applicationObject.CommandBars["MenuBar"];<br />
CommandBarControl m_TemplatesControl = menuBar.Controls.Add(MsoControlType.msoControlPopup,1,"",System.Reflection.Missing.Value,true);<br />
m_TemplatesControl.Visible = true;<br />
m_TemplatesControl.OnAction = "MyFuncName";<br />
the problem is that it never being called...
i want that when i press the control it will call the function
(it's popup and not button bcuz it got more commands inside it...)
help please,
Avi.
|
|
|
|
|
Wrong forum pal.
--
My name in Katakana is ヨルゲン.
My name in German is Jörgen.
I blog too now[^]
|
|
|
|
|
i don't think so, it's coded in ATL.
|
|
|
|
|
Hey all,
I'm having trouble finding the C++ header files:
atlwin.h
atlbase.h
atlcom.h
If anyone can help me by providing them, or a method of retrieving them I'd greatly appreciate it. Thanks.
-Dave
|
|
|
|
|
Either in the atl\include folder of your Visual Studio 6 installation or the atlmfc\include folder of your Visual Studio.NET installation. If you don't have an installation of Visual Studio, you don't have them.
Stuart Dootson
'Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p'
|
|
|
|