我使用vc建立了一个dll文件,并且用vc调用,但是调用的时候总是报错:
test2 error LNK2019: unresolved external symbol __imp__GetModuleUsage referenced in function _Dlg_Proc@16
只有把dll和调用的exe项目放在一个solutiong中,并且在solution 中把调用的project的depends on选中才一切正常。
如果使用调用的project中的linker的import library进行设置,也报这个错误。
使用动态调用,设置了__declspec(dllimport)也不行。执行到LoadLibrary的时候一切正常,但是只要一加入调用的函数,就不能变异。我使用GetProcAddress得到函数的地址,然后通过地址使用则一切正常,但是只限于使用def文件的时候,如果不进行处理还是无法使用。另外,我看了看书中的例子,全都使用了solution 中的depends on选项,如何可以不用?如何使用动态链接?困扰了我好几天,谁能帮帮我?谢谢。

解决方案 »

  1.   

    你没有搞清楚隐式调用与显示调用。这个是问题的关键。除非万不得已,不要用显式调用。显式调用:用LoadLibrary. + 定义函数指针 + 用GetProcAddress得到指针地址并赋给先前调用的函数指针,用函数指针作用到参数列表,得到结果。但这种方法非常令人不爽,写出的代码可读性很差。隐式调用:将头文件加入到需要调用DLL的工程中,在PROJECT SETTING中加入相应的LIB文件,在EXE文件相同目录中拷贝一下DLL文件。这个方法显得自然。
      

  2.   


    还有DLL放置的路径问题。一般建议放到EXE相同的目录下。如果是系统DLL,则放到WINDOWS系统system32目录下。
      

  3.   

    在调用的EXE项目里包含需调用的DLL的 .lib 文件了吗?随便说说,在 VC6 下我一般是这样解决的#pragma comment(lib,"mydll.lib")
      

  4.   

    楼上说的当然可以解决dll的调用的问题,可我的问题还是没解决呀?我只是想知道我的错在哪?因为什么不对。
      

  5.   

    我只是想知道__declspec(dllimport)在什么时候用,在动态调用中是不是不能使用__declspec(dllimport)?
      

  6.   

    兄弟你UP多少次了?似乎是我以前碰到的一个问题,说的不对就当我没说。就是在VC.Net里调用DLL的问题吧,引用Lib文件用#pragma comment(lib,"mydll.lib")当然可以,不过麻烦了点。和VC6一样,可以在项目配置中把Lib加进去
    项目 - 配置属性 - 链接器 - 输入 - 附加依赖项
      

  7.   

    我就是想知道如果使用动态调用的话是不是不能设置__declspec(dllimport),是不是只能使用GetProcAddress的办法?为什么?
      

  8.   

    __declspec(dllimport)的作用应该和extern差不多,都是在函数声明的时候用的。它们都告诉编译器所声明的函数的定义在本文件中;不同的是,extern告诉链接器到工程中别的cpp文件里去寻找的函数的定义(地址);而__declspec(dllimport)告诉链接器所声明的函数是从DLL中输入的,应该去lib文件中寻找函数的地址。  
        动态调用的时候没有函数声明,当然不能用__declspec(dllimport)。    ——以上只是个人理解,仅供参考。