哪个模块在Windows上实现CreateWindowW?

时间:2017-01-13 05:43:06

标签: c++ windows winapi dllimport

我刚刚在我的应用程序中遇到问题,我需要获取CreateWindowW函数的静态地址。就像这样:

&ShowWindow;

然而,当使用CreateWindowW执行相同的技巧时,我得到编译器错误 Identifier "CreateWindowW" is undefined(它是一个宏)。我实际上找不到定义此函数的位置(哪个DLL),甚至pinvoke.net都没有提到这个。

在某些网站上提到它是user32.dll,但我的函数里面的GetProcAddress返回空指针。我迷路了,Windows上哪个模块链接了这个功能?

如果我尝试将调试器和跟踪调用连接到此函数,Visual Studio会“跳过”它,这样我就无法理解调用的位置..

我的版本是UNICODE。 WinUser.h文本我可以看到

#define CreateWindowA(lpClassName, lpWindowName, dwStyle, x, y,\
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)\
CreateWindowExA(0L, lpClassName, lpWindowName, dwStyle, x, y,\
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)
#define CreateWindowW(lpClassName, lpWindowName, dwStyle, x, y,\
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)\
CreateWindowExW(0L, lpClassName, lpWindowName, dwStyle, x, y,\
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)
#ifdef UNICODE
#define CreateWindow  CreateWindowW
#else
#define CreateWindow  CreateWindowA
#endif // !UNICODE

2 个答案:

答案 0 :(得分:6)

CreateWindowExWuser32.dll导出。您只需查看文档即可。或者您可以通过例如检查出口微软的dumpbin工具。

> dumpbin /exports c:\windows\system32\user32.dll | find /i "CreateWindow"

       1618   6D 0000A230 CreateWindowExA
       1619   6E 000107B8 CreateWindowExW
       1620   6F 00041530 CreateWindowStationA
       1621   70 000014D0 CreateWindowStationW

CreateWindowW是一个实现为宏的瘦包装器,根据its documentation

  

CreateWindow是对CreateWindowEx功能的调用,如下所示。

#define CreateWindowA(lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)\
CreateWindowExA(0L, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)

#define CreateWindowW(lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)\
CreateWindowExW(0L, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)

#ifdef UNICODE
#define CreateWindow  CreateWindowW
#else
#define CreateWindow  CreateWindowA
#endif

你也可以通过例如在Visual Studio中“转到定义”。

答案 1 :(得分:4)

如果您打开CreateWindow documentation on MSDN并向下滚动,您会看到它是作为CreateWindowEx的包装器实现的。如果您打开CreateWindowEx doc并向下滚动,您会看到:

image

所以它已在User32.dll中实施。