|
You need to use the function that enumerate the window like your string...
The Funtion GetWindowText extract the complete name...
If you are asking if exists a function that enum window with title like a specific string, I need to say, I'm Sorry....
The only method is to enum all the window looking for the window that you want...
Regards...
Carlos Antollini.
Sonork ID 100.10529 cantollini
|
|
|
|
|
According to MSDN I am understanding that isDigit will recognise a number, but what if I want to find out that say char* abc = "1234.5678" is a number or not? THen if I'm stepping along the string checking each character, if I hit the decimal point, its not going to like that and it wil say its not a digit> so what can I use to figure out if my text is a double or float?
Appreciate your help,
ns
|
|
|
|
|
You can dig out using GetLocaleInfo, the regional versions of the decimal separator (and the thousands separator). You can then say if it's not a digit, is it one of those?
You might want to check out strtod (wcstod) as well.
Steve S
[This signature space available for rent]
|
|
|
|
|
Why can't you use atof (or the likes)?
If you want to parse the string yourself I'd check each char against a set of allowed characters (0-9, '.', ',') and break if an invalid character is met. You can check for multiple decimal points by setting a flag (a boolean) when the first '.' is met.
Of course, this would be dependent on the users choise of number representations. atof takes care of the locale-stuff for you.
Cheers
Steen.
"To claim that computer games influence children is ridiculous. If Pacman had influenced children born in the 80'ies we would see a lot of youngsters running around in dark rooms eating pills while listening to monotonous music"
|
|
|
|
|
simply modify your algorithm a smidge....
for each char in the string
{
if char is '.' then
{
if more than one '.' found
{
// invalid number format
}
else
{
// assumes '.' is decimal marker....other locales can use ','
continue
}
// note.... ',' could be valid too (but only to left of '.')
// note.... other locales will work differently here
}
else
if ( char is not digit )
{
// not a valid number....
}
}
Just trying to keep the forces of entropy at bay
|
|
|
|
|
atof would work, but it returns an ambiguous value of 0 if the text isnt numeric, and 0 if the text is 0....("0") as well. Besides, if its an int I'd have to use atoi and I dont know in advance which type it is. THe biggest problem is the ambiguity of the return value....
Appreciate your help,
ns
|
|
|
|
|
Yeah, I thought of that one too when looking atof i MSDN. Makes the function pretty useless, right?
Anyway, I'd still go for parsing the string myself, looking for digits, points and commas (used for thousand-separators), pluses and minuses. And other characters if you accept scientific representation. As someone suggested, get the characters used for decimal-point and thousand-delimiter from Windows, they can be set by the user individually.
I'd be happy to write you an example, but I'm out of time today.
Cheers
Steen.
"To claim that computer games influence children is ridiculous. If Pacman had influenced children born in the 80'ies we would see a lot of youngsters running around in dark rooms eating pills while listening to monotonous music"
|
|
|
|
|
I'm using MyStruct* f() like this:
if (f())
{
} MyStruct is an ordinary structure, containing basic types members.
If i modify the code above this way:
f();
f();
f();
if (f())
{
}
it doesn't crush but in the same place.
The error is about illegaly accessing 0x00000000 .
Do you know what should be wrong here?
rechi
|
|
|
|
|
Realy strange! How does the function f() look like?
Daniel
---------------------------
Never change a running system!
|
|
|
|
|
|
I'll show it but is a bit complicated. I wrote f in order to simplify the stuff. Look:
template<class V, class T>
T* StructFromVector(V *pvect,
string szName)
{
if (!pvect) return FALSE;
for (V::iterator it=pvect->begin();
it!=pvect->end(); it++)
if ((*it)->m_szName==szName)
return *it;
return NULL;
}
where string is the STL one and pvect will be a pointer to an STL vector containing pointers to some structures.
The real call looks like this:
if (!StructFromVector<RIGHTVECTOR2, RightStruct>(&(pUser->
m_vectRights), (char *)bstRight))
{
}
Please help!
If you can...
rechi
|
|
|
|
|
from you "Hungarian" I'd say bstRight is a bstr, can you really cast it to (char*)? And shouldn't you really cast it to a string ?
Cheers
Steen.
"To claim that computer games influence children is ridiculous. If Pacman had influenced children born in the 80'ies we would see a lot of youngsters running around in dark rooms eating pills while listening to monotonous music"
|
|
|
|
|
Steen Krogsgaard wrote:
bstRight is a bstr
Actually, is _bstr_t . But you're right, i could have cast it directly to string . Thanx for observation.
Unfortunatelly, it doesn't solve the crush problem...
rechi
|
|
|
|
|
I'm still not sure you can cast a _bstr_t to a string (at least not using an explicit cast), they have totally different binary representations, but then again, I'm no expert on either.
Anyway, how about stepping through your code, especially through the function, and find the offending line? I'm pretty sure it's not in the line calling the function, it must be somewhere within the function.
Cheers
Steen.
"To claim that computer games influence children is ridiculous. If Pacman had influenced children born in the 80'ies we would see a lot of youngsters running around in dark rooms eating pills while listening to monotonous music"
|
|
|
|
|
Steen Krogsgaard wrote:
how about stepping through your code
I did it before posting here.
I even stepped through the assembly lines; they look like this:
012DDBCF mov dword ptr [ebp-68h],eax
012DDBD2 cmp dword ptr [ebp-68h],0
012DDBD6 jne CRolesUsers2::UserHasRight+1C3h (012ddc53)
33: {
34: for (it=pUser->m_vectRoles.begin(); it!=pUser->m_vectRoles.
012DDBD8 mov ecx,dword ptr [ebp-1Ch]
It fails on jne when - very intersting! - tries to jump to 012DDBD8 and not to 012ddc53 .
rechi
|
|
|
|
|
Ooh, my asm is a little rusty! I don't get this - I assume 012DDBCF to 012DDBD6 is the asm for
if (!pvect) return FALSE
but from the asm it seems at it is testing the opposite: jne (jump not equal), that is if dword ptr[ebp-68h] != 0 - or am I remembering jne wrong?
Anyway, assuming the asm is right, the "jumping" to 012DDBD8 is because the test failed - that is, pvect != NULL. And the access violation comes as line 34 is executed. Try splitting the line into seperate statements (my stl is even worse than my asm, so this may not work):
V* vstart = pvect->begin();
V* vend = pvect->end();
for (V::iterator it= vstart; it!=vend; it++)
{
...blablabla
gotta go home now, see you tomorrow.
Cheers
Steen.
"To claim that computer games influence children is ridiculous. If Pacman had influenced children born in the 80'ies we would see a lot of youngsters running around in dark rooms eating pills while listening to monotonous music"
|
|
|
|
|
Steen Krogsgaard wrote:
my asm is a little rusty
And so is mine...
Steen Krogsgaard wrote:
I assume 012DDBCF to 012DDBD6 is the asm for...
I'm sorry, i have been confusing. It was about if (!StructFromVector<...>(...) . So, that assembling occurs after the function call ends!
Observation: it only crushes when i try to debug it. If i call it without debugging, everything seems ok but i have logical errors and got to end in the step by step hell.
rechi
|
|
|
|
|
This is about your program accessing random memory, so sometimes it will go right, sometimes wrong, so I wouldn't put too much into it only crashing when you debug it.
Anyway, if the program crashes after the template function returns there's two possibilites: your return value is garbage, or your parameters are garbage (or produced garbage during cleanup). I still very much suspect your (char*) cast - try moving it out of the if statement and see if the crash-point moves. I would copy/convert the _bstr_t to a string before the function call.
Cheers
Steen.
"To claim that computer games influence children is ridiculous. If Pacman had influenced children born in the 80'ies we would see a lot of youngsters running around in dark rooms eating pills while listening to monotonous music"
|
|
|
|
|
Just a hunch....
You are passing the function a BSTR. What BSTR class are you using? It coud be that you now have two objects pointing to the the same string. 1. The object in your vector and 2. The bstring container. When one goes out of scope it deletes the string. Then when the other goes out of scope it tries to delete or use the string which has just been deleted.
|
|
|
|
|
Ranjan Banerji wrote:
You are passing the function a BSTR
No, i'm passing a string . If you were right, i think it should have crushed on the first call. But if i call it without if (...)
it works ok and doesn't crush.
rechi
|
|
|
|
|
Bogdan Rechi wrote:
(char *)bstRight)
This is not safe, and maybe your problem. A NULL BSTR is often used to represent empty strings and std::string's == operator will generate an access violation on "if ((*it)->m_szName==szName)". Don't know if this is your problem, but soon will be
Use always (char *)_bstr_t(bstRight) or _com_util::ConvertBSTRToString(bstRight)
My latest articles:
XOR tricks for RAID data protection
Win32 process suspend/resume tool
|
|
|
|
|
Daniel Turini wrote:
Use always (char *)_bstr_t(bstRight)
I did. bstRight is _bstr_t ...
rechi
|
|
|
|
|
BSTR are wide chars. Unless you are compiling in UNICODE this is a very bad cast.
Check out WideCharToMultiByte to convert from WCHAR/BSTR to char
|
|
|
|
|
I used _bstr_t . It has a (char *) conversion operator. I've checked MSDN and it is not about UNICODE at all...
Please, correct me if i'm wrong.
rechi
|
|
|
|
|
If bstRight is no longer needed try doing:
if (!StructFromVector<rightvector2, rightstruct="">(&(pUser-> m_vectRights), (char *)bstRight.Detach() )){//...}
|
|
|
|