user32.dll 中不再存在 CreateWindow
CreateWindow doesn't exist in user32.dll any more
我发现 CreateWindowA
和 CreateWindowW
不再存在于 Windows 10 的 user32.dll
文件中。你有没有看到微软关于这方面的公告?
当我注意到 Delphi 的 Winapi.Windows
文件中它们被模拟时,我发现了这一点。
更新
我好像忽略了,在Delphi6中这些函数也是使用了CreateWindowEx
的宏。大卫可能是对的,这些函数在 Win16 中只有 DLL 入口点。 Windows XP SP3 中绝对没有它们。
CreateWindowA
是 CreateWindowExA
的宏,CreateWindowW
是 CreateWindowExW
的宏,两者都存在于 user32.dll on Windows10.
来自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)
恐怕你提问的前提是不正确的。 Delphi6Windows
单元不link到CreateWindowW
或CreateWindowA
。以下是这些功能的实际实现方式:
function CreateWindow(lpClassName: PChar; lpWindowName: PChar;
dwStyle: DWORD; X, Y, nWidth, nHeight: Integer; hWndParent: HWND;
hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND;
begin
Result := CreateWindowEx(0, lpClassName, lpWindowName, dwStyle, X, Y,
nWidth, nHeight, hWndPar, hMenu, hInstance, lpParam);
end;
function CreateWindowA(lpClassName: PAnsiChar; lpWindowName: PAnsiChar;
dwStyle: DWORD; X, Y, nWidth, nHeight: Integer; hWndParent: HWND;
hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND;
begin
Result := CreateWindowExA(0, lpClassName, lpWindowName, dwStyle, X, Y,
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
end;
function CreateWindowW(lpClassName: PWideChar; lpWindowName: PWideChar;
dwStyle: DWORD; X, Y, nWidth, nHeight: Integer; hWndParent: HWND;
hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND;
begin
Result := CreateWindowExW(0, lpClassName, lpWindowName, dwStyle, X, Y,
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
end;
如您所见,这反映了它们在 Windows 头文件中的实现,如 所示。
如果您的代码因为尝试从 user32
导入名为 CreateWindowW
或 CreateWindowA
的函数而失败,那么问题不在于 user32
已更改,您的代码完全错误地期望具有这些名称的函数存在。
我发现 CreateWindowA
和 CreateWindowW
不再存在于 Windows 10 的 user32.dll
文件中。你有没有看到微软关于这方面的公告?
当我注意到 Delphi 的 Winapi.Windows
文件中它们被模拟时,我发现了这一点。
更新
我好像忽略了,在Delphi6中这些函数也是使用了CreateWindowEx
的宏。大卫可能是对的,这些函数在 Win16 中只有 DLL 入口点。 Windows XP SP3 中绝对没有它们。
CreateWindowA
是 CreateWindowExA
的宏,CreateWindowW
是 CreateWindowExW
的宏,两者都存在于 user32.dll on Windows10.
来自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)
恐怕你提问的前提是不正确的。 Delphi6Windows
单元不link到CreateWindowW
或CreateWindowA
。以下是这些功能的实际实现方式:
function CreateWindow(lpClassName: PChar; lpWindowName: PChar;
dwStyle: DWORD; X, Y, nWidth, nHeight: Integer; hWndParent: HWND;
hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND;
begin
Result := CreateWindowEx(0, lpClassName, lpWindowName, dwStyle, X, Y,
nWidth, nHeight, hWndPar, hMenu, hInstance, lpParam);
end;
function CreateWindowA(lpClassName: PAnsiChar; lpWindowName: PAnsiChar;
dwStyle: DWORD; X, Y, nWidth, nHeight: Integer; hWndParent: HWND;
hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND;
begin
Result := CreateWindowExA(0, lpClassName, lpWindowName, dwStyle, X, Y,
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
end;
function CreateWindowW(lpClassName: PWideChar; lpWindowName: PWideChar;
dwStyle: DWORD; X, Y, nWidth, nHeight: Integer; hWndParent: HWND;
hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND;
begin
Result := CreateWindowExW(0, lpClassName, lpWindowName, dwStyle, X, Y,
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
end;
如您所见,这反映了它们在 Windows 头文件中的实现,如
如果您的代码因为尝试从 user32
导入名为 CreateWindowW
或 CreateWindowA
的函数而失败,那么问题不在于 user32
已更改,您的代码完全错误地期望具有这些名称的函数存在。