FreeLibrary problem [modified]
-
Hi all, Please help me... I am have written below function in which I am calling repeated as per my requirement..
typedef HRESULT (*PROCHICON)(HICON*);
typedef CString (*PROCCSTRNAME)();
typedef CString (*PROCCSTRCONT)(CString);LoadButtonPluginDLL(CString DLLPath,CString &ButtonText,HICON &ImageHandle,CString &ButtonContent)
{
PROCHICON ProcButtonHicon;
PROCCSTRNAME ProcButtonName;
PROCCSTRCONT ProcButtonContent;
HINSTANCE hLib = ::LoadLibrary(DLLPath); //load the plugin libarary dll//
if(hLib==NULL)
{
MessageBox(_T("Fails To Load Dll"));
return;
}ProcButtonHicon =(PROCHICON)::GetProcAddress(hLib,"GetButtonImage");
if(ProcButtonHicon == NULL) //if dll is not loaded
{
::FreeLibrary(hLib);
CoUninitialize();
return;
}
ProcButtonName =(PROCCSTRNAME)::GetProcAddress(hLib,"GetButtonText");
if(ProcButtonName == NULL)
{
::FreeLibrary(hLib);
CoUninitialize();
return;
}
ProcButtonContent= (PROCCSTRCONT)::GetProcAddress(hLib,"GetPluginContent");
if(ProcButtonContent == NULL) //if dll is not loaded
{
::FreeLibrary(hLib);
CoUninitialize();
return;
}
((PROCHICON)ProcButtonHicon)(&ImageHandle);
ButtonText =((PROCCSTRNAME)ProcButtonName)();
ButtonContent =((PROCCSTRCONT)ProcButtonContent)("1");if(hLib)
FreeLibrary(hLib); //free the libaray
}When I callabove function first time it works fine I get proper values in ImageHandle,ButtonText,ButtonContent from dll. but when I call this function second time and after calling FreeLibrary(hLib);variables ButtonText & ButtonContent become BadPtr and I can't use these values out side the function. :(
modified on Friday, August 1, 2008 4:47 AM
-
Hi all, Please help me... I am have written below function in which I am calling repeated as per my requirement..
typedef HRESULT (*PROCHICON)(HICON*);
typedef CString (*PROCCSTRNAME)();
typedef CString (*PROCCSTRCONT)(CString);LoadButtonPluginDLL(CString DLLPath,CString &ButtonText,HICON &ImageHandle,CString &ButtonContent)
{
PROCHICON ProcButtonHicon;
PROCCSTRNAME ProcButtonName;
PROCCSTRCONT ProcButtonContent;
HINSTANCE hLib = ::LoadLibrary(DLLPath); //load the plugin libarary dll//
if(hLib==NULL)
{
MessageBox(_T("Fails To Load Dll"));
return;
}ProcButtonHicon =(PROCHICON)::GetProcAddress(hLib,"GetButtonImage");
if(ProcButtonHicon == NULL) //if dll is not loaded
{
::FreeLibrary(hLib);
CoUninitialize();
return;
}
ProcButtonName =(PROCCSTRNAME)::GetProcAddress(hLib,"GetButtonText");
if(ProcButtonName == NULL)
{
::FreeLibrary(hLib);
CoUninitialize();
return;
}
ProcButtonContent= (PROCCSTRCONT)::GetProcAddress(hLib,"GetPluginContent");
if(ProcButtonContent == NULL) //if dll is not loaded
{
::FreeLibrary(hLib);
CoUninitialize();
return;
}
((PROCHICON)ProcButtonHicon)(&ImageHandle);
ButtonText =((PROCCSTRNAME)ProcButtonName)();
ButtonContent =((PROCCSTRCONT)ProcButtonContent)("1");if(hLib)
FreeLibrary(hLib); //free the libaray
}When I callabove function first time it works fine I get proper values in ImageHandle,ButtonText,ButtonContent from dll. but when I call this function second time and after calling FreeLibrary(hLib);variables ButtonText & ButtonContent become BadPtr and I can't use these values out side the function. :(
modified on Friday, August 1, 2008 4:47 AM
1. Please use
code block
button to surround code snippets with <pre> tags. 2. Why do you need to initialiseCOM
library? 3. Why do you load theDLL
and unload it inside your function body (overhead)? :)If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[My articles] -
1. Please use
code block
button to surround code snippets with <pre> tags. 2. Why do you need to initialiseCOM
library? 3. Why do you load theDLL
and unload it inside your function body (overhead)? :)If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[My articles]Thanks for reply Actually this thing is some what new for me so while doing some R&D to overcome this problem I have initialize Com library, I think it is not necessary .. >3. Why do you load the DLL and unload it inside your function body (overhead)? - At runtime Dynamically my dll names & path will also be varying thats why I am Loading & Unloading DLL inside my function only. this bug I am facing when I am calling this function for same dll, second time. I think my dlls are not getting freed properly in first call of this function. Please help me...
-
Thanks for reply Actually this thing is some what new for me so while doing some R&D to overcome this problem I have initialize Com library, I think it is not necessary .. >3. Why do you load the DLL and unload it inside your function body (overhead)? - At runtime Dynamically my dll names & path will also be varying thats why I am Loading & Unloading DLL inside my function only. this bug I am facing when I am calling this function for same dll, second time. I think my dlls are not getting freed properly in first call of this function. Please help me...
Could you please edit the OP and reformat your code as requested? Is the
DLL
's code yours (Are you properly doing cleanup inside it?)? :)If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[My articles] -
Could you please edit the OP and reformat your code as requested? Is the
DLL
's code yours (Are you properly doing cleanup inside it?)? :)If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[My articles]thanks you for reply.. Code is reformatted please check.. the DLL's code is written by my team member,I need to check with him.. but it is working properly for
ImageHandle
which is passed by reference in this function. It is causing problem withButtonText
&ButtonContent
only... -
thanks you for reply.. Code is reformatted please check.. the DLL's code is written by my team member,I need to check with him.. but it is working properly for
ImageHandle
which is passed by reference in this function. It is causing problem withButtonText
&ButtonContent
only...Rahul Vaishnav wrote:
Code is reformatted please check.. the DLL's code is written by my team member,I need to check with him.. but it is working properly for ImageHandle which is passed by reference in this function. It is causing problem with ButtonText & ButtonContent only...
Well, since the
DLL
's source code is available you may debug the whole thing. :)If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[Image resize DLL] -
Rahul Vaishnav wrote:
Code is reformatted please check.. the DLL's code is written by my team member,I need to check with him.. but it is working properly for ImageHandle which is passed by reference in this function. It is causing problem with ButtonText & ButtonContent only...
Well, since the
DLL
's source code is available you may debug the whole thing. :)If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[Image resize DLL]Ok I will debug it Thank you very much for reply.. bye :)
-
Hi all, Please help me... I am have written below function in which I am calling repeated as per my requirement..
typedef HRESULT (*PROCHICON)(HICON*);
typedef CString (*PROCCSTRNAME)();
typedef CString (*PROCCSTRCONT)(CString);LoadButtonPluginDLL(CString DLLPath,CString &ButtonText,HICON &ImageHandle,CString &ButtonContent)
{
PROCHICON ProcButtonHicon;
PROCCSTRNAME ProcButtonName;
PROCCSTRCONT ProcButtonContent;
HINSTANCE hLib = ::LoadLibrary(DLLPath); //load the plugin libarary dll//
if(hLib==NULL)
{
MessageBox(_T("Fails To Load Dll"));
return;
}ProcButtonHicon =(PROCHICON)::GetProcAddress(hLib,"GetButtonImage");
if(ProcButtonHicon == NULL) //if dll is not loaded
{
::FreeLibrary(hLib);
CoUninitialize();
return;
}
ProcButtonName =(PROCCSTRNAME)::GetProcAddress(hLib,"GetButtonText");
if(ProcButtonName == NULL)
{
::FreeLibrary(hLib);
CoUninitialize();
return;
}
ProcButtonContent= (PROCCSTRCONT)::GetProcAddress(hLib,"GetPluginContent");
if(ProcButtonContent == NULL) //if dll is not loaded
{
::FreeLibrary(hLib);
CoUninitialize();
return;
}
((PROCHICON)ProcButtonHicon)(&ImageHandle);
ButtonText =((PROCCSTRNAME)ProcButtonName)();
ButtonContent =((PROCCSTRCONT)ProcButtonContent)("1");if(hLib)
FreeLibrary(hLib); //free the libaray
}When I callabove function first time it works fine I get proper values in ImageHandle,ButtonText,ButtonContent from dll. but when I call this function second time and after calling FreeLibrary(hLib);variables ButtonText & ButtonContent become BadPtr and I can't use these values out side the function. :(
modified on Friday, August 1, 2008 4:47 AM
Rahul Vaishnav wrote:
((PROCHICON)ProcButtonHicon)(&ImageHandle); ButtonText =((PROCCSTRNAME)ProcButtonName)(); ButtonContent =((PROCCSTRCONT)ProcButtonContent)("1");
This is a very odd way of calling functions. Why not:
ProcButtonHicon(&ImageHandle);
ButtonText = ProcButtonName();
ButtonContent = ProcButtonContent("1");Rahul Vaishnav wrote:
if(hLib)
Redundant check.
"Love people and use things, not love things and use people." - Unknown
"The brick walls are there for a reason...to stop the people who don't want it badly enough." - Randy Pausch
-
Hi all, Please help me... I am have written below function in which I am calling repeated as per my requirement..
typedef HRESULT (*PROCHICON)(HICON*);
typedef CString (*PROCCSTRNAME)();
typedef CString (*PROCCSTRCONT)(CString);LoadButtonPluginDLL(CString DLLPath,CString &ButtonText,HICON &ImageHandle,CString &ButtonContent)
{
PROCHICON ProcButtonHicon;
PROCCSTRNAME ProcButtonName;
PROCCSTRCONT ProcButtonContent;
HINSTANCE hLib = ::LoadLibrary(DLLPath); //load the plugin libarary dll//
if(hLib==NULL)
{
MessageBox(_T("Fails To Load Dll"));
return;
}ProcButtonHicon =(PROCHICON)::GetProcAddress(hLib,"GetButtonImage");
if(ProcButtonHicon == NULL) //if dll is not loaded
{
::FreeLibrary(hLib);
CoUninitialize();
return;
}
ProcButtonName =(PROCCSTRNAME)::GetProcAddress(hLib,"GetButtonText");
if(ProcButtonName == NULL)
{
::FreeLibrary(hLib);
CoUninitialize();
return;
}
ProcButtonContent= (PROCCSTRCONT)::GetProcAddress(hLib,"GetPluginContent");
if(ProcButtonContent == NULL) //if dll is not loaded
{
::FreeLibrary(hLib);
CoUninitialize();
return;
}
((PROCHICON)ProcButtonHicon)(&ImageHandle);
ButtonText =((PROCCSTRNAME)ProcButtonName)();
ButtonContent =((PROCCSTRCONT)ProcButtonContent)("1");if(hLib)
FreeLibrary(hLib); //free the libaray
}When I callabove function first time it works fine I get proper values in ImageHandle,ButtonText,ButtonContent from dll. but when I call this function second time and after calling FreeLibrary(hLib);variables ButtonText & ButtonContent become BadPtr and I can't use these values out side the function. :(
modified on Friday, August 1, 2008 4:47 AM
I had a similar problem: Access violations caused by bad pointers after having freed a dll with FreeLibrary. Your problem sounds just the same. The problem was, the dll and the exe each had its own copy of the c-runtime-library and each c-runtime-library had its own heap. Freeing the dll also freed its heap and all dynamically allocated memory. To overcome this problem: Free memory where it had been allocated Her is the link about the 'FreeLibrary problem' where i found the answer to the problem: http://java.codeproject.com/Feature/SubtleBugs.aspx?fid=1647&msg=2660410
-
I had a similar problem: Access violations caused by bad pointers after having freed a dll with FreeLibrary. Your problem sounds just the same. The problem was, the dll and the exe each had its own copy of the c-runtime-library and each c-runtime-library had its own heap. Freeing the dll also freed its heap and all dynamically allocated memory. To overcome this problem: Free memory where it had been allocated Her is the link about the 'FreeLibrary problem' where i found the answer to the problem: http://java.codeproject.com/Feature/SubtleBugs.aspx?fid=1647&msg=2660410
Thanks you for your reply.. I was on leave thats why I couldnt reply..? I will go through this link.. Thanks you.