Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Из новых (XE8) DLL нельзя вызывать TOpenDialog/TSaveDialog? / 11 сообщений из 11, страница 1 из 1
16.07.2018, 19:00
    #39674649
nicholaos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из новых (XE8) DLL нельзя вызывать TOpenDialog/TSaveDialog?
Есть функция в DLL, использующая стандартный диалог, например:

library
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
library TestDLL;

uses
  Vcl.Dialogs;

{$R *.res}

procedure ShowSaveDialog; stdcall;
var
  SaveDialog: TSaveDialog;
begin
  SaveDialog := TSaveDialog.Create(nil);
  try
    SaveDialog.Execute;
  finally
    SaveDialog.Free;
  end;
end;

exports ShowSaveDialog;

end.




При вызове:

exe
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure TForm1.Button1Click(Sender: TObject);
var
  h: NativeUInt;
  ShowSaveDialog: procedure; stdcall;
begin
  h := LoadLibrary('C:\Test\TestDLL.dll');
  if h > 0 then begin
    ShowSaveDialog := nil;
    @ShowSaveDialog := GetProcAddress(h, 'ShowSaveDialog');
    if Assigned(ShowSaveDialog) then ShowSaveDialog;
    FreeLibrary(h);
  end;
end;




На SaveDialog.Execute происходит AV. Если тот же код библиотеки скомпилировать на Delphi 2007 - AV нет. Что-то не так с Vcl.Dialogs?
...
Рейтинг: 0 / 0
16.07.2018, 19:21
    #39674653
Dimonka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из новых (XE8) DLL нельзя вызывать TOpenDialog/TSaveDialog?
А отладчик у тебя тоже в Delphi 2007 остался?
...
Рейтинг: 0 / 0
17.07.2018, 10:44
    #39674867
nicholaos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из новых (XE8) DLL нельзя вызывать TOpenDialog/TSaveDialog?
Падает на первой строчке TOpenDialog.DoExecute (см. картинку).

По F7 доходит до _UStrClr, но это ничего не дает.

Использование дата модуля с закинутым на него TSaveDialog'ом не помогло.

Передача хэндла формы в функцию так же не поменяло поведение:

Application.Handle := AHandle;
SaveDialog := TSaveDialog.Create(Application);
...
Рейтинг: 0 / 0
17.07.2018, 10:44
    #39674870
nicholaos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из новых (XE8) DLL нельзя вызывать TOpenDialog/TSaveDialog?
Картинка слетела.
...
Рейтинг: 0 / 0
17.07.2018, 13:55
    #39675031
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из новых (XE8) DLL нельзя вызывать TOpenDialog/TSaveDialog?
авторПадает на первой строчке TOpenDialog.DoExecute (см. картинку).

По F7 доходит до _UStrClr, но это ничего не дает.


а посмотреть в отладчике значения проверяемых переменных и руками раскидать бряки в вызываемых функциях - не?
...
Рейтинг: 0 / 0
17.07.2018, 19:19
    #39675243
nicholaos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из новых (XE8) DLL нельзя вызывать TOpenDialog/TSaveDialog?
Vizit0r,

В этой строке все переменные известны (Win32MajorVersion = 6, UseLatestCommonDialogs = True, Template = nil, все события не определены), кроме 2-х: IsNewCommonCtrl и IsAppThemed.

Первая (IsNewCommonCtrl) - заинлайнена:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
function IsNewCommonCtrl: Boolean; inline;
const
  ComCtlVersionIE6 = $00060000;
begin
  if Comctl32FileVersion = Cardinal(-1) then
    Comctl32FileVersion := GetFileVersion(comctl32);
  Result := Comctl32FileVersion >= ComCtlVersionIE6;
end;


и поэтому я не могу в нее зайти. Однако я попадаю в GetFileVersion(comctl32), которую IsNewCommonCtrl вызывает, и она успешно выполняется.

IsAppThemed определена в Winapi.UxTheme следующим образом:
Код: pascal
1.
IsAppThemed: function: BOOL; stdcall;



Никакие темы в dll само собой не используются.
...
Рейтинг: 0 / 0
17.07.2018, 19:27
    #39675247
nicholaos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из новых (XE8) DLL нельзя вызывать TOpenDialog/TSaveDialog?
Так, а вот в IsAppThemed-то не определена, поскольку InitThemeLibrary не был вызван.

Принудительный вызов InitThemeLibrary перед SaveDialog.Execute починил AV. Но такое решение выглядит бредом.
...
Рейтинг: 0 / 0
18.07.2018, 00:19
    #39675317
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из новых (XE8) DLL нельзя вызывать TOpenDialog/TSaveDialog?
Они не предположили, что в dll будут использоваться диалоги. Пишите в QC.

По идее там надо
Код: pascal
1.
... and Assigned(IsAppTheme) and IsAppTheme() and ...
...
Рейтинг: 0 / 0
18.07.2018, 10:05
    #39675446
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из новых (XE8) DLL нельзя вызывать TOpenDialog/TSaveDialog?
nicholaosТак, а вот в IsAppThemed-то не определена, поскольку InitThemeLibrary не был вызван.

Принудительный вызов InitThemeLibrary перед SaveDialog.Execute починил AV. Но такое решение выглядит бредом.
Решение вызывать диалог из DLL выглядит бредом, а принудительная инициация тем - весьма логична. В 10.1, кстати, условие чуть шире, но IsAppThemed по-прежнему вызывается без проверки.
...
Рейтинг: 0 / 0
18.07.2018, 13:54
    #39675644
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из новых (XE8) DLL нельзя вызывать TOpenDialog/TSaveDialog?
X-CiteОни не предположили, что в dll будут использоваться диалоги. Пишите в QC.

По идее там надоТокуо 10.2 Update 3

Код: pascal
1.
2.
3.
4.
5.
  if (Win32MajorVersion >= 6) and UseLatestCommonDialogs and
     not (TStyleManager.IsCustomStyleActive and (shDialogs in TStyleManager.SystemHooks)) and
     IsNewCommonCtrl and (Template = nil) and IsAppThemed and
     not (Assigned(FOnIncludeItem) or Assigned(FOnClose) or Assigned(FOnShow)) then
  begin
...
Рейтинг: 0 / 0
18.07.2018, 19:01
    #39675842
nicholaos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из новых (XE8) DLL нельзя вызывать TOpenDialog/TSaveDialog?
_Vasilisk_,

Проверил, на 10.2.3 работает. За счет того, что TStyleManager.IsCustomStyleActive вызывает InitThemeLibrary.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Из новых (XE8) DLL нельзя вызывать TOpenDialog/TSaveDialog? / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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