Заранее извиняюсь, если я повторяю вещи, которые вы уже знаете.
По историческим причинам (и, я полагаю, для удобства) функции (например, CreateWindow), которые принимают строковые параметры, часто имеют две реализации, которые принимают строки, закодированные в ASCII.или строки, закодированные в Unicode.По соглашению им присваиваются имена A или W, чтобы различать их (например, CreateWindowA и CreateWindowW).
Обычно пустое имя функции # определяется как одно или другое на основе макроса UNICODE (вы можете увидеть это, посмотрев на определение CreateWindow в WinUser.h).Вот почему ваше использование CreateWindow превращается в ссылку на CreateWindowW.
Иногда такие функции, как CreateWindow, должны быть расширены путем добавления другого параметра.Опять же, по соглашению, эти функции часто называются путем добавления суффикса Ex к исходному имени функции.Это произошло с CreateWindow.
Если вы сравните определения CreateWindow и CreateWindowEx , вы обнаружите, что CreateWindowEx имеет дополнительный параметр - первый параметр в списке: DWORD dwExStyle.
Если вы посмотрите на определение CreateWindowW в WinUser.h, вы увидите, что CreateWindowW расширяется до вызова CreateWindowExW, используя 0L в качестве значения для первого параметра и используя одиннадцать параметров CreateWindowW от второго до двенадцатого CreateWindowExWпараметры.
Как уже сказал @Jonathan Wood, вы можете получить код для компиляции, используя CreateWindowEx вместо CreateWindow.Для этого вам также необходимо добавить параметр dwExStyle в ваше объявление.Например,
HWND (WINAPI *pCreateWindow)(DWORD dwExStyle, LPCWSTR lpClassName,
LPCWSTR lpWindowName, DWORD dwStyle,
int x, int y, int nWidth, int nHeight,
HWND hWndParent, HMENU hMenu, HINSTANCE hInstance,
LPVOID lpParam) = CreateWindowEx;
Одна потенциальная «ошибка» заключается в том, что вы объявили такие параметры, как lpClassName, используя LPCWSTR, а не LPCTSTR.Это означает, что в сборках, отличных от Unicode, CreateWindowEx будет расширяться до версии ASCII CreateWindowExA, но ваши типы строковых параметров будут по-прежнему расширяться до версии W, поэтому у вас будет несоответствие.
Чтобы быть согласованным, вы должны либо изменитьПараметры LPCWSTR должны быть LPCTSTR или же явно использовать CreateWindowExW в вашем объявлении.Чтобы избежать путаницы в будущем, было бы хорошо переименовать указатель, чтобы он соответствовал списку параметров и реализации
HWND (WINAPI *pCreateWindowExW)(DWORD dwExStyle, LPCWSTR lpClassName,
LPCWSTR lpWindowName, DWORD dwStyle,
int x, int y, int nWidth, int nHeight,
HWND hWndParent, HMENU hMenu, HINSTANCE hInstance,
LPVOID lpParam) = CreateWindowExW;