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

Есть код, он создает 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
28.03.2019, 14:44
    #39792977
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CreateWindowEx не работает на Win64?
1. Какое сообщение об ошибке (ф-ция GetLastError)
2. Мало информации. Я бы скорее предположил, что дело в режиме компиляции ANSI / Unicode, чем в 32 / 64 битах.
...
Рейтинг: 0 / 0
28.03.2019, 15:00
    #39792987
Devillio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CreateWindowEx не работает на Win64?
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
28.03.2019, 15:17
    #39793010
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CreateWindowEx не работает на Win64?
Едва ли в этом причина, но вообще до первого сообщения выборка сообщений в потоке не создается, что может стать причиной ошибки при отправке через PostThreadMessage либо потери первого сообщения. Почитай MSDN про GetMessage, там описано, как это обойти через event.
...
Рейтинг: 0 / 0
28.03.2019, 15:23
    #39793015
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CreateWindowEx не работает на Win64?
Ну и hInstance в CreateWindowEx не помешает указать
...
Рейтинг: 0 / 0
28.03.2019, 20:10
    #39793311
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CreateWindowEx не работает на Win64?
Ничего не смущает? Вот прям совсем?

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


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