有一些函数,最近碰到的比如SwitchToThread(),UrlUnescape()等等,都需要最新版本的SDK支持才可以,但是根据MSDN,这些函数所在的DLL的版本号都符合要求,但就是找不到这个函数,这应该怎么解决呢?不想更新SDK。
比如UrlUnescapeRequirements 
  Version 5.00 and later of Shlwapi.dll  Windows NT/2000: Requires Windows 2000 (or Windows NT 4.0 with Internet Explorer 5.0 or later). 
  Windows 95/98/Me: Requires Windows 98 (or Windows 95 with Internet Explorer 5.0 or later). 
  Header: Declared in Shlwapi.h. 
  Import Library: Shlwapi.lib.这些条件我都满足,但还是不能在相应dll中找到该函数,比如:
HINSTANCE hinstDll;
hinstDll = LoadLibrary("Shlwapi.dll");//现在Shlwapi.dll版本6.0以上
FARPROC ptr=NULL;
ptr=GetProcAddress(hinstDll, "UrlUnescape");
得到的指针就是空值,不论怎样定义什么_WIN32_IE 到0x0500都不行论坛上以前问到这种问题的帖子也不少,大家一起讨论一下解决这种问题

解决方案 »

  1.   

    先用VC带的工具的Dependence Walker看一下是否导出了这个函数,如果导出了使用隐式调用试一下
      

  2.   

    很多函数有 ansi 和 unicode  两个版本api 参考给出的是一般形式在头文件中定义为#ifdef UNICODE
    ...
    #define UrlUnescape             UrlUnescapeW
    ...
    #else
    ...
    #define UrlUnescape             UrlUnescapeA
    ...
    #endif //UNICODE
      

  3.   

    一般MSDN上都是说明需要.lib文件,而.lib文件中的内容和.dll中的内容并不一定相同,.lib文件有可能是Microsoft提供的静态连接库,静态连接库是没有相应的.dll文件的,所以用的时候最好严格遵守MSDN上的要求,比如SwitchToThread函数
    Windows NT/2000/XP: Included in Windows NT 4.0 and later.
    Windows 95/98/Me: Unsupported.
    Header: Declared in Winbase.h; include Windows.h.
    Library: Use Kernel32.lib.
    上面要求的是.lib,但是Kernel32.dll并不一定存在这个函数,所以就会导致用
    LoadLibrary()
    GetProcAddress()返回NULL还有就是有一些根本就不是函数而是Microsoft定义的宏,这些宏在dll中也是不存在的
    比如:SetWindowLongPtr,这个在MSDN上标明着
    Library: Use User32.lib.而在windows 2000 Professional中的User32.dll中就没有这个函数的定义,他只是一个宏而已我的方法是在用到某个不常用函数的时候先用vc的Depends工具查看一下,相关的dll中有没有该函数。来查看这个函数是否存在,如果实在不行就得更新SDK了:(上面是俺个人的一点理解!欢迎大家讨论!
    不足的地方希望大家补充,共同进步:)