2017-01-13 36 views
1

Я только что встретил проблему в своем приложении, где мне нужно получить статический адрес функции CreateWindowW. Так же, как это:Какой модуль реализует CreateWindowW в Windows?

&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

'#define CreateWindowW (...) CreateWindowExW (...)' не отдает? –

+0

Теперь это понятно, но не тогда, когда вы читаете страницу MSDN функции «CreateWindow», и вы уверены, что это не макрос. Макрос, возможно, не набрал аргументы, а страница MSDN определяет это как функцию с аргументами, которые имеют типы. Хотя нет упоминания, что это «макрос» или «обертка» (поскольку @VioletGiraffe назвал эту функцию собственными решениями), MSDN говорит (в конце статьи), она «реализована как вызов CreateWindowEx». Это не говорит мне ничего информативного и четко документирующего вопроса. Страница называется «Функция CreateWindow» в MSDN. – Croll

+0

Из [CreateWindow] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms632679.aspx): * «CreateWindow реализован как вызов функции CreateWindowEx **, как показано ниже * *. "* В явном виде указано, что это макрос (в сопроводительном коде). Очевидно, проблема не в чтении документации. – IInspectable

ответ

4

Если вы откроете CreateWindowdocumentation on MSDN и прокрутите вниз, вы увидите, что он реализован как обертка вокруг CreateWindowEx. И если вы откроете CreateWindowEx doc и прокрутите вниз, вы увидите это:

image

Так это реализовано в User32.dll.

6

CreateWindowExW экспортируется user32.dll. Вы можете просто проверить документацию. Или вы можете проверить экспорт через, например, Инструмент Microsoft 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.