在编写双显示器程序时用到EnumDisplayDevices等函数.
我在MSDN中找到EnumDisplayDevices函数的帮助,其在winuser.h中声明,但我编译时就出现未声明的标识错误.  其在User32.lib中实现,我看了好几个例子,都是是用下面的形式:BOOL (WINAPI* pEnumDisplayDevices)(PVOID,DWORD,PVOID,DWORD);
typedef  BOOL(WINAPI*EMPROC)(PVOID,DWORD,PVOID,DWORD);
   pEnumDisplayDevices =(EMPROC) GetProcAddress(LoadLibrary("USER32"), "EnumDisplayDevicesA"); 
   ...
   (*pEnumDisplayDevices)(NULL, i, &dd, 0);
来实现请问这是为什么呢? 为什么直接用EnumDisplayDevice(....)不行呢?

解决方案 »

  1.   

    可能是因为是WIN32API未公开函数吧,其实有好多这样的函数。
    另外一个原因可能是你的winuser.h文件太老,或版本不对。
      

  2.   

    谢谢几位关注.
    EnumDisplayDevices在MSDN在线帮助中有明确讲解,不会是未公开函数吧? 
    我看了几个例子都是用上面的方法实现的,难道他们的winuser.h都太老吗?
    我按这个例子中的做法也做出来了,现在想弄明白为什么不能直接引用?
    我在WIN98SE和WIN2000都试过,结果一样.
    用MFC或不用MFC也都一样.
      

  3.   

    函数重载版本的原因。
    在32位操作系统下,多数函数都保留了16位参数的函数版本。
    譬如你调用CreateWindow(),根据你宏定义的不同,实际上分别调用的是CreateWindowA()和CreateWindowW(),带A的一般是非unicode版本,带W的一般是unicode版本。
    所以
      

  4.   

    To:nlstone(天外流星) 
    你的因答好象不能说明问题啊.
    象TextOut也有TextOutA和TextOutW,
    为什么我们能直接写TextOut而不用LoadLibrary?而这些函数却要这么做呢?
      

  5.   

    我自照着winuser.h中的样子声明了一个EnumDisplayDevices,
    Link时还是找不到啊.
    tttDlg.obj : error LNK2001: unresolved external symbol "int __stdcall EnumDisplayDevices(void *,unsigned long,void *,unsigned long)" (?EnumDisplayDevices@@YGHPAXK0K@Z)
    Debug/ttt.exe : fatal error LNK1120: 1 unresolved externals
      

  6.   

    你应该声明成两个版本一个是A的一个是W的,这样才可以,我们在VC中之所以能直接用一些API而不用管它是A的还是W的,是因为.h中这样定义了
    #ifdef UNICODE
    #define MessageBox  MessageBoxW
    #else
    #define MessageBox  MessageBoxA
    #endif // !UNICODE
    所以API(User32.dll)中根本没有MessageBox,只有MessageBoxW,MessageBoxA
      

  7.   

    这个我也清楚,也都试过了.A的和W的,还有什么都没有的.毛病依然如故,找不到.
    我想还是有些问题,要不别人用这个函数为什么非得用LoadLibrary呢?
    为什么不找个新版本的.h呢?
      

  8.   

    你可以专门在连接选项里面加上User32.lib试试