hInst=LoadLibrary("CursorDLL.dll"); 
if(hInst)
{
SetHookFun=(INHOOK)GetProcAddress(hInst,"SetHook");
UnHookFun=(UNHOOK)GetProcAddress(hInst,"UnHook");
FreeLibrary(hInst);
} SetHookFun(m_hWnd);我运行的时候 出现啦内存不能read的对话框! 于是把FreeLibrary(hInst); 放到OnDestroy中运行 没有报错了 一切正常!我拿出以前写过的一个代码一对比 一样的啊!为什么下面这个没出错! hInst=LoadLibrary("User32.DLL"); 
if(hInst)
{
fun=(MYFUNC)GetProcAddress(hInst,"SetLayeredWindowAttributes");
FreeLibrary(hInst);//我在别的函数中使用啦fun 运行正常!
}
是什么问题?

解决方案 »

  1.   

    因为你先 FreeLibrary(hInst);    
    后面又调用了 SetHookFun(m_hWnd);
    此时函数指针已经不能调用了
      

  2.   

    User32.DLL  应该还会被进程调用,FreeLibrary并没有卸载DLL,只不过计数减一了
    而第一种情况, DLL已经从进程中unload了
      

  3.   

    后面程序正常运行的原因是DLL没有被释放,fun指向的函数虽然是计数为n+1时的指针,实际上调用的时DLL计数为n的fun指向的函数。系统中,只会有一个该DLL的备份。计数不同跟函数的实际地址没有关系,DLL计数是为了实现程序代码的二进制级别的复用。
      

  4.   

    CursorDLL.dll没有User32.dll常用。可能是一般不被开机加载到内存中。