|
(I feel dumb this morning, really, really dumb; you have the right to giggle )
I'm trying to set the initial dir of a CFileDialog to an existing path.
if I do this it works; but the path is not hardcoded like that.
CString sInitialPath("c:\\max\\");
CFileDialog dlg( FALSE, NULL, "toto.ext");
dlg.GetOFN().lpstrInitialDir = sInitialDir;
The path is taken from an Edit Box.
CString sInitialPath;
m_EditBox.GetWindowText( sInitialPath );
CFileDialog dlg( FALSE, NULL, "toto.ext");
dlg.GetOFN().lpstrInitialDir = sInitialDir;
And this does not work because the string contains single backslash ( c:\max ) and letters will be "escaped" out of the string.
There must be a better way than manually add backslash to the string ?
Is there a default "cleanup" function that will do it ?
Thanks.
(again you can have a laugh.)
|
|
|
|
|
Off the top of my head you may want to try this:
sInitialPath.Replace(_T("\\"), _T("\\\\"));
Dustin
|
|
|
|
|
The above replacement make sense only whenever the string has to be read by the compiler.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
|
|
|
|
|
He wanted double slashes, I gave him double slashes. You don't actually expect me to consider the logic of my statements do you?;P
|
|
|
|
|
Dustin Henry wrote: You don't actually expect me to consider the logic of my statements do you?
ehm... No, of course!!!
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
|
|
|
|
|
Maximilien wrote: CString sInitialPath;
m_EditBox.GetWindowText( sInitialPath );
CFileDialog dlg( FALSE, NULL, "toto.ext");
dlg.GetOFN().lpstrInitialDir = sInitialDir;
Uhm, there's a mistake in the last line, you should do instead
dlg.GetOFN().lpstrInitialDir = sInitialPath;</code>
BTW in the meanwhile I'm trying the code...
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
|
|
|
|
|
As supposed, the following (yours, basically) code works fine on my system (dlg.m_ofn is there because I'm using VC6).
CString sInitialPath;
m_EditBox.GetWindowText( sInitialPath );
CFileDialog dlg( FALSE, NULL, "toto.ext");
dlg.m_ofn.lpstrInitialDir = sInitialPath;
dlg.DoModal();
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
|
|
|
|
|
Maximilien wrote: ...the string contains single backslash ( c:\max ) and letters will be "escaped" out of the string.
This is only the case with string literals.
"A good athlete is the result of a good and worthy opponent." - David Crow
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
that's strange, because escaping a backslash matters only in the source code... if the user enters in the edit box a path (which is for him compound of sigle slashes of course), that will behave as if you had written in your source code the path with '\\' characters...
and same in the debugger. it does display single slashes, but look at the ascii code of the characters, and you'll see that no way you need (and you musn't !!!) replace single slashes with double ones...
but i can't help you much, because i have no compiler with me at the moment...
|
|
|
|
|
toxcct wrote: that's strange, because escaping a backslash matters only in the source code... if the user enters in the edit box a path (which is for him compound of sigle slashes of course), that will behave as if you had written in your source code the path with '\\' characters...
Definitely true .
toxcct wrote: but i can't help you much, because i have no compiler with me at the moment...
I had it and made the attempt [^], [^].
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
|
|
|
|
|
|
Question about the 'this' pointer and properly returning a reference to an object.
I am learning about OOP and working through some examples. One of the examples has me overloading the *= operator.
<br />
CRegister& CRegister::operator *=(const CRegister &rhs)<br />
{<br />
this->m_dStore *= rhs.m_dStore;<br />
return *this;<br />
<br />
}<br />
I have two questions, why does an overloaded operator need to return a reference to the lvalue? Second if I did want to return the address of the lvalue shouldn't the code look like this?
<br />
CRegister& CRegister::operator *=(const CRegister &rhs)<br />
{<br />
this->m_dStore *= rhs.m_dStore;<br />
return &this;<br />
<br />
}
Or because 'this' is a pointer, by returning '&this' am I creating a second level of indirection, because i don't want the address of the 'this' pointer, but rather the address that the 'this' pointer points to?
Thanks guys,
Joe
|
|
|
|
|
TheDelChop wrote: why does an overloaded operator need to return a reference to the lvalue?
In fact an assignment operator (like *= ) must return a l-value .
TheDelChop wrote: Or because 'this' is a pointer, by returning '&this' am I creating a second level of indirection, because i don't want the address of the 'this' pointer, but rather the address that the 'this' pointer points to?
Your guess is right. this is a pointer to the object itself, *this is a reference to the object itself.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
|
|
|
|
|
CPallini wrote: TheDelChop wrote: why does an overloaded operator need to return a reference to the lvalue?
In fact an assignment operator (like *=) must return a l-value.
No, it doesn't. It can return anything or nothing. The only requirement is that it takes two arguments: if it's a global function (usually a friend function) two explicit arguments, at least one being a user defined type; if it's a member function the this pointer is the first implicit argument and the second must be explicitly supplied. In most common usages the return type is a reference to the class to which the operator belongs, but this is not a requirement.
Steve
|
|
|
|
|
Stephen Hewitt wrote: CPallini wrote:
TheDelChop wrote:
why does an overloaded operator need to return a reference to the lvalue?
In fact an assignment operator (like *=) must return a l-value.
No, it doesn't.
At least, it should (MSDN on assignment operator):
The operator returns the object to preserve the behavior of the assignment operator,which returns the value of the left side after the assignment is complete. This allows writing statements such as:
pt1 = pt2 = pt3;
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
|
|
|
|
|
CPallini wrote: The operator returns the object to preserve the behavior of the assignment operator,which returns the value of the left side after the assignment is complete. This allows writing statements such as:
pt1 = pt2 = pt3;
As I said – this is normally the case (returning a reference) – but not a requirement as you suggested.
Steve
|
|
|
|
|
When you declare a variable the & does not mean "address of" but rather "reference". ie
int i = 1;
int &ri = i;
ri = 2;
int *pInt = &i;
int &r2 = *pInt;
r2 = 3;
Steve
|
|
|
|
|
TheDelChop wrote: why does an overloaded operator need to return a reference to the lvalue?
So you can write chained assignments like x = y = z; If y=z doesn't return a reference to y , then the second assignment may not compile, or may call some other operator= that you weren't expecting.
|
|
|
|
|
Michael Dunn wrote: So you can write chained assignments like x = y = z; If y=z doesn't return a reference to y, then the second assignment may not compile, or may call some other operator= that you weren't expecting.
Nice, this is exactly the explanation I was looking for. Thank you very much Mike.
|
|
|
|
|
Hi,
I have a key, for that i need to change the permissions for admins to full control, system to full control and power usres to only have read access and all others should not have access.
i have written this code,RegSetRegisterKey API is executing correctly, but if i open the registry using regedit, and open the dialog box for permissions, it is not checking the check boxes for full control and read access.
How to make these check boxes to check for the respective permissions.
SID_IDENTIFIER_AUTHORITY securityid = SECURITY_NT_AUTHORITY;
PSID pAdministratorsSid = NULL;
PSID pSystemSid = NULL;
PSID pPowerusersSid = NULL;
SECURITY_DESCRIPTOR sd;
PACL pDacl = NULL;
DWORD dwAclSize;
HKEY hKey;
LONG lRetCode;
BOOL bSuccess = FALSE;
lRetCode = RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\\mykey"),
0,
WRITE_DAC,
&hKey
);
if(lRetCode != ERROR_SUCCESS) {
printf("RegOpenKeyEx error! (rc=%lu)\n", lRetCode);
return RTN_ERROR;
}
if(!AllocateAndInitializeSid(
&securityid,
2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0,
&pAdministratorsSid
)) goto cleanup;
AllocateAndInitializeSid(
&securityid,
1,
SECURITY_LOCAL_SYSTEM_RID,
0, 0, 0, 0, 0, 0, 0,
&pSystemSid
) ;
AllocateAndInitializeSid(
&securityid,
2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_POWER_USERS,
0, 0, 0, 0, 0, 0,
&pPowerusersSid
);
dwAclSize = sizeof(ACL) +
3 * ( sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD) ) +
GetLengthSid(pSystemSid)
+GetLengthSid(pAdministratorsSid)
+GetLengthSid(pPowerusersSid);
pDacl=(PACL)LocalAlloc(0,dwAclSize);
if(pDacl == NULL) goto cleanup;
if(!InitializeAcl(pDacl, dwAclSize, ACL_REVISION))
goto cleanup;
if(!AddAccessAllowedAce(
pDacl,
ACL_REVISION,
KEY_ALL_ACCESS,
pAdministratorsSid
)) goto cleanup;
AddAccessAllowedAce(
pDacl,
ACL_REVISION,
KEY_READ,
pPowerusersSid
) ;
AddAccessAllowedAce(
pDacl,
ACL_REVISION,
KEY_ALL_ACCESS,
pSystemSid
) ;
if(!InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION))
goto cleanup;
if(!SetSecurityDescriptorDacl(&sd, TRUE, pDacl, TRUE)) {
printf("SetSecurityDescriptorDacl error! (rc=%lu)\n",
GetLastError());
goto cleanup;
}
lRetCode = RegSetKeySecurity(
hKey,
(SECURITY_INFORMATION)DACL_SECURITY_INFORMATION,
&sd
);
if(lRetCode != ERROR_SUCCESS) {
printf("fail\n);
goto cleanup;
}
else printf("Success"); //i am getting success
bSuccess = TRUE; // indicate success
cleanup:
RegCloseKey(hKey);
RegCloseKey(HKEY_LOCAL_MACHINE);
if(pDacl != NULL)
HeapFree(GetProcessHeap(), 0, pDacl);
if(pSystemSid != NULL)
FreeSid(pSystemSid);
if(pAdministratorsSid != NULL)
FreeSid(pAdministratorsSid);
if(pPowerusersSid != NULL)
FreeSid(pPowerusersSid);
|
|
|
|
|
I want to get each node in a Tree in MFC.How to do?
|
|
|
|
|
What are talking about?
AFAIK MFC does NOT define a Tree class (There are, of course, CTreeView and CTreeCtrl ...)
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
|
|
|
|
|
I am saying about CTreeCtrl only.
|
|
|
|
|
If you want to traverse the whole thing then you have to go recursive.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
|
|
|
|
|
T.RATHA KRISHNAN wrote: I am saying about CTreeCtrl only
As suggested you need to use recursion, with help of CTreeCtrl class's functions. Have look at CTreeCtrl::GetNextItem,CTreeCtrl::GetChildItem,CTreeCtrl::GetNextSiblingItem .
Prasad
MS MVP - VC++
|
|
|
|
|