我做了一个动态连接库1,其中用到另一个动态连接库2,我想将其包进,使其他人调用库1时,也能够使用库2的函数,该怎么办?
谢谢!!!!!!!!!!

解决方案 »

  1.   

    好了,调试通过!!
    1、首先新建一个myDLL1工程使用MFC Extend DLL
    在myDll1.cpp的末尾添加
    __declspec(dllexport) int __stdcall showDlg(void) 
    {
        // 这将是被二次调用的动态链接库
        // 我假定只能够显示一个对话框
        AfxMessageBox("ok called !") ;
    return 0 ;
    }
    2、在myDll1.def中添加(好像在6.0中也可以不用*.def文件??)
    showDlg         @1
    编译生成myDll1.dll
    3、新建一个myDll2的MFC Extend DLL工程
    在myDll2.cpp中添加:
    int (__stdcall *pFunc)(void) ;
    __declspec(dllexport) void __stdcall CallNextDll() 
    {
        HINSTANCE hDllFunc ;   
        // 这是动态加载
        hDllFunc = LoadLibrary("myDLL1.dll") ;
    if(hDllFunc != NULL) 
    {
              // 如果加载成功,进行寻址
       pFunc = GetProcAddress(hDllFunc,"showDlg") ;
              // 使用指向函数的指针进行调用
       (*pFunc)() ;
              // 动态卸载改动态链接库
       FreeLibrary(hDllFunc) ;
    }
    }
    同样在myDll2.def中添加CallNextDll      @1
    生成myDll2.dll和myDll2.lib
    4、新建调用Applicaton,我用的是Dialog。
    选择Project-》Add To Project-》Files...
    然后添加myDll2.lib
    好了,可以调用了!
    在xxxxxDlg.cpp中加入__declspec(dllimport) void __stdcall CallNextDll() ;的函数声明
    然后再OnOk函数中调用即可
    void CCallDlgDlg::OnOK() 
    {
    CallNextDll() ;
    }
    好了,运行它!注意要将两个myDll1.dll和myDll2.dll拷贝到相同目录下。
    单击ok会发现myDll1.dll中的对话框出现了,但是我们调用的是myDll2.dll中的函数。
      

  2.   

    to: aben456(风轻扬) EXE调用DLL有两种方式,一种是用.h头文件,另一种就如上所述,用
    LoadLibrary() GetProcAddress() FreeLibrary()
      

  3.   

    首先非常感谢你精彩的回答!!!!!!!!!
    可能是我说得不够具体:
    1。我创建a.dll工程,将b.dll工程的b.lib导入,b.dll考入它的目录下,在将它的b.h文件中函数声明改为_declspec(dllimport) f1(),这样a.dll工程中f2可以用到f1函数,编译生成a.dll.
    2.工程c调用a.dll,使其直接用到f1原型,而不是在a.dll的函数f2中使用了f1.
    (只拷贝a.dll到c的目录下)
    这样该怎么办?