我写了个dll,但用LoadLibrary不成功。
用VC带的Depends tools,可以成功,没见到错误;
自写测试程序,load不成功,但先load一下其它dll(与它没关系的)成功,然后load它好像可以成功。此dll是原来一直在用的,现我把它分了一部分独立作为它的下一级dll,与上面的接口完全没有改变。跟踪发现,CApp的构造函数都没有被调用。而新分出去的dll我测试过可以正确load。请帮忙分析一下可能什么原因,谢谢!!

解决方案 »

  1.   

    是否在InitInstance的时候出现了什么错误,那这个时候返回了FALSE,所以
    DLL是不能被装入到内存中的。
      

  2.   

    load不成功表示什么意思呢?
    看看你的dll的InitInstance
    BOOL CHookdllApp::InitInstance ()
    {

    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    hins=AfxGetInstanceHandle();
    return TRUE;

    }
      

  3.   

    回楼上2位:
    文件名我校对了n多遍,也换过了地方,肯定没错;问题是根本就没进入InitInstance()函数,连构造函数CSpiApp()都没有进入。load不成功的表现为:
    HINSTANCE     hDevModuleDll = LoadLibrary("d:\\Spi.DLL"); 
    DWORD      dwError=GetLastError();结果:
    hDevModuleDll ==0;
    dwError  ==126;意义为:“找不到指定的模块。” 
      

  4.   

    删掉debug 和release目录,重新编译一下dll,导出新的lib和dll
      

  5.   

    楼上的方法试过多次了,没用。可能是没找到下一级被调用的dll的原因。
    我的文件spi.dll,用静态加载的方法使用了fw.dll,我把它们放到同一目录下,如D:\,
    调用spi.dll的文件则在另一目录下,1. 直接使用文件名,load不成功:
    HINSTANCE     hDevModuleDll = LoadLibrary("d:\\Spi.DLL"); 2.但我先用打开文件对话框选择一下文件(相当于指定了一下目录),就load成功了,
    CFileDialog dlg(TRUE);
    if(dlg.DoModal()==IDOK)
    {
         HINSTANCE     hDevModuleDll = LoadLibrary("d:\\Spi.DLL"); 
    }3.我把fw.dll放到\system32下,使用第1条的方法,也能load成功。那现在的问题就变成了,我如何使spi.dll找到同一目录下的fw.dll?
      

  6.   

    BOOL SetCurrentDirectory(
      LPCTSTR lpPathName   // new directory name
    );可以设置当前目录把当前目录设置成dll所在的目录然后再loadlibrary看看
      

  7.   

    SetCurrentDirectory()设置当前目录后load成功,谢谢!但每当第1次调用时,hDevModuleDll表明load已成功,但GetLastError(),返回2,意义为:"系统找不到指定的文件",这好像是以前一直遗留下来没有注意到的问题。第2遍load后,GetLastError(),返回0。不知问题出在什么地方?另外,我用静态加载的方法使用了fw.dll,这个文件名更改以后,是否一定要重新编译spi.dll?
      

  8.   

    由于用的是静态连接,所以在使用spi.dll的时候,会先去找fw.dll;但是当前目录默认为执行文件的路径,所以找不到,dll失败;改变当前路径就ok了。因为是静态绑定,修改文件名应该会要求重新编译。对于你说的load两次的问题,感觉第一次是失败的,没遇到过。