|
john5632 wrote: I am using CRichCtrl for displaying text. I have data in columns.
Wouldn't a grid or list control be better suited for this?
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"Some people are making such thorough preparation for rainy days that they aren't enjoying today's sunshine." - William Feather
|
|
|
|
|
Hi All,
I have two project one in mfc and othe in Win32
from MFC project i create on .cpp file that used in win32 API application
so i want to execute MFC application first and on the click of OK i want to execute WIN32 API application
|
|
|
|
|
Ok. But where are you stuck??
Every new day is another chance to change your life.
|
|
|
|
|
Thanks for reply becouse for lots of trial i get first reply
now my problem is strait forward
i have two application on depend on another
like
i have mfc application for user selection to generate some data to create .cpp file
now this .cpp file used by WIN32 API project to create a Win32 api exe my second project.
my concern only with win32 exe not with MFC exe so
i want to execute win32 exe after mfc application selection complete
|
|
|
|
|
Coder Block wrote: i want to execute win32 exe after mfc application selection complete
Yes but again, what is your problem? You want to do something after some other event, so add some code to your MFC app to start the second app at the appropriate time.
|
|
|
|
|
Coder Block wrote: so i want to execute MFC application first and on the click of OK i want to execute WIN32 API application So have you tried using ShellExecute() or CreateProcess() ?
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"Some people are making such thorough preparation for rainy days that they aren't enjoying today's sunshine." - William Feather
|
|
|
|
|
Your question is not clear, those two should work fine side by side and interchangeably. MFC is based around the Win32 API, although you can't call MFC directly in a pure Win32 application without including the necessary libraries and linking the associated compiled MFC libraries.
|
|
|
|
|
Hi,
I would like to convert this function from C to C++.I attempted the conversion below, but not sure if I got it correctly.
- note: debugger would crash at msg[i] = nul in the c-like code.
-I also have the feeling this function can be written in 2 lines with strings!
Thanks
#define NUL 0
char z_buf[4095]
void replace_html_delimiters(char *msg)
{
for(i=0; ; i++)
{
if(msg[i]== NUL)
break;
if(msg[i]=='<')
{
msg[i] = NUL;
strcpy(z_buf,msg);
strcat(z_buf,"<");
strcat(z_buf,msg+i+1); strcpy(msg,z_buf);
}
}
}
//C++
<pre lang="c++">
#define NUL 0
char z_buf[4095]
void replace_html_delimiters(string msg)
{
for(i=0; ; i++) //Why no upper limit here?
{
if(msg[i]== NUL)
break;
if(msg[i]=='<')
{
msg[i] = NUL;
strcpy(z_buf,msg.c_str());
z_buf += "<";
strcat(z_buf,msg.rightOf[i]);
strcpy(msg,z_buf);
}
}
}</pre>
modified on Wednesday, September 14, 2011 2:30 PM
|
|
|
|
|
You could do it like this:
string replace_html_delimiters(string msg)
{
for(int i=0;msg[i];i++)
if(msg[i] == '<')
msg.replace(i,1,"<",0,4);
return msg;
}
The msg[i] == NUL has been moved to the for-loop and the replace[^] function is used for replacing '<'-characters with & l t ;.
Note that unlike with a char array, a string will not be modified when passed to a function like this. I solved this by returning the output string, but you could also convert your function to accept a string pointer as argument.
modified 13-Sep-18 21:01pm.
|
|
|
|
|
Great, I think this is what I needed. I ma not sure about the for(int i=0;msg[i];i++)
as a terminating condition. Did you mean to put something else instead of msg[i]?
|
|
|
|
|
when msg[i] = 0, the loop will stop. ('false' = 0, in C/C++)
|
|
|
|
|
for(int i=0;msg[i]=0;i++) crashes.
for(int i=0;msg[i] !=' ';i++) seems to be okay.
|
|
|
|
|
Software2007 wrote: for(int i=0;msg[i]=0;i++) crashes.
msg[i]=0 is an assignment. (sorry, i wasn't speaking C, when i typed it, in my comment above)
'msg[i]' in a conditional is equivalent to 'msg[i]!=0'
|
|
|
|
|
Sorry, but I am a bit confused.
I am on C++ compiler now, and both of the following crash.
for(int i=0;msg[i]=0;i++) //I understand this is no good, it's an assignment
for(int i=0;msg[i]!=0;i++)//but shouldn't this work?
"Expression string out of range"
|
|
|
|
|
Software2007 wrote: but shouldn't this work?
yes, it should.
what's the value of i when it crashes ? and how long is the string?
|
|
|
|
|
I send in a string "<title>Test";
19 characters long.
The loop crashes at index 25
for(int i=0;msg[i];i++)
{
if(msg[i] == '<')
msg.replace(i,1,"<",0,4);
}
The string actually becomes 25 characters after replacing '<' with //"<", so the very last iteration, it increments i to 25, it tries to check the condition msg[25], I believe it crashes since the string is only 24 chars long ?
modified on Wednesday, September 14, 2011 4:09 PM
|
|
|
|
|
Software2007 wrote: The loop crashes at index 25
How are you calling replace_html_delimiters() ?
Software2007 wrote: msg.replace(i,1,"<",0,4);
Crashing aside, why are you replacing < with the string equivalent? Wouldn't a simple msg[i] = '<'; suffice?
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"Some people are making such thorough preparation for rainy days that they aren't enjoying today's sunshine." - William Feather
|
|
|
|
|
I am trying to replace the C code in my original post. Unfortuantely, CodeProject keeps replacing my "& l t ;" with "<". I had to put spaces just now to display it, but in the code, there is no space between the 4 letters.
|
|
|
|
|
this works for me:
#include <string>
void repl(std::string &msg)
{
for(int i=0;msg[i];i++)
{
if(msg[i] == '<')
msg.replace(i,1,"<",0,4);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
std::string f = "<title>blah</title>";
repl(f);
return 0;
}
|
|
|
|
|
The same code you showed me crashes at index 25! I am running just simple console app in VS2010.
It works on VS2008! Oh well!
Thanks for your help
modified on Wednesday, September 14, 2011 4:31 PM
|
|
|
|
|
how about a generic std::string find/replace fn:
void repl2(std::string &str, const char *find, const char *repl)
{
size_t findLen = strlen(find);
size_t replLen = strlen(repl);
size_t index = 0;
while (true) {
index = str.find(find, index);
if (index == std::string::npos) break;
str.replace(index, findLen, repl);
index+=replLen;
}
}
that's based on something from this thread[^].
|
|
|
|
|
It is my understanding that std::string does *NOT* include a NULL ('\0') character at the end of the string. One cannot assume a null termination.
So, basically you are using C style assumptions on C++ string objects. The way to deal with std::string is through the member functions string.length(), string.replace(), etc.
The examples others have shown you work because they stay within the object's definition of operative functions.
There is a string.c_str() member function that returns a pointer to a C style null terminated char * (http://www.cplusplus.com/reference/string/string/c_str/[^]) but that too cannot be modified by the receiving program.
If you're going to convert from C to C++, you should go all the way and avoid those old char * uses and move to some string class, either std::string or MFC/ATL CString, depending on your project's needs.
|
|
|
|
|
for (int i=0; msg[i]; i++) is equivalent to:
for (int i=0; msg[i]!=0; i++)
The end condition is the character at msg[i] being the null at the end of the string.
The compiler didn't like msg[i]=0 because that's an assignment, not an equality test. Need another '=' in there.
|
|
|
|
|
Well, I'm not even sure the straight C code works.
'msg' is a 'char *', meaning it points to a string of characters owned by the caller of the function. Presumably that string is in some buffer allocated by the caller.
When you complete the replace using the temporary 'z_buf' buffer (presumably large enough, but assume it is), you them move the new (possibly longer) string back into the buffer pointed to by 'msg'.
How do you know you aren't overwriting that buffer? How do you know it's large enough to receive the replaced string? I'm just saying, you could be clobbering something important.
|
|
|
|
|
In the C++ example, just what does
strcpy(msg,z_buf); do to the string object? Assuming it compiles, are you clobbering the object?
I don't use the std:: classes much, but if this were MFC/ATL CString, the strcpy argument would use a typecasting to get a pointer to the internal buffer of CString (char *) which you are *NEVER ALLOWED TO OVERWRITE*. Yet the strcpy() call does exactly that.
I would imagine that std::string has a similar internal structure and would be very upset if you started overwriting its content.
|
|
|
|