|
My guess...
I know unix & windows use /\ delimiters. I *assumed* the ftp protocol demands the / version (linux was around for a while before...). Maybe IIS is being thick?
Could you not do:
if (!ftpupdate::ftp_setServerDirectory((char*)setSvrSdir)
{
SwapSlashes (setSvrSdir);
ftpupdate::ftp_setServerDirectory((char*)setSvrSdir);
}
One more thing...
Why are you casting setSrvDir to char *? If its not already a character pointer, might it be unicode? or some other thing? This may be a non-issue, but it raises small alarms...
Iain.
|
|
|
|
|
Thanks for the info Iain.
Iain Clarke wrote: Why are you casting setSrvDir to char *? If its not already a character pointer, might it be unicode? or some other thing? This may be a non-issue, but it raises small alarms...
Why is that, I'm only type casting a char to a char*
Thanks again
Regards,
The only programmers that are better that C programmers are those who code in 1's and 0's
Programm3r
My Blog: ^_^
|
|
|
|
|
Hi,
I have a folder that is locked by a process in Windows.
How do I unlock the folder without killing the process??
Thanks,
Indra
|
|
|
|
|
In general you don't: what good would locking a file be if it was simply to unlock it? Everyone would simply blow away all locks before opening a file making locking useless!
Steve
|
|
|
|
|
It's not a file that I want to delete but a folder.
And the folder is empty, there are no files in it.
It has been locked uselessly by a process.
I wish to close all handles of the process that has locked this folder.
Without termintaing the process.
Please let me know if there are ways to do it.
I came across a utillity from the net that does just that, but I need the code so that the same thing can be done from our application.
|
|
|
|
|
indra20 wrote: I came across a utillity from the net that does just that, but I need the code so that the same thing can be done from our application.
Does this utility accept command-line arguments?
"A good athlete is the result of a good and worthy opponent." - David Crow
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
DavidCrow wrote: Does this utility accept command-line arguments?
No. The utility is called the Unlocker.
After installation it gets integrated with the windows explorer.
Please refer to the follwing link for more details:
http://ccollomb.free.fr/unlocker/[^]
Regards,
Indrajit
|
|
|
|
|
If I have in my class attribute these...
<br />
string m_strConfigFileName;<br />
ifstream m_oConfigFile;<br />
multimap<string, string> m_oApplicationConfig;<br />
What should I do in destructor? I'm getting this error "User breakpoint called from code at 0x7c901230". Stack trace:
<br />
NTDLL! 7c901230()<br />
NTDLL! 7c96cd80()<br />
NTDLL! 7c960af8()<br />
KERNEL32! 7c85e9cf()<br />
_CrtIsValidHeapPointer(const void * 0x004433a8) line 1697<br />
_free_dbg_lk(void * 0x004433a8, int 1) line 1044 + 9 bytes<br />
_free_dbg(void * 0x004433a8, int 1) line 1001 + 13 bytes<br />
free(void * 0x004433a8) line 956 + 11 bytes<br />
operator delete(void * 0x004433a8) line 7 + 9 bytes<br />
std::allocator<char>::deallocate(void * 0x004433a8, unsigned int 33) line 64 + 38 bytes<br />
std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Tidy(unsigned char 1) line 592<br />
std::basic_string<char,std::char_traits<char>,std::allocator<char> >::~basic_string<char,std::char_traits<char>,std::allocator<char> >() line 59 + 39 bytes<br />
CSomeClass::~CSomeClass() line 16 + 51 bytes<br />
Thanks!
|
|
|
|
|
devvvy wrote: string m_strConfigFileName;
devvvy wrote: std::basic_string,std::allocator >::~basic_string,std::allocator >() line 59 + 39 bytes
CSomeClass::~CSomeClass() line 16 + 51 bytes
Try:
strConfigFileName.clear(); in the destructor.
Maxwell Chen
|
|
|
|
|
Thanks very much.
I added these to destructor (Apparently VC6/M$ didn't implement string::clear() method):
<br />
CSomeClass::~CSomeClass()<br />
{<br />
m_strConfigFileName.~basic_string(); << Crashed here!<br />
m_oApplicationConfig.clear();<br />
<br />
return;<br />
}
Exact same error
<br />
NTDLL! 7c901230()<br />
NTDLL! 7c96cd80()<br />
NTDLL! 7c960af8()<br />
KERNEL32! 7c85e9cf()<br />
_CrtIsValidHeapPointer(const void * 0x00443380) line 1697<br />
_free_dbg_lk(void * 0x00443380, int 1) line 1044 + 9 bytes<br />
_free_dbg(void * 0x00443380, int 1) line 1001 + 13 bytes<br />
free(void * 0x00443380) line 956 + 11 bytes<br />
operator delete(void * 0x00443380) line 7 + 9 bytes<br />
std::allocator<char>::deallocate(void * 0x00443380, unsigned int 33) line 64 + 38 bytes<br />
std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Tidy(unsigned char 1) line 592<br />
std::basic_string<char,std::char_traits<char>,std::allocator<char> >::~basic_string<char,std::char_traits<char>,std::allocator<char> >() line 59 + 39 bytes<br />
std::basic_string<char,std::char_traits<char>,std::allocator<char> >::`scalar deleting destructor'(unsigned int 0) + 37 bytes<br />
CSomeClass::~CSomeClass() line 14<br />
|
|
|
|
|
devvvy wrote: m_strConfigFileName.~basic_string(); << Crashed here!
Never call the destructor by yourself!
Maxwell Chen
|
|
|
|
|
Never say never: in some situations it is necessary. Some STL containers do for example. In this case you are correct however: "m_strConfigFileName"'s destructor is getting called twice which is causing a double free (by the std::string ).
Steve
|
|
|
|
|
|
Show more code! Make sure we can see the "<" and ">" characters and what's between them in your post: it's obviously essential information when dealing with templates.
Steve
|
|
|
|
|
Do you have email I will send you the code? It's vc6 WIN32 + STL (no MFC)
|
|
|
|
|
Try the page heap suggestion below. I'm happy to give advice but I haven't got the time presently to do it for you; sorry.
Steve
|
|
|
|
|
|
Stephen, look at his code and there is the reason!
http://www.codeproject.com/script/comments/forums.asp?msg=2182788&forumid=1647#xx2182788xx
Maxwell Chen
|
|
|
|
|
|
I'd guess you've corrupted the heap at another location in your program and the problem in manifesting here. Try the following:
I give the following advice about once a month; it often helps me track down the nastier heap errors:
Try enabling the page heap[^] for your process. Follow these steps:
1. Download and install WinDBG[^].
2. Select “Start”->“All Programs”->“Debugging Tools for Windows”->“Global Flags”.
3. Select the “Image File” tab.
4. In the “Image: (TAB to refresh)” edit control enter the name of your app then press TAB. Just the name with the extension; not the full path.
5. Tick the following:
- “Enable page heap”
- “Enable heap tail checking”
- “Enable heap free checking”
- “Enable heap parameter checking”
- “Enable heap validation on call”
- “Create user mode stack trace database”
6. Press “Apply”.
7. Debug your application. Any debugger will do but with WinDBG you have access to the stack traces of allocations via the !heap –p –a command, for example. When a heap problem is detected a breakpoint will be generated.
8. When done un-tick all the options you ticked, press “Apply” then dismiss GFlags. This step is important as if it’s skipped all applications named as entered in step 4 will run with the page heap enabled.
Note that when using the page heap your application will run much slower than normal and consume way more memory. It’s good to have a beefy machine to do such tests; and such tests should be ran regularly on all applications you develop as part of regular testing activities. If I find a part of my application that’s too slow with the page heap enabled I optimize the memory allocation in that region.
Steve
|
|
|
|
|
Stephen Hewitt wrote: I'd guess you've corrupted the heap at another location in your program and the problem in manifesting here. Try the following:
That's every programmer's nightmare - but I think I will check more carefully where memory is allocated, free and used...
Thanks very much that's very detail...
It turns out I already have WinDBG installed just never used it...
|
|
|
|
|
Maxwell has found your mistake: see here[^].
Steve
|
|
|
|
|
Thanks
Originally:
CSomeClass::~CSomeClass()<br />
{<br />
m_oApplicationConfig.clear();<br />
<br />
return;<br />
}
After (it's there because I was trying a couple of things):
CSomeClass::~CSomeClass()<br />
{<br />
m_strConfigFileName.~basic_string(); << Crashed here! <br />
m_oApplicationConfig.clear();<br />
<br />
return;<br />
}<br />
Now:
CSomeClass::~CSomeClass()<br />
{<br />
m_oApplicationConfig.clear();<br />
<br />
return;<br />
}
|
|
|
|
|
devvvy wrote: Now:
CSomeClass::~CSomeClass()
{
m_oApplicationConfig.clear();
return;
}
In this case, you can safely omit the call to clear() : It is done automagically by the multimap-destructor. That idiom is called RAII: "Resource aquisition is initialisation".
Something other smells fishy in your program, and it is not in this class definition.
Do you somewhere have a pointer to a CSomeClass, and delete this twice?
Though I speak with the tongues of men and of angels, and have not money, I am become as a sounding brass, or a tinkling cymbal. George Orwell, "Keep the Aspidistra Flying", Opening words
|
|
|
|
|
It's also one of these things I put there trying to get this working...
removed now... same bug unfortunately...
|
|
|
|