|
Hi!
i want call api functions(LoadLibrary, GetProcAddress) in my driver code. but compiler of driver don't know this functions. this compiler just know DDK functions.
are there any function instead this functions (LoadLibrary, GetProcAddress) in DDK?
Zo.Naderi-Iran
|
|
|
|
|
Hi
How to change Use MFC in a Shared DLL to Use MFC Static Library in VC 8.0.
In VC6.0 , changed by
Project -> Settings -> Setting For :Win32 Debug Microsoft Foundation Class
But i dont Know in VC 8.0.
When the Programme was createing there was an option for this, in Application Type,but i developed the programme in Shared Dll So i want how to change after programme created.
Awaiting for the Reply
Regards
shakumar
shakumar
|
|
|
|
|
'Project properties' -> 'General' -> 'Use of MFC' and there select 'Use MFC in a static library'.
|
|
|
|
|
I want to learn DirectX.
So,I hope someone would like to introduce me a article lead me enter it.
Thanks.
GOOD LUCK
|
|
|
|
|
|
I have no exprience of DirectX programming.I only know that DirectX compose of Direct Draw(before 9.0c version),Direct2D,Direct3D,DirectPlay,DirectMusic and DirectSound. And I want to begin learning and using it now. I want to get a common guide of DirectX programming,besides anyone of these.I think ,if I understand a common DirectX programming way,I will learn every of it easily.
Would you like to help me?
Thanks.
|
|
|
|
|
hi every one
how can i write kernel mode dll?
please help me
|
|
|
|
|
2 problems:
1. The following code, has memory leak. (Not in m_pA and pStr , since I delete them later):
in .h
struct a
{
char* pStr;
};
a* m_pA;
in .cpp
m_pA = new a;
.
.
.
m_pA->pStr = new char[260];
CString szPath = m_pA->pStr;
...
delete[] m_pA->pStr;
.
.
.
delete m_pA;
unless I call szPath.Empty() before exiting. why?
2. Is it safe to use CString as a member of a struct and pass it to a function? with the un-predefined size of the CString how stack looks like in the function?
Thank you so much in advanced.
-- modified at 1:28 Saturday 8th September, 2007
-- modified at 10:13 Saturday 8th September, 2007
I added delete calls, since no one trusted me when at first line I mentioned I delete them later(or perhaps no one ever read the very first line;P)
// "Life is very short and is very fragile also." Yanni while (I'm_alive) { cout<<"I love programming."; }
|
|
|
|
|
hi
i dont suggest to use CString in a structure.
instead,
use some character array like,
char name[256];
in an array.
|
|
|
|
|
Thanks for quick reply.
chandu004 wrote: i dont suggest to use CString in a structure.
Why?
I thought when passing a structure that has a CString to a function(as a parameter), the size of the CString is unknown, if the function changes the data, things might get worst because needed size is more than amount of already allocated memory, so an overflow. But these are just some ideas and probably wrong, because the same thing can work fine in a class.
I was wondering what happens exactly in CString class.
// "Life is very short and is very fragile also." Yanni while (I'm_alive) { cout<<"I love programming."; }
|
|
|
|
|
chandu004 wrote: i dont suggest to use CString in a structure.
instead,
use some character array like,
char name[256];
That is complete non-sense. CString class (although I prefer the stl version) is a wrapper class for a string array. Its purpose is to ease you the live so that you don't have to bother with memory allocation for your string. Why wouldn't you use it in a structure ?
|
|
|
|
|
2. The class is always safer then pointer. The sizeof(CString) is always identically, that's why you can easy pass it as a function parameter. Because string data is containing somewhere in heap and CString just contain pointer to this data. That's why the sizeof(CString("short string")) == sizeof("very very long string"). One more thing thing you should know, that when you pass CString as a function parameter by value the copy constructor is caling, so the data can be copied or it can be reference counting system. Anyway while the CString constructor is calling the class is safe.
1.
char * c = new char[10];
CString s = c; // the data is not pointing to c, it is copied here, so you need to delete c
|
|
|
|
|
progDes wrote: 2. The class is always safer then pointer.
Thanks. So it's a pointer in fact. That's really good.
progDes wrote: // the data is not pointing to c, it is copied here, so you need to delete c
I understand it. My problem here is not c , it's s . If I don't call s.Empty() I'll have a memory leak. This really confused me.
// "Life is very short and is very fragile also." Yanni while (I'm_alive) { cout<<"I love programming."; }
|
|
|
|
|
>"If I don't call s.Empty() I'll have a memory leak."
Destructor must call it.
|
|
|
|
|
progDes wrote: Destructor must call it.
But it doesn't and memory leak is shown on my debug window. When I explicitly call Empty however it disappears.
// "Life is very short and is very fragile also." Yanni while (I'm_alive) { cout<<"I love programming."; }
|
|
|
|
|
I already know what the problem is from the first time I saw a ‘new’ statement. I finished a course on modern programming languages (MS Specific), so I assume you think it is magic. Wrong, it is only magic if the language supports automatic clean up! The ‘new’ operator allocates memory and it is up to you to free it; otherwise you will have a memory leak. In Microsoft’s new languages it is still a good idea to free them, because they go into a list somewhere, waiting to be released.
This is relates to a very old problem that I never understood. If you allocate the memory, then you need to free it. What is the problem?
INTP
"Program testing can be used to show the presence of bugs, but never to show their absence."Edsger Dijkstra
|
|
|
|
|
John R. Shaw wrote: The ‘new’ operator allocates memory and it is up to you to free it;
What's the point here? I already delete them, but didn't add delete in this code, but wrote it when I said:
The following code, has memory leak. (Not in m_pA and pStr, since I delete them later )
I understand how to allocate and deallocate memory either in C and C++. My problem here is that:
when I assign a pointer-to-a-char*-buffer to a CString object, I then have to call Empty() of that CString object. This is what I don't understand. I never read anywhere that CString requires programmer to call it's Empty function, and if I don't I'll have memory leaks.
I modified my code and added those deletes that I talked about. Now I think it's even more clear that I delete those newed variables.
-- modified at 10:17 Saturday 8th September, 2007
// "Life is very short and is very fragile also." Yanni while (I'm_alive) { cout<<"I love programming."; }
|
|
|
|
|
|
Thanks.
I'll soon read it.
// "Life is very short and is very fragile also." Yanni while (I'm_alive) { cout<<"I love programming."; }
|
|
|
|
|
From MSDN:
In previous versions of MFC, it was important that you clean up CString objects after use. With MFC version 3.0 and later, explicit cleanup is no longer necessary.
May be you have MFC 3.0?
|
|
|
|
|
progDes wrote: May be you have MFC 3.0?
I'm not sure. I use VS 6.0 SP5.
This might seems stupid, but I don't know how can I find my MFC version?
// "Life is very short and is very fragile also." Yanni while (I'm_alive) { cout<<"I love programming."; }
|
|
|
|
|
I'm thinking maybe you are trashing the heap with this:
m_pA->pStr = new char[260];
CString szPath = m_pA->pStr; You haven't initialized the array that's being copied to the CString.
What if you do this...
m_pA->pStr = new char[260];
m_pA->pStr[0] = 0;
CString szPath = m_pA->pStr; I'm not sure what you're trying to accomplish here, however.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Thanks for your reply Mark. I have recently many question answered by you. You deserve being a CP MVP, if you are not already.
Mark Salsbery wrote: You haven't initialized the array that's being copied to the CString.
Actually I did. I hope you are patient enough to read this similar to real code:
For easier reading I ignored .h and .cpp and wrote them at once.
Class a
{
void SetPath(CString strPath)
{
memset(m_pA->pSzPath, NULL, MAX_PATH);
int len = min(MAX_PATH, strPath.GetLength());
strncpy(m_pA->pSzPath, strPath, len);
m_pA->bPathUpdated = TRUE;
}
static UINT ThumbnailViewerThread(LPVOID pParam)
{
CString strFullPath, strFileName, strFolderPath;
while(!pData->bStop)
{
if (pClientData->bPathUpdated)
{
strFolderPath = pClientData->pSzPath;
strFullPath = strFolderPath + "\\" + strFileName;
strFolderPath.Empty();
}
else
{
sleep(500);
}
}
}
}
I call SetPath member function to set a new path for the thumbnail thread reader.
// "Life is very short and is very fragile also." Yanni while (I'm_alive) { cout<<"I love programming."; }
|
|
|
|
|
Hamed Mosavi wrote: void SetPath(CString strPath)
{
memset(m_pA->pSzPath, NULL, MAX_PATH);
int len = min(MAX_PATH, strPath.GetLength());
strncpy(m_pA->pSzPath, strPath, len); // Path to folder
m_pA->bPathUpdated = TRUE; // a volatile BOOL
}
There still may be a problem with the string termination, possibly causing memory corruption or overrun.
Assuming the size of the pSzPath is MAX_PATH, maybe try:
void SetPath(CString strPath)
{
memset(m_pA->pSzPath, 0, MAX_PATH);
int len = min(MAX_PATH<font color="Red"> - 1</font>, strPath.GetLength());
strncpy(m_pA->pSzPath, strPath, len);
<font color="Red"><font><font> m_pA->pSzPath</font></font>[len] = 0;</font>
<font> m_pA->bPathUpdated = TRUE;
}</font> You shouldn't need the empty call unless you want to explicitly empty the string.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Mark Salsbery wrote: (MAX_PATH - 1,
That's right. I took a closer look at my code and I saw that -1 in mine. Sorry to forget to add it here.
Why do I need to call this:
m_pA->pSzPath[len] = 0;
when I just called this:
memset(m_pA->pSzPath, 0, MAX_PATH);
len will be MAX_PATH-1 or something smaller, so that this char* always has the \0 in the end, before being filled with strncpy . This \0 is not the problem here. I think I might need to find some free time and check the resulting assembly code, perhaps I find something there.
Mark Salsbery wrote: You shouldn't need the empty call
That's what bothers me here. There's obviously something's wrong
Anyway thank you so much for your kind help. I appreciate it.
Thanks Mark.
// "Life is very short and is very fragile also." Yanni while (I'm_alive) { cout<<"I love programming."; }
|
|
|
|