|
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
|
|
|
|
|
Hi people
I want to open files from the "Temporary Internet Folder"(read access). The problem is, the CFile open-Function does not open the file.
Are the files in this Folder special protected??
thanx
|
|
|
|
|
Just try to open the file with the CreateFile API function, with the GENERIC_READ and the FILE_SHARE_READ flag.
It is possible, that the file is opened by the system (Internet Explorer, etc.) without any FILE_SHARE_??? flag, so that you are not allowed to open the file!
Daniel
---------------------------
Never change a running system!
|
|
|
|
|
No, but the Temporary Internet Folder is a special in that the actual files are stored differently. There are subdirectories underneath it that the files are stored in. Take a look using a command prompt and you'll see what I mean.
Joel Lucsy (jjlucsy@concentric.net)
|
|
|
|
|
There are APIs for getting the filename of files in the IE cache. One is RetrieveUrlCacheEntryFile() - pass it the URL and the function will return the name of the cached copy, if there is one.
--Mike--
Just released - 1ClickPicGrabber - Grab & organize pictures from your favorite web pages, with 1 click!
My really out-of-date homepage
Sonork-100.19012 Acid_Helm
|
|
|
|
|
Still can't work, because of datatype casting.
suppose, I want to send two parameters, one is BYTE* m_pByte, the other, int m_nLen. Then, I use PostThreadMessage Like this,
<br />
::PostThreadMessage(m_threadID,WM_DATA_ARRIVAL,(WPARAM)m_pByte,(LPARAM)m_nLen);
Now I use GetMessage() to get the message (here is WM_DATA_ARRIVAL) as well as m_pByte and m_nLen,
<br />
...<br />
MSG msg;<br />
while(::GetMessage(&msg, NULL, 0,0))<br />
{<br />
switch(msg.message)<br />
{<br />
case WM_RXD_ARRIVAL:<br />
AfxMessageBox(msg.lParam);<br />
break;<br />
default:<br />
break;<br />
<br />
};<br />
};<br />
...
Extreme programming. Do the No.1
|
|
|
|