我刚刚在我的应用程序中遇到问题,我需要获取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
答案 0 :(得分:6)
CreateWindowExW
由user32.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并向下滚动,您会看到:
所以它已在User32.dll
中实施。