Std::string loadstring???
-
Hi, Not sure who gave me a one vote... but the solution I presented is a secure and safe method for loading a std::string from a resource. The method presented by Aescleal will fail for a string greater than the 4096 constant. The wstring solution presented by Stephen Hewitt just flat out doesn't work for std::string Best Wishes, -David Delaune
It does for a
wstring
(which was all it was intended to, it wasn't a reply to the OP but to Aescleal). It's documented. MSDN (onLoadString
):nBufferMax [in] int The size of the buffer, in characters. The string is truncated and null-terminated if it is longer than the number of characters specified. If this parameter is 0, then lpBuffer receives a read-only pointer to the resource itself.
Secondly, I tried it (after reading the documentation thoroughly first) and verified that it did work. Finally, your technique will not work.
LoadResource
returns nothing thatLoadString
can consume.Steve
-
I'm not positive, but it doesn't seem to. Note that the documentation says it returns a pointer to the raw resource and string resources are always Unicode, so perhaps this is a reason. In fact, in the ANSI case
0xFFFFffff
was returned to indicate an error (when 0 is passed as the buffer size), which isn't mentioned in the documentation.Steve
-
Hi, Not sure who gave me a one vote... but the solution I presented is a secure and safe method for loading a std::string from a resource. The method presented by Aescleal will fail for a string greater than the 4096 constant. The wstring solution presented by Stephen Hewitt just flat out doesn't work for std::string Best Wishes, -David Delaune
I didn't give you a 1 vote but the method I outlined will work for strings greater than 4096 characters, it just won't load the whole string. If you're really worried about that you have to use the OS/2 vintage "try it once to fail, once to succeed" method of sizing buffers. And it'd be fairly easy to change Stephen's method to work for std::string - depending on how much you know about the resource and the characters in it it's either trivial (use the two iterator string constructor) or slightly harder (use wcstombs). Ash
-
It does for a
wstring
(which was all it was intended to, it wasn't a reply to the OP but to Aescleal). It's documented. MSDN (onLoadString
):nBufferMax [in] int The size of the buffer, in characters. The string is truncated and null-terminated if it is longer than the number of characters specified. If this parameter is 0, then lpBuffer receives a read-only pointer to the resource itself.
Secondly, I tried it (after reading the documentation thoroughly first) and verified that it did work. Finally, your technique will not work.
LoadResource
returns nothing thatLoadString
can consume.Steve
Stephen Hewitt wrote:
Finally, your technique will not work. LoadResource returns nothing that LoadString can consume.
Hi Stephen, You may be correct. I was thinking that you could just do something like this:
HRSRC hres = FindResource(NULL, MAKEINTRESOURCE(IDS_SOMESTRING), RT_STRING); DWORD dwSizeRes = SizeofResource(NULL,hres); char *p = NULL; int result = LoadString((HINSTANCE)&__ImageBase,AFX_IDS_APP_TITLE,p,0); std::string s(p,dwSizeRes);
Which is not much different than what you posted. With the method that you posted...I am thinking that the std::string would need a NULL terminator in the string resource. I admit that I have not tried either method (including the one I just typed above). I will test both methods later when I get some free time. Best Wishes, -David Delaune
-
It does for a
wstring
(which was all it was intended to, it wasn't a reply to the OP but to Aescleal). It's documented. MSDN (onLoadString
):nBufferMax [in] int The size of the buffer, in characters. The string is truncated and null-terminated if it is longer than the number of characters specified. If this parameter is 0, then lpBuffer receives a read-only pointer to the resource itself.
Secondly, I tried it (after reading the documentation thoroughly first) and verified that it did work. Finally, your technique will not work.
LoadResource
returns nothing thatLoadString
can consume.Steve
Hey Steve :) I just spent 30 minutes testing both of our code samples. I could not get the code you wrote working for std::string probably because the resource strings are actually stored in Unicode within the PE files. However for wstrings your code is absolutely perfect. I suspect... that the brilliant code you posted could be actually be modified to utilize wcstombs and work for both ANSI and Unicode builds. As for my code sample... I had even less success although I was eventually able to get it working. I had to re-read some of the MSDN docs and ended up using FindResourceEx with the language identifier. To make things worse the address I was recieving was the start of the string resource block. I had to load the string block into an HGLOBAL and walk the string table before I could even read the string. :doh: Anyway I just wanted to let you know that you were correct. :) Best Wishes, -David Delaune
-
Hi, CString sz; sz.LoadString( HINSATANCE hin,UINT id); How to achieve the above thing by using std::string instead of cstring??? Thanx.
See my answer including Stephen Hewitt contribution at http://www.codeproject.com/Tips/86496/Load-a-Windows-string-resource-into-a-std-string-o.aspx[^] cheers, AR
When the wise (person) points at the moon the fool looks at the finger (Chinese proverb)
-
Hey Steve :) I just spent 30 minutes testing both of our code samples. I could not get the code you wrote working for std::string probably because the resource strings are actually stored in Unicode within the PE files. However for wstrings your code is absolutely perfect. I suspect... that the brilliant code you posted could be actually be modified to utilize wcstombs and work for both ANSI and Unicode builds. As for my code sample... I had even less success although I was eventually able to get it working. I had to re-read some of the MSDN docs and ended up using FindResourceEx with the language identifier. To make things worse the address I was recieving was the start of the string resource block. I had to load the string block into an HGLOBAL and walk the string table before I could even read the string. :doh: Anyway I just wanted to let you know that you were correct. :) Best Wishes, -David Delaune
Thanks.
Steve
-
See my answer including Stephen Hewitt contribution at http://www.codeproject.com/Tips/86496/Load-a-Windows-string-resource-into-a-std-string-o.aspx[^] cheers, AR
When the wise (person) points at the moon the fool looks at the finger (Chinese proverb)
-
gmallax wrote:
Very nice and useful
Then please upvote. Thanks, AR
When the wise (person) points at the moon the fool looks at the finger (Chinese proverb)
-
See my answer including Stephen Hewitt contribution at http://www.codeproject.com/Tips/86496/Load-a-Windows-string-resource-into-a-std-string-o.aspx[^] cheers, AR
When the wise (person) points at the moon the fool looks at the finger (Chinese proverb)
-
It is released at the next
}
ReturnType SomeClass::SomeFunction(SomeParams)
{
char buffer[1024] = {0}; // this a stack allocation
// any code ...
return ReturnType::SomeValue;
} // buffer is deallocated herecheers, AR
When the wise (person) points at the moon the fool looks at the finger (Chinese proverb)