|
Well, writing code that compiles in both modes is a tedious task (specially when you didn't planned for it before) and IMHO it is not worth the effort if you don't really need it (which seems your case). If you renounce to compile in Unicode mode, then A2W and T2W are the same, but at least with A2W you are making it splicit that the code is intended for ANSI mode only.
To build your app in Unicode mode, go the project settings and define preprocessor macros UNICODE and _UNICODE . Although you might be able to succesfully build your project please be aware that Windows 9x OSs are not Unicode compliant, so the app won't just run (in Windows NT/2k/XP it should).
The difference between ANSI and Unicode modes is that the OS APIs you call are different in either mode, accepting char * or wchar_t * strings (for APIs not dealing with text, as for instance GetMessage there's no difference). Unicode is intended for apps in exotic languages, having often more characters than a single char can accommodate.
Apart from this, I think you can simplify your code a little:
USES_CONVERSION;
LPCOLESTR lpcostr=A2COLE((LPCSTR)fileString);
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
Thanks for the explanation. I think I'll stay ANSI for now.
Thanks,
ns
|
|
|
|
|
Hi.
I want to recognize a double click (right mouse button) in a DateTimePicker control, but don't know how to or aware of scenarios that might cause a problem with this.
What I have is grid of edit-able controls (CEdit, CDateTimePicker, CComboBox) and for a Date Time Picker, I want a double-click to capture the current time.
This is to help data entry by the user.
Any help/suggestions?
Thanks.
Johnny Pino
|
|
|
|
|
Sorry, I meant LEFT MOUSE BUTTON (double click), but either left/right should work.
JP
|
|
|
|
|
I have a CDialog derived class I want to use in two places, which differe in functionality. If I set a flag from the spawning
view class (which does a DoModal()), is it allowed to set a flag that will make OnInitDialog behave differently?
BOOL abc = TRUE;
myDlg.SetFlag( abc)
myDlg.DoModal();
and in the CDialog class, :
::OnInitDialog()
{
if (m_flag)
{
dosomething;
}
else
{
dosomethingelse;
}
Is this allowed? I cant really write two different OnInitDialogs, right? So in order to reuse it I am thinking of my flag idea.
Suggestions?
Thanks,
ns
|
|
|
|
|
Yes, you've got it right. Personally, I would make an enumeration variable in the dialog class and use that as the flag. That way, you can switch() on the flag and support future enhancements when you want more than two different behaviors. Just as soon as you've written all the code for two modes you'll find that you now want to have three The additional effort involved is very little.
<code>
class CMyDlg : public CDialog
{
public:
typedef enum
{
Mode1,
Mode2,
Mode3
} MyDlgModes;
private:
MyDlgModes m_Mode;
public:
SetDlgMode( MyDlgModes Mode )
{
m_Mode = Mode;
}
};
BOOL CMyDlg::OnInitDialog()
{
switch( m_Mode )
{
case Mode1:
... do stuff
case Mode2:
... etc
}
}
MyFunc()
{
CMyDlg dlg;
dlg.SetDlgMode( CMyDlg::MyDlgModes::Mode1 );
dlg.DoModal();
}
Ty
"The significant problems we face cannot be solved at the same level of thinking we were at when we created them." -Albert Einstein
|
|
|
|
|
Once again, a million thanks for your patiently detailed resolution. It helps tremendously! I thought I'd have to define the enum globally (can this even be done? like an extern enum)so using the enum declared in CMyDlg is pretty tricky! Appreciate your responses very much indeed!
Thanks,
ns
|
|
|
|
|
Hey no problem at all. It's fun to help out people. You can define the enum globally, although it is cleaner and more "object oriented" to only put the enums in the classes that actually need and use them. That said, if you want to use those same enum values all over the place in other unrelated classes, that's when you'd want to think about defining it in the global scope and putting it in some header. So long as your enum variables aren't global, a global enum typedef won't displease the OO fanatics out there
Ty
"The significant problems we face cannot be solved at the same level of thinking we were at when we created them." -Albert Einstein
|
|
|
|
|
I did:
case Mode1:
int index = 0;
KeyValueMap & keyValueMap = *m_kVMap;
KeyValueMap::iterator it = keyValueMap.begin();
for(; it != keyValueMap.end(); it++)
{
m_listAddRecord.InsertItem(index, (*it).first);
index++;
}
CString temp = m_listAddRecord.GetItemText(0,0);
m_editAddedKW.SetWindowText(temp);
m_editAddedVal.SetWindowText("");
m_editAddedVal.SetFocus();
m_DoneAdd.EnableWindow(TRUE);
case Mode2:
The compiler errors said I was skipping initialization of "temp" and "it" with the case statement. Do I need a return or something somewhere?
I'm doing it with if m_Mode == Mode1 but yours was so cool...
Any idea what its not happy about and how to fix it?
Thanks,
ns
|
|
|
|
|
Yeah... with a case statement it is possible to jump over code that would otherwise be executed. It's almost like a goto statement. For instance, when case is Mode1, you're going to execute all of the code up to where Mode2 starts. What happens if you don't put a break in there, like you've got in your sample? Well in C++, unlike VB, you keep executing right through to the next case statement. This is one of those classic "gotcha" bugs. This by itself is not an error, however, because it is perfectly legal to want to keep executing the code in the next case section.
Someone doing this "case fall through" scenario on purpose might be thinking they can keep using the variables they declared in the previous case block for Mode1. Which might be true if you always executed the code for case Mode1. But you're not guaranteed that, since you might come in directly at case Mode2. Mode2 skips all of those variable declarations and initializations. Your variables don't exist there, so they can't be used nor referenced in that scope. This is a paradox between otherwise legal code and its run-time handling. As such, you have to give another layer of scope to declare any variables inside a case section. Here's some sample code:
std::vector< int > OuterVector;
switch( i )
{
std::vector< int > SwitchVector;
case 1:
{
std::vector< int > InnerVector;
std::vector< int >::iterator itInnerVector;
}
case 2:
{
}
break;
}
As you can see, I've added some block braces {} around the code for both case 1 and 2. This defines a new scope for those variables declared inside the block. They can only be used within that scope since they will be destroyed as soon as execution leaves that scope. If you tried to reference those variables in case 2, you'd get a compiler error because they don't exist.
If indeed you wanted to use the same variables in both case Mode1 and Mode2 when you fell through on purpose, you'd have to declare those variables either before the switch statement, as I've done above with OuterVector, or immediately after the switch but before any case statements are specified, as you see with SwitchVector. The former is a little clearer for other people to understand, but there might be scope issues that require the switch-level scope of the latter.
So, the long story short: wrap your case sections with curly braces. This should help to understand why it is considered an error, however. I've become so accustomed to adding braces to case blocks that I don't even think twice about it when they come out of my fingertips automatically. Here's your sample code tweaked a little bit:
case Mode1:
{
int index = 0;
KeyValueMap & keyValueMap = *m_kVMap;
KeyValueMap::iterator it = keyValueMap.begin();
for(; it != keyValueMap.end(); it++)
{
m_listAddRecord.InsertItem(index, (*it).first);
index++;
}
CString temp = m_listAddRecord.GetItemText(0,0);
m_editAddedKW.SetWindowText(temp);
m_editAddedVal.SetWindowText("");
m_editAddedVal.SetFocus();
m_DoneAdd.EnableWindow(TRUE);
}
break;
case Mode2:
I'm guessing from your previous posts that you don't really want to fall through from case Mode1 to Mode2. So remember to add that break statement before the case Mode2 code starts. That's one key difference between the VB syntax and VC
Ty
"The significant problems we face cannot be solved at the same level of thinking we were at when we created them." -Albert Einstein
|
|
|
|
|
What a truly excellent explanation. Thank you so much. Indeed I need the 'break'. Have a good weekend!
Thanks,
ns
|
|
|
|
|
You bet, have a good weekend too!
Ty
"The significant problems we face cannot be solved at the same level of thinking we were at when we created them." -Albert Einstein
|
|
|
|
|
This is perfectly valid and most usual, particularly if differences are not wild (i.e. if you're not forced to check for m_flag in every handler).
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
hello,
i'd like to get the parent IShellFolder, but i don't want to use the SHBindToParent function because i want my program to work on windows 98.
how can i do that ?
|
|
|
|
|
Vassili Bourdo's ITEMIDLIST management library
[^] provides a replacement of the function for Windows 9x/NT.
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
thanks very much my friend
|
|
|
|
|
I used the defines :
<br />
#typedef unsigned hyper ulonglong;<br />
<br />
#define uint8korr(A) (*((ulonglong *) (A)))<br />
#define int8store(T,A) *((ulonglong *) (T))= (ulonglong) (A)<br />
In my code, pbuf is a PBYTE pointed to
1 e1 f5 5 0 0 0 0
When I want to store the data into another buffer pdata, I did:
int8store(pdata, pbuf);
I got the dump of pdata becomes:
e0 2e 35 1 0 0 0 0
Anything wrong ??? It seems it's just doing casting and then setting A = B stuff. Why did the value has changed ?
|
|
|
|
|
#define int8store(T,A) *((ulonglong*)(T))=(ulonglong)(*(A)) (I think)
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
Need help from guru!
I need to pass a CList to another function.
When I just pass to CList* plist = &pTeacher;
it doesn't work! please help!
my Clist is like this,
CList<cteacher, cteacher=""> pTeacher;
// CTEACHER is a structure.
Thank for attention!
JW
|
|
|
|
|
This cannot possibly compile, as CList is missing the type of objects it should contain. Try declaring it like CList<CTEACHER> .
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
I will try, thanks!
JW
|
|
|
|
|
hi i'm having some problems in inserting a UNICODE string into a database.
always saves "??????". I'm trying to write some HINDI chars..
can someone help me??
thnx
|
|
|
|
|
Both the database and the GUI on top of it must support Unicode, and it sounds like the GUI does not. (When characters show up as ?, it means the app (or OS, during the paste) tried to convert the Unicode to ANSI, but the ANSI code page in use did not contain the character.)
--Mike--
Just released - RightClick-Encrypt v1.4 - Adds fast & easy file encryption to Explorer
My really out-of-date homepage
Sonork-100.19012 Acid_Helm
|
|
|
|
|
well that's why i'm sending the code:
here it is an example:
m_rs.m_teste = _T("Hello India \x0939\x093f\x0928\x094d\x0926\x093f");
if i do the same into a Unicode file it works..
|
|
|
|
|
Can someone please tell me how to use delay loading of DLLs? Specifically,
1. Do I need to do anything while building the DLL that I want to "delay-load"?
2. What do I need to do to my project settings so that it can delay load a particular dll?
3. Most importantly, do I need to change any of my existing code which calls the functions in the dll (the existing code was written to call the functions from a static lib)?
4. The reason I want to delay load is that I want to provide the user with an option to upgrade the software, hence the choice of DLLs and I don't want to insert numerous calls to LoadLibrary() and GetProcAddress() all over my code, hence delay loading. That will take just too long and I don't want to litter my code anyway, if there is an alternative. Did I get it right? Will delay loading let my existing (caller) code remain as it is, with maybe only a few changes to write a helper function and the likes? How do I use the helper function anyway? Do I need to call each function in the DLL through this function? In that case it is as bad as LoadLibrary() and GetProcAddress() . Is there any other way?
Thanks very much in advance.
PS: Yes, I tried to RTFM, but after going through the MSDN docs, I was as confused as before. Can someone explain all this to me in plain English?
Regards,
Rohit Sinha
|
|
|
|