在VC6.0中不能使用SetDllDirectory这个API,使用老是提示没有定义,看MSDN,这个文件声明在头文件Header  Winbase.h (include Windows.h)
Library Kernel32.lib
DLL Kernel32.dll
可是使用提示SetDllDirectory没有定义?打开Winbase.h这个头文件,发现并没有SetDllDirectory这个声明,到底SetDllDirectory声明在哪个文件,可是用VC2012只要包含<windows.h>头文件即可使用?
VC6.0中发现包含<windows.h>也不能使用?真的有点莫名其妙?

解决方案 »

  1.   

    Client
     Requires Windows Vista or Windows XP SP1.
     
    Server
     Requires Windows Server 2008 or Windows Server 2003.
     
    Header
     Declared in Winbase.h; include Windows.h.
     
    Library
     Use Kernel32.lib.
     
    DLL
     Requires Kernel32.dll.
     
    Unicode
     Implemented as SetDllDirectoryW (Unicode) and SetDllDirectoryA (ANSI).
     
      

  2.   

    VC6 太老了,你应该用新的IDE
      

  3.   

    这个API与系统版本有很大依赖,要是加载dll的话,用LoadLibraryEx
      

  4.   

    这跟VC6老不老没有关系,这个API是实现在Kernel32.dll中,跟系统有关,而我使用的是win7,应该是没有问题的
      

  5.   

    主要是用它来解决隐式链接DLL必须跟可执行文件同在一个目录的问题.
      

  6.   

    这跟VC6老不老没有关系,这个API是实现在Kernel32.dll中,跟系统有关,而我使用的是win7,应该是没有问题的这个跟安装的SDK有关
    VC6自带的SDK太久,win2000之前的了
    并且只支持到win2003的SDK
    编译通过和运行通过是两码事主要是用它来解决隐式链接DLL必须跟可执行文件同在一个目录的问题.按照PE加载的流程,静态加载完DLL后才进入main(入口)函数
    隐式链接加载DLL后,才能执行SetDllDirectory的吧
    就是说SetDllDirectory对静态隐式加载DLL不起作用
    只会对动态加载有影响
      

  7.   

    这跟VC6老不老没有关系,这个API是实现在Kernel32.dll中,跟系统有关,而我使用的是win7,应该是没有问题的这个跟安装的SDK有关
    VC6自带的SDK太久,win2000之前的了
    并且只支持到win2003的SDK
    编译通过和运行通过是两码事主要是用它来解决隐式链接DLL必须跟可执行文件同在一个目录的问题.按照PE加载的流程,静态加载完DLL后才进入main(入口)函数
    隐式链接加载DLL后,才能执行SetDllDirectory的吧
    就是说SetDllDirectory对静态隐式加载DLL不起作用
    只会对动态加载有影响
    你说的没错,我再EXE中是动态加载DLL A,但是这个DLL A又依赖其他的隐式链接的DLL B,C...;所以DLL A, B, C...要放在跟Exe同一个目录下才能加载成功,主要我不想把这些DLL全部放在EXE目录下,这样不便于管理,我是想把这些DLL放在Exe的子目录下,所以才有这个需求,因为如果另外同一个项目发布包中别的EXE(这个项目中共有N个EXE)如果也需要这些DLL,那么就不需要再拷贝一份放在另外的EXE子目录下了.
      

  8.   

    你引用的某个头文件可能定义了define _WIN32_WINNT 0x0502 更低的版本
    在你源文件中重新定义一下就好了(前提是你的windows版本必须大于windows xp sp1)
    define _WIN32_WINNT 0x0502