|
There are several ways to make the two processes communicate. The way you depicted is actually feasible, just use the strtoul[^] function to convert the string.
Another simple way would be using the RegisterWindowMessage[^] mechanism.
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.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
Nitheesh George wrote: So I need to pass the main window handle of the launcher application to my second application like /CallingProgramWindow="0001009C". Then how can i convert the string back to window handle. And is this method is the right way to do this.?
Unlikely.
What exactly do you want to do with the handle in the second app?
In general you solve the problem like this.
1. Target app runs
2. Target app gets to point X in app and this is considered 'succcess'
3. Target app 'sends' result to host application.
Step 2 is defined by your application.
There are several ways to do 3, such as stdio or sockets. However if you just need to know if the target ran and the host ran it then the process of actually running it would tell you that.
|
|
|
|
|
Nitheesh George wrote: So I need to pass the main window handle of the launcher application to my second application
Interprocess COmmunication[^]
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
I'm in a situation like this:
while(1){
...
recvfrom(sock, buffer, buffSize, 0, (struct sockaddr *) &ClntAddr, &clientLen);
sendto(socket, buffer, Size, 0, (struct sockaddr *) &ClntAddr, sizeof(ClntAddr);
...
}
When I call the sendto if for some reason the host is not reachable, then the next call to recvfrom () fails with error 10054 ICMP Port Unreachable. How can I avoid to capture this kind of messages, and continue to process other datagram-requests from clients?
|
|
|
|
|
|
I have a class kind of like this.
class handle
{
int m_i ;
template< typenmae T >
T* operator->()
{
if( m_i == 1 )
return new classA ;
else if( m_i == 2 )
return new classB ;
}
} ;
The problem is the compiler has no way to infer which version of the ->() function to use( produce ). But if I use something like handle<classA>->();that breaks the C++ convention. So how can I solve this kind of problem?
|
|
|
|
|
I think your return value should be the same as your typename, i.e. something like:
return new T;
Some more information can be found in MSDN here[^].
The best things in life are not things.
|
|
|
|
|
Design looks broken to me.
That can only work if classA/B are derived from T.
And as such handle<parent> would work.
If not then you have code that at best is fragile and at worst is wrong.
Other than that if you need a factory then you should probably just use one.
|
|
|
|
|
As jschell said, the only way this would even work is if you make sure that classA and classB are derived from T, otherwise the return type is wrong.
Calling the 'right' operator is only possible for the compiler if it can derive the type from the function call, either by analyzing the arguments, or by explicitely stating the type. Without arguments, you have to do the latter, and that is only possible by using the full operator name like this:
handle h;
classA* a = h::operator-> <classA> ();
That said, there are multiple design mistakes:
1. When you overload an operator, anyone taking advantage of this operator will implicitely assume that it behaves similarly as the same operator for does for other objects. In case of operator->() , the standard behaviour is 'dereferencing', i. e. delivering a reference to on object that is encapsulated within the original object. Basically, what you did is like calling a function 'add', when in truth it performs a multiplication.
2. You should always strive to indicate when a function returns an object that is created on the heap, and thus needs to be properly deallocated again. Otherwise there is a high risk that anyone else who'll work with your class in the future will forget to delete the allocated resources later. Function names like 'CreateXY', or 'Copy', indicate that a new object is being created, and you need to take care to destroy it. The dereferencing operator is usually interpreted more as a 'Get' function, indicating that its resource management is handled by someone else.
3. There's no point at all in overloading an operator, when you always have to write it explicitely to be able to invoke it. Use an explicit, normal function name instead!
4. Your class handle serves in some way as an interface to a limited number of specific classes. Unless these classes may or should be mixed up within a single handle object, it's probably a good idea to make this a template class. This would also eliminate your problem, and the need for the type indicator m_i
template <class T>
class handle {
T* operator->() {
return new T;
}
};
class classA {
public:
doWork();
};
handle<classA> hA;
hA->doWork();
classA* a = hA.operator->();
a->doWork();
delete a;
I suspect that you wanted to write something like hA->doWork(); , but in doing so you'd produce a memory leak. The only way to avoid that leak would be storing the reference, but that requires calling the full operator name, negating any advantages that you might have hoped to gain from overloading an operator in the first place. If I am correct, then what you need is not a handle, but a class hierarchy with virtual functions.
|
|
|
|
|
#include <string>
#include <iostream>
using namespace std;
void Print(const string& value)
{
cout << value << endl;
}
void PrintBy (const string& value, void (*printer)(const string& value))
{
printer(value);
}
class Printer
{
public:
void Print(const string& value)
{
cout << value << endl;
}
};
int main()
{
string s = "hi";
Print(s);
// why this work?
PrintBy(s, &Print);
// but this does not work!?
Printer p;
PrintBy(s, &p.Print);
return 0;
}
|
|
|
|
|
What exactly is the problem?
"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
|
|
|
|
|
he did label the problem, look for the comments ('//')
|
|
|
|
|
"but this does not work!?" is not a useful problem description. It could be a compiler or linker problem. It could be an assertion. It could be an exception. It could be a logic problem.
"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
|
|
|
|
|
It is if you look at the difference between his two statements
|
|
|
|
|
|
good link! ...you may be right, I didn't think about the address being different for non-statics.
|
|
|
|
|
What do you mean by "it does not work"?... The code as written just does not compile for a simple reason: Your second call to PrintBy does not match the signature of the called function. You either declare a second overload for PrintBy taking a proper pointer-to-method of Printer or (much better) you rely on standard library abilities:
#include <string>
#include <functional>
template < typename TPrinter >
void PrintBy( std::string const & pString, TPrinter pPrinter )
{
pPrinter(pString);
}
int main()
{
::PrintBy( "hi", Print );
::Printer p;
::PrintBy( "hi again", std::bind( &::Printer::Print, &p, std::placeholders::_1 ) );
}
|
|
|
|
|
Hello , could you please help me with this ?
I have wrote the following code which open a file ( binary file )
Search for bytes sequence and return the position at first occurs ,
It's work in some cases , like if file fill's with Zero's and my searched bytes only !
and it's give me headache !
Here is my code :
int main()
{
unsigned int data[6] = {
0x11, 0x22, 0x33, 0x44, 0x55, 0x66
};
cout << "pos : " << FindBytes(data , 6 , "c:\\test.a") << endl;
return 0;
}
The Function :
int FindBytes ( unsigned int data [], int datalength, char *filename )
{
FILE *file;
file = fopen(filename, "r");
int pos = 0;
int length = datalength - 1;
int ch;
int cpos = 0;
do
{
ch = getc(file);
if(ch == data[0])
{
pos += length - 1;
fseek(file , pos , SEEK_SET);
ch = getc(file);
if(ch == data[length])
{
for(int i = 0;i <= length;i++)
{
cpos = pos - length + i;
fseek(file, cpos, SEEK_SET);
ch = getc(file);
if(ch != data[i])
{
fseek(file , cpos, SEEK_SET);
goto resume;
}
}
return pos - length;
}
}
else
{
resume:
fseek(file, pos, SEEK_SET);
}
pos++;
}
while ( ch != EOF );
return -1;
}
thank you ,
|
|
|
|
|
This isn't great code, first off, if you're comparing bytes, why use unsigned int to store your target array? Use char, or BYTE, or something similar (that's 8 bits)... now the other question is if you're looking for specific bytes, why open the file in text mode? ...and finally, you can probably do without the goto statement... as for your question, what do you want help with, what doesn't work or what is the error?
This doesn't look like its what you want:
pos += length - 1;
fseek(file , pos , SEEK_SET);
What you're doing there is if you find the first byte matches then you offset by some number of bytes? What if the first byte of the file matches your first byte? You won't even compare the next four bytes since you're offsetting right off the back.
|
|
|
|
|
Thank you sir ,
I know it's look bad , I am not a c++ Programer , I know a little bit about c++ ,
I am C# one , so I copy code from here and there , to achieve my goal
The Error is : some times the function never find my bytes , I think it's the EOF ,
so I replaced the While (EOF) things with FOR . and it'w work
Albert Holguin wrote: This isn't great code, first off, if you're comparing bytes, why use unsigned int to store your target array? Use char, or BYTE, or something similar (that's 8 bits)... now the other question is if you're looking for specific bytes, why open the file in text mode? ...and finally, you can probably do without the goto statement... as for your question, what do you want help with, what doesn't work or what is the error?
I did as you said ,
int FindBytes ( unsigned char data [], int datalength, char *filename )
{
int sz = GetszFile(filename);
FILE *file;
file = fopen(filename, "rb");
int pos = 0;
int length = datalength - 1;
char ch;
int cpos = 0;
for (int ic = 0;ic < sz; ic++)
{
ch = getc(file);
if(ch == data[0])
{
pos += length - 1;
fseek(file , pos , SEEK_SET);
ch = getc(file);
if(ch == data[length])
{
for(int i = 0;i <= length;i++)
{
cpos = pos - length + i;
fseek(file, cpos, SEEK_SET);
ch = getc(file);
if(ch != data[i])
{
fseek(file , cpos, SEEK_SET);
goto resume;
}
}
return pos - length;
}
}
else
{
resume:
fseek(file, pos, SEEK_SET);
}
pos++;
}
return pos;
}
I still want to find a good function to search bytes in binary file
But this one , is worked !
|
|
|
|
|
Smart Arab wrote:
I still want to find a good function to search bytes in binary file
One thing I'd try is the Boyer-Moore search algorithm. I don't know if it'd be any better given the amount of file I/O involved, but it would be worth it to find out.
"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
|
|
|
|
|
If the size of the sequence is fixed, a better solution would be a state machine (this would also only find the first occurance of the byte sequence, but you can put it in a function and find all occurrences of the sequence)...
bool found = false;
int m_State = 1, origin = 0;
while((ch = getc(file) != EOF) && (!found))
{
switch(m_State)
{
case 1:
if(ch == data[0]){
origin = ftell(file)- 1;
m_State = 2;
}
break;
case 2:
if(ch == data[1])
m_State = 3;
else m_State = 1;
break;
case 3:
if(ch == data[2])
m_State = 4;
else m_State =1;
break;
case 4:
if(ch == data[3])
found = true;
else m_State = 1;
break;
}
}
modified on Friday, May 20, 2011 4:15 PM
|
|
|
|
|
I'm using Visual Studio 2005 C++.
I want to update the controls on a form from within a function. The function is in a seperate file from the main form so the function can not "see" the memebers of the form.
Do I have to pass the form to the function? The form controls seem to be "private" to the main form so I dont know if it will allow them to be changed from another function.
Can someone give me some guidance on this, or a sample function call would be great.
Thanks.
|
|
|
|
|
Figured it out....
You need to go to the Class View, right click on your Form, Add New Function then choose the file that you want to add the function to. Make sure that the file you add the function to is #included into the project. Make sure the file you add the function to has #include "stdafx.h" as the first line of the file.
|
|
|
|
|
Hi All,
I have declared a pointer type variable of DWORD type in CFormView type class.
I am allocating memory using new DWORD[ records ].
And I am freeing the memory in the destructor using delete[].
But I am getting mfc exception
damage after normal block( #24094)at hex address.
Can any body give me reason why I am getting that exception?
I am not able to trace the problem.
Please help me.
|
|
|
|
|