在dll文件中提供了__declspec(dllimport)的函数接口,在此dll中又加载了动态库文件,被加载的动态库需要调用dll中提供的函数接口,此时是得到的数据是正确的;但将dll工程属性换成lib,将函数接口的__declspec(dllimport)前缀去掉,在加载的动态库中再去调用得到的数据就为空了。请教问题所在。此函数很简单,如下:
context* Context() 

return ContextPtr; 
}
ContextPtr是一个static变量,在被加载的动态库调用之前已经被set了。

解决方案 »

  1.   

    静态库lib也要link对应的静态库文件,把加载的动态库也改一下
      

  2.   

    thx for answer. 不过我想麻烦来了。。现在是在dll中用LoadLibrary的方式加载了好几个动态库,然后GetProcAddress得到各个对应动态库中的DllRegister的入口。修改加载的动态库是不是需要将不同的动态库的DllRegister更名,然后再当前加载他们的地方调用分别调用?此外再多问一句,用动态库dll能加载静态库么?非常感谢。
      

  3.   

    dll可以link静态库,普通dll,你直接LoadLibrary加载,然后GetProcAddress获取函数地址来访问
    可以定义不同名称的函数指针来对应不同DLL的DllRegister()<<,,然后调用的时候就可以区分
      

  4.   

    给你个生成dll的例子吧,这样简单
    #ifdef OS_WINDOWS
    #if defined OSRES_EXPORTS
    #define OSLIB_DLL_LINK _declspec(dllexport)
    #else
    #define OSLIB_DLL_LINK _declspec(dllimport)
    #endif
    #ifdef OSLIB_STATIC_LINK
    #define OSLIB_DLL
    #else
    #define OSLIB_DLL OSLIB_DLL_LINK
    #endif
    #else
    #define OSLIB_DLL 
    #endif
    OSLIB_DLL void *safe_malloc (INT32 size); /*申请空间并自动清空*/
    这里OSLIB_DLL表示这个函数在dll文件中的接口被输出给其它模块用。
    如果不想采用这种方式,可以在def文件中增加各个需要输出的函数名字。所有输出的函数接口链接关系在生成的lib文件中,而执行代码在dll文件中(这两个文件应该在你的debug或release目录中,提供给其它项目用的h文件,需要自己整理好)。使用是,你在使用这个dll的项目中包含lib文件即可,运行时把dll放在运行目录或者windows系统目录即可。为了兼容c和c++,建议对函数名字加上C的定义:
    #ifdef __cplusplus
    extern "C"
    {
    #endifOSLIB_DLL void *safe_malloc (INT32 size); /*申请空间并自动清空*/#ifdef __cplusplus
    }
    #endif
    如果用静态库,在编译之前定义OSLIB_STATIC_LINK即可,生成动态库时,定义OSRES_EXPORTS,用动态库时,去掉前面两个定义