{{notification.text}}

MirGames

19.05.14 11:01
0

Всем привет.
Есть библиотека DLL, в которой я создаю форму и описываю оконную процедуру.
Проблема в вызове функции MessageBox. Сам диалог не появляется, но стандартный звук windows при этом проигрывается.
Сама форма при этом не блокируется и не теряет фокус. Окна с сообщением не наблюдается ни над формой, ни под формой, ни на панели задач, нигде.

Создаю окно так:

// Пытался подсунуть и хэндл библиотеки и хэндл вызывающего приложения. В отладчике вижу, что каждый раз значение разное
h_Instance := GetModuleHandle( 'Window.dll' ); // настоящая dll
//h_Instance := GetModuleHandle( 'API.exe' );  // вызывающий exe`шник

// настраиваю класс окна. пробовал разные комбинации стилей
WindowClass.style            := CS_HREDRAW or CS_VREDRAW {or CS_OWNDC};
WindowClass.lpfnWndProc      := @WindowProc;
WindowClass.hInstance        := h_Instance;
WindowClass.hCursor          := LoadCursor( 0, IDC_ARROW );
WindowClass.lpszClassName    := PChar( DEFAULT_CLASS_NAME );  // некая строковая константа
WindowClass.cbClsExtra       := 0;
WindowClass.cbWndExtra       := 0;
WindowClass.hIcon            := LoadIcon ( 0, IDI_APPLICATION );
WindowClass.hbrBackground    := GetStockObject( WHITE_BRUSH );
WindowClass.lpszMenuName     := '';

// регистрирую класс
RegisterClass( WindowClass );

// наборы констант  для CreateWindowEx
    dwStyle   :=  WS_OVERLAPPEDWINDOW {or
                  WS_CLIPCHILDREN or
                  WS_CLIPSIBLINGS};
    dwExStyle :=  {WS_EX_APPWINDOW or}
                  WS_EX_WINDOWEDGE;

// создаю окно
Handle := CreateWindowEx(
  dwExStyle,
  PChar( DEFAULT_CLASS_NAME ),  // некая строковая константа
  PChar( DEFAULT_CLASS_NAME ) ,
  dwStyle,
  0,
  0,
  wWidth,
  wHeight,
  0,
  0,
  h_Instance,  // это всё тот же Instance, так ведь?
  nil );

Окно создаётся, ошибок нет.
Далее описываю оконную процедуру

//процедура обработки сообщений windows
function WindowProc ( WinHndl : HWND; WinMsg: UINT; WParam : WPARAM; LParam : LPARAM ) : LRESULT; stdcall;
  begin

    case WinMsg of
                         // например обрабатываю левый клик
      WM_LBUTTONDOWN: begin
                        // здесь Handle который я получил выше при создании окна
                        MessageBox( Handle, PWideChar( 'Message' ), PWideChar( 'Caption' ), 0 );  
                        // или пробовал так, "общее" окно
                        //MessageBox( 0, PWideChar( 'Message' ), PWideChar( 'Caption' ), 0 );
                      end;
    end;

    //вызываю дефолтный обработчик
    Result := DefWindowProc( WinHndl, WinMsg, WParam, LParam );

  end;

Вызывал функцию MessageBox и в основном приложении и в DLL - результат один - звук появляется, самого окна-сообщения нигде нет.
Моё окно не блокируется, даёт себя таскать и сворачивать.
Сама функция MessageBox всегда возвращает 0, GetLastError() возвращает 0. MSDN говорит, что:
[Quote]If the function fails, the return value is zero. To get extended error information, call GetLastError.[/Quote]

Или я неправильно создаю окно (неправильный h_Instance или стили), или я не обрабатываю какое-то нужное сообщение windows или что ещё может быть? Помогите! )

Отредактировано: 19.05.14 11:01
#1
Хранитель Флейма
19.05.14 11:14
0

Пишешь свой двиг на делфи, поди?

#2
19.05.14 11:33
0

Вы поразительно догадливы.

#3
MirGames Dev
19.05.14 11:47
0

Странно. MessageBox - простейшая системная функция, ей в общем-то не требуется ни окно, ни обработка сообщений. Я не уверен насчет PWideChar. Можно попробовать явно вызывать MessageBoxA или MessageBoxW с разными типами строк. Какая версия Delphi, кстати?

#4
19.05.14 12:03
0

XE4.
Ну с VCL формой таких проблем нет.
DLL линкую динамически.
А PWideChar - это от безысходности. Я все варианты испробовал.

Отредактировано: 19.05.14 12:05
#5
MirGames Dev
19.05.14 12:38
0

А PWideChar - это от безысходности. Я все варианты испробовал.

А явно вызвать MessageBoxW? Или можно ещё посмотреть, как внутри VLC реализован MessageBox.

#6
20.05.14 04:48
0

Методом "тыка" установил, что во всём виновата директива компилятору - {$R *.res}.
Если её убрать, MessageBox работает как и должен.
В самом файле ресурсов стандартная дельфийская иконка и манифест.
Собственно проблема решена, но в целях любопытства - кто знает, как файл ресурсов влияет на вывод MessageBox?

Отредактировано: 20.05.14 04:49
#7
MirGames Dev
20.05.14 14:23
0

Мэджик какой-то. Разве что локализация как-то портит MessageBox, но это очень странно. Не нашел нигде в интернете ни упоминаний о связи ресурсов и MessageBox, ни похожих проблем.

#{{post.Index}}
{{post.Author.Login}}
{{post.CreatedDate | date:'dd.MM.yy HH:mm'}}
{{post.VotesRating}}
Отредактировано: {{post.UpdatedDate | date:'dd.MM.yy HH:mm'}}