|
Hi all,
Im creating a .dll using ATL. Recently I have got to add the file operation part to it but as soon as I did it, it started to throw error saying :
" Drawing Assertion failed
Program : c:\windows........
File : fprintf.c
Line :55
Expression : (str!= NULL)
.................. "
This is the part of code which I'm using. It works well as far as I'll keep
fprintf(......);
statement away. But as soon as I included that its throwing error.
<br />
STDMETHODIMP CYourClass::YourATLMethod(BSTR Filepath, BSTR* ReturnString)<br />
{<br />
_bstr_t LbstrFilepath = Filepath;<br />
<br />
XMP_VersionInfo version;<br />
SXMPMeta::GetVersionInfo ( &version );<br />
FILE * sLogFile=fopen( "XMPLog.txt", "wb" ); ;<br />
fprintf ( sLogFile, "Version : %s\n" , version.message );
please guide me. where and why it is throwing error. What I'm supposed to get rid of this.
Regards,
Arun
|
|
|
|
|
Is sLogFile a valid file pointer? Per the assertion, it is NULL .
What type is version.message ?
"The largest fire starts but with the smallest spark." - David Crow
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
As per me yes it is. Is there something I need to takecare about that??? Its just a File pointer. Its creating empty file but while coming to "fprintf" it'll throw the error.
version.message is a string.
I have got lots of "fprintf" statement in the module and I checked with all of them one by one its throwing the same error as above.
I'm creatin .dll using ATL in VS 2005.
Regards,
Arun
|
|
|
|
|
agarunk wrote: version.message is a string.
Then you should probably be using the c_str() method.
"The largest fire starts but with the smallest spark." - David Crow
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
No I'm not making use of c_str().
Please let me know if it is required to take someother way to get this thing done. If possible with a sample piece of code.
Thanking you
Arun
|
|
|
|
|
The %s directive makes printf() and friends expect a string pointer on the stack. If you pass an object, such as std::string, you'll give it "garbage". If you give it a pointer to the internal string buffer instead, it'll work.
std::string str;
const char* pInternalBuffer = str.c_str();
printf("A string: %s\n", pInternalBuffer);
|
|
|
|
|
Thanks. I tried it but didnt solve the problem. I refered in some other atricles and I think it might happening because of default debugging output directory.
What do you think???
|
|
|
|
|
Have you tried:
fprintf(sLogFile, "Version : %s\n", version.message.c_str());
"The largest fire starts but with the smallest spark." - David Crow
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
Thanks. I tried that too but didn't work either.
|
|
|
|
|
The problem, as I mentioned here, is that the FILE* passed to fprintf() is NULL . That's what the assertion is telling you.
"The largest fire starts but with the smallest spark." - David Crow
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
But it is creating the file in the "fopen" statement.
Ok incase as you said if it is doing so then what is the solution for that. What I'm supposed to do on that case.
|
|
|
|
|
agarunk wrote: What I'm supposed to do on that case.
I'm out of ideas at this point. You might try setting a breakpoint on the fprintf() statement and verify the value of sLogFile .
"The largest fire starts but with the smallest spark." - David Crow
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
I'm writing dll and using it in C# so I cant put the break point. That is main problem to trace out.
|
|
|
|
|
At a minimum:
FILE *sLogFile = fopen("XMPLog.txt", "wb");
if (sLogFile != NULL)
{
fprintf(sLogFile, "Version : %s\n", version.message.c_str());
fclose(sLogFile);
}
else
MessageBox(...);
"The largest fire starts but with the smallest spark." - David Crow
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
I agree with David's suggestion. Passing C++ as a "optional" parameter yeilds undefined behaviour. With CStrings, you can do this, and I bet Microsoft engineers did some tweaking to make that work. I don't know about std::string, but chances are that they are not crafted in such a way that they will work with printf()-like functions...
--
100% natural. No superstitious additives.
|
|
|
|
|
Yes I agree with you, but what exactly I'm supposed to do now.
Please tell me if you are having some other alternatives or proper approach to tackle this. If possible with a sample piece of code.
(I'm getting error in "fprintf" part of file operation though "fopen" is working properly)
Thanks,
Arun
|
|
|
|
|
|
overide the WM_CTLCOLOR message and put the following code inside it
if( nCtlColor == CTLCOLOR_STATIC)
{
pDC->SetBkMode( TRANSPARENT );
}
this make the text backGround transparent.
To change the color use pDC->SetBkColor( RGB(0,255,0)); instead of SetBkMode
nave
|
|
|
|
|
Naveen R wrote: if( nCtlColor == CTLCOLOR_STATIC)
{
pDC->SetBkMode( TRANSPARENT );
}
Groupbox is not a static control but a button control with style BS_GROUPBOX .
Nibu thomas
A Developer
Programming tips[^] My site[^]
|
|
|
|
|
It's the button style, but its CTLCOLOR classification is CTLCOLOR_STATIC not CTLCOLOR_BTN
It seems that what naveen said was correct.
SaRath.
"It is your attitude, not your aptitude, that determines your altitude - Zig Ziglar."
My Blog | Understanding State Pattern in C++
|
|
|
|
|
SaRath C wrote: CTLCOLOR_STATIC not CTLCOLOR_BTN
whitesky
|
|
|
|
|
I created one static class for it
whitesky
|
|
|
|
|
WhiteSky wrote: I created one static class for it
just for changing the color?
nave
|
|
|
|
|
ah no?, write one class for mimimimilaw
whitesky
|
|
|
|
|
Try it creating a sample application...
I am sure my code will work....?
nave
|
|
|
|