powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / CreateWindowEx не работает на Win64?
7 сообщений из 7, страница 1 из 1
CreateWindowEx не работает на Win64?
    #39792968
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Есть код, он создает WebBrowser в потоке
начинается так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
var
  wHandle: HWND;
begin
  try
    CoInitialize(nil);

    FillChar(WndClass, SizeOf(WndClass), 0);
    with WndClass do
    begin
      cbSize := SizeOf(WndClass);
      lpszClassName := 'MESSAGE_ONLY_WINDOW'; //PWideChar('STATIC'); 
      lpfnWndProc := @DefWindowProc;
    end;
    RegisterClassEx(WndClass);

    wHandle := CreateWindowEx(0, WndClass.lpszClassName, nil,
      0, 0, 0, 0, 0, DWORD(HWND_MESSAGE), 0, 0, nil);
    if (wHandle = 0) then //<- тут всегда 0 когда x64
      raise Exception.Create('CreateWindowEx');

    if (CoCreateInstance(CLSID_InternetExplorer, nil, CLSCTX_INPROC_SERVER,
      IID_IWebBrowser2, wb) <> S_OK) then
      raise Exception.Create('CoCreateInstance');

      AtlAxAttachControl(wb, wHandle, nil);
...


На x86 код работает исправно, на x64 wHandle всегда возвращается 0.
Код сворованный, не знаю что дальше смотреть, подскажите, будьте добры!

Спасибо!
...
Рейтинг: 0 / 0
CreateWindowEx не работает на Win64?
    #39792977
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Какое сообщение об ошибке (ф-ция GetLastError)
2. Мало информации. Я бы скорее предположил, что дело в режиме компиляции ANSI / Unicode, чем в 32 / 64 битах.
...
Рейтинг: 0 / 0
CreateWindowEx не работает на Win64?
    #39792987
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev, благодарю за отзыв
GetLastError: 1400: Недопустимый дескриптор окна
функция целиком
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
function httpByWebBrowser(const aURL: string): string;
var
  WB: IWebBrowser2; // TWebBrowser;
  DT: TDateTime;
  wHandle: HWND;
  T: String;
var
  WndClass: TWndClassEx;

  function WB_GetHTMLCode(WebBrowser: IWebBrowser2; var ACode: String): boolean;
  var
    ps: IPersistStreamInit;
    ss: TStringStream;
    sa: IStream;
    s: string;

  begin
    s := '';
    ss := TStringStream.Create(s);
    ps := WebBrowser.Document as IPersistStreamInit;
    try
      sa := TStreamAdapter.Create(ss, soReference) as IStream;
      Result := Succeeded(ps.Save(sa, True));
      if Result then
        ACode := UTF8ToString(ss.Datastring);
    finally
      ss.Free;
    end;
  end;

  procedure ProcessMessage(wHandle: HWND);
  var
    Msg: TMsg;
  begin
    while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
    begin
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    end;
  end;

begin
  try
    CoInitialize(nil);

    FillChar(WndClass, SizeOf(WndClass), 0);
    with WndClass do
    begin
      cbSize := SizeOf(WndClass);
      lpszClassName := PWideChar('STATIC'); // MESSAGE_ONLY_WINDOW
      lpfnWndProc := @DefWindowProc;
    end;
    RegisterClassEx(WndClass);

    wHandle := CreateWindowEx(0, WndClass.lpszClassName, nil, 0, 0, 0, 0, 0, DWORD(HWND_MESSAGE), 0, 0, nil);
    if (wHandle = 0) then
    begin
      raise Exception.Create('CreateWindowEx'#13#10 + IntToStr(GetLastError));
    end;

    if (CoCreateInstance(CLSID_InternetExplorer, nil, CLSCTX_INPROC_SERVER, IID_IWebBrowser2, WB) <> S_OK) then
      raise Exception.Create('CoCreateInstance');

    AtlAxAttachControl(WB, wHandle, nil);

    DT := Now();
    WB.Silent := True;
    WB.Navigate(aURL, EmptyParam, EmptyParam, EmptyParam, EmptyParam);

    while (WB.ReadyState <> READYSTATE_COMPLETE) and (SecondsBetween(Now(), DT) < 15) do
    begin
      ProcessMessage(wHandle);
      Sleep(10);
    end;
    T := '';
    if SecondsBetween(Now(), DT) < 12 then
      WB_GetHTMLCode(WB, T);
    Result := T;

  finally
    WB := nil;
    DestroyWindow(wHandle);
    CoUninitialize;
  end;
end;



Webbrowser нужен, т.к. в страницах скрипты, текст нужен полный после их отработки, IdHttp или NetClient не подходят. И надо в потоке, т.к. задача фоновая.
...
Рейтинг: 0 / 0
CreateWindowEx не работает на Win64?
    #39793010
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Едва ли в этом причина, но вообще до первого сообщения выборка сообщений в потоке не создается, что может стать причиной ошибки при отправке через PostThreadMessage либо потери первого сообщения. Почитай MSDN про GetMessage, там описано, как это обойти через event.
...
Рейтинг: 0 / 0
CreateWindowEx не работает на Win64?
    #39793015
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и hInstance в CreateWindowEx не помешает указать
...
Рейтинг: 0 / 0
CreateWindowEx не работает на Win64?
    #39793311
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего не смущает? Вот прям совсем?

DWORD (HWND_MESSAGE)
...
Рейтинг: 0 / 0
CreateWindowEx не работает на Win64?
    #39793423
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GunSmoker, преогромнейше благодарю!
DWORD_PTR(HWND_MESSAGE) поехало
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / CreateWindowEx не работает на Win64?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]