user32.dll 中不再存在 CreateWindow

CreateWindow doesn't exist in user32.dll any more

我发现 CreateWindowACreateWindowW 不再存在于 Windows 10 的 user32.dll 文件中。你有没有看到微软关于这方面的公告?

当我注意到 Delphi 的 Winapi.Windows 文件中它们被模拟时,我发现了这一点。

更新

我好像忽略了,在Delphi6中这些函数也是使用了CreateWindowEx的宏。大卫可能是对的,这些函数在 Win16 中只有 DLL 入口点。 Windows XP SP3 中绝对没有它们。

CreateWindowACreateWindowExA 的宏,CreateWindowWCreateWindowExW 的宏,两者都存在于 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到CreateWindowWCreateWindowA。以下是这些功能的实际实现方式:

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 导入名为 CreateWindowWCreateWindowA 的函数而失败,那么问题不在于 user32 已更改,您的代码完全错误地期望具有这些名称的函数存在。