|
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() )){//...}
|
|
|
|
|
Bogdan Rechi wrote:
I'm using MyStruct* f() like this:
Do you initalize it to NULL before doing anything with f ?
Rickard Andersson@Suza Computing
C# and C++ programmer from SWEDEN!
UIN: 50302279
E-Mail: nikado@pc.nu
Speciality: I love C#, ASP.NET and C++!
|
|
|
|
|
I have a multiline CEdit, and want to limit lines to being 80 char. Right now I'm planning on setting a fixed-width font, and defining the edit controls CRect to match.
Is this the only way, or can I set it to X characters somehow?
Thanks!!
BW
The only people for me are the mad ones, the ones who are mad to talk, mad to live, mad to be saved, desirous of everything at the same time, the ones who never yawn or say a commonplace thing, but burn, burn, burn like fabulous yellow roman candles exploding. - Jack Kerouac
|
|
|
|
|
I've got a multiline CEdit for code editing, and would like the first 6 characters to be colored, and not accessible. Can I do this inside a single edit control?
Thanks!
BW
The only people for me are the mad ones, the ones who are mad to talk, mad to live, mad to be saved, desirous of everything at the same time, the ones who never yawn or say a commonplace thing, but burn, burn, burn like fabulous yellow roman candles exploding. - Jack Kerouac
|
|
|
|
|
bool IsNumber( LPCTSTR pszText )
{
ASSERT_VALID_STRING( pszText );
for( int i = 0; i < lstrlen( pszText ); i++ )
if( !_istdigit( pszText[ i ] ) )
return false;
return true;
}
I read in MSDN that you can substitute a CString for an LPCTSTR, so thats one type. What if I have
char* abc = "hello"; . Can I do IsNumber(abc) on it? Or do I have to do something to make the char* an LPCTSTR?
Appreciate your help,
ns
|
|
|
|
|
Take a look in the MSDN:
LPCTSTR A 32-bit pointer to a constant character string that is portable for Unicode and DBCS.
So, if you use no UNICODE or DBCS you can!
Daniel
---------------------------
Never change a running system!
|
|
|
|
|
I just started reading Michael Dunns article on C++ strings on CP, so hopefully I'll be a little clearer about all these different types. Many thanks.
Appreciate your help,
ns
|
|
|
|
|
Hi guys, I'm trying to avoid cyclic dependencies in my code. How would I go about creating a global class, ie a class that can be queried and altered from all other classes in my code?
Thanks.
ASP.NET can never fail as working with it is like fitting bras to supermodels - it's one pleasure after the next - David Wulff
|
|
|
|
|
I'm a novice, and I don't know if this is the best solution or not (since I'm a novice I suppose not ).
I create an instance of one class in the application class and then I create a public function in the application class that returns a pointer to the class that I want to share, then I place an extern reference to the main class (app) and I can get the pointer...
steps:
0. Include the header file of the class that you want to share.
1. In your app. class create a pointer to the class that you want to share.
2. Create a member function in your app. class that return the pointer to the shared class.
3. where you want to use the shared class declare the app object as extern (see below)
4. use it...
<br />
extern CMyApp MyApp;<br />
<br />
<br />
<br />
<br />
<br />
MyApp.GetThePointerToTheClassThatIWantToShareFunction()->A;<br />
<br />
Hope this helps...
If not sorry, I'm a novice...
|
|
|
|
|
Hmm, thanks...I'll take a look. I'm not writing an MFC app by the way. (Noticed your class naming convention)
ASP.NET can never fail as working with it is like fitting bras to supermodels - it's one pleasure after the next - David Wulff
|
|
|
|
|
use a singleton pattern.
class MyClass
{
...
public:
static MyClass* Instance();
private:
static std::auto_ptr<MyClass> m_pInstance;
...
}
#include "myClass.h"
std::auto_ptr<MyClass> MyClass::m_pInstance;
MyClass* MyClass::Instance()
{
if(m_pInstance.get() == 0)
{
std::auto_ptr<MyClass> tmp(new MyClass);
m_pInstance = tmp;
}
return m_pInstance.get();
}
...
and somewhere else :
#include "myClass.h"
void somewhereElse::doSomething()
{
MyClass* pMyClass = MyClass::Instance();
...
}
Max.
|
|
|
|
|
Thanks!!
ASP.NET can never fail as working with it is like fitting bras to supermodels - it's one pleasure after the next - David Wulff
|
|
|
|