Форум программистов, компьютерный форум, киберфорум
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 1
Регистрация: 09.06.2014
Сообщений: 19
1

Ошибка: Access Violation при создании MDIChild формы в dll XE7

06.05.2017, 09:49. Показов 1428. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте коллеги.
Два дня бьюсь, не могу решить, очень нужна ваша помощь.

Суть проблемы: есть приложение написанное на delphi 7, из него подгружаю .dll на XE7 и запускаю её процедуру, вот этим кодом
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procedure TDocForm.ToolButton5Click(Sender: TObject);
var
   PrepareTickets:procedure(MainApp:HWND;ConObj:_Connection;idDoc:Integer);cdecl;
begin
   Tickets := LoadLibrary('TicketsProject.dll');
   if Tickets = 0 then
   begin
      MessageDlg('Неудалось загрузить библиотеку TicketsProject.dll.',mtInformation,[mbOk],0);
      Exit;
   end;
   @PrepareTickets:=nil;
   @PrepareTickets:=GetProcAddress(Tickets,'PrepareTickets');
 
   if (@PrepareTickets = nil) then
   begin
      MessageDlg('Не найдена искомая процедура!',mtInformation,[mbOK],0);
      FreeLibrary(Tickets);
   end
   else
   begin
      PrepareTickets(Application.Handle,Connection.ConnectionObject,DataSet.FieldByName('idDoc').Value);
   end;
end;
В .dll это единственная экспортируемая процедура, и всё что она должна делать - создать MDIChild форму.
Формой MDIForm является главная форма вызывающего приложения. Что бы создать дочернюю форму с AOwner = MainForm(главного приложения) передаю Application.Handle:HWND вызывающего приложения параметром.

Код .dll
Delphi
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
var
  DllAppHandle:HWND;
 
{$R *.res}
 
procedure PrepareTickets(MainApp:HWND;ConObj:_Connection;idDoc:Integer);cdecl;
begin
   DllAppHandle := Application.Handle;
   Application.Handle := MainApp;
   fTickets := TfTickets.Create(Application.MainForm);
   LockWindowUpdate(Application.Handle);
end;
 
procedure MyDllProc(Reason: Integer);
begin
   if Reason = DLL_PROCESS_DETACH then
   begin
      if DllAppHandle<>0 then
         Application.Handle := DllAppHandle;
   end;
end;
 
exports
   PrepareTickets;
 
begin
   DllProc:=@MyDllProc;
end.
А форма вообще пустая.

Так вот процедура эта рубиться на создании формы, ошибка:
Access violation at address 00403EA0 in modele ВызывающееПриложение.exe. Read of address F28B562F.
При том когда я компилю эту .dll на delphi 7 все работает, но мне нужно на XE7. Если formStyle ставлю в fsNormal тоже работает.
Не знаю что и делать, нужна ваша помощь.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.05.2017, 09:49
Ответы с готовыми решениями:

TList. Ошибка Access Violation при создании.
Имеется такая структура данных: type TMyList = class private FMyList: TList; public...

F1book delphi 7 в windows 7 access violation in module 'oc30.dll' при попытке записи
Может кто нибудь сталкивался с такой проблемой. Компонент F1book delphi 7 в windows 7 выдаёт...

Косяк при создании MDIChild форм
привет всем ! В общем вопрос-то простой, КАК заставить родительскую MDI-форму НЕ ТРОГАТЬ РАЗМЕР...

Ошибка 'Access violation' при динамическом создании idHTTP
Приветствую. Создал функцию: function RunMethod(MethodName, Params, Token, Version: string):...

11
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,160
Записей в блоге: 20
06.05.2017, 10:39 2
а как вы вообще миксуете приложения, одно из которых работает с юникодными строками, а другое с анси?
0
0 / 0 / 1
Регистрация: 09.06.2014
Сообщений: 19
06.05.2017, 12:33  [ТС] 3
Цитата Сообщение от krapotkin Посмотреть сообщение
а как вы вообще миксуете приложения, одно из которых работает с юникодными строками, а другое с анси?
а что это может стать проблемой, ведь я не передаю строковые параметры?

Добавлено через 1 минуту
А извиняюсь, описался немного, в Delphi 7 так как написано с передачей Handle'а не работает, а работает с TApplication
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,160
Записей в блоге: 20
06.05.2017, 17:52 4
форма сама отлично обращается к RTL
а RTL - другая
0
0 / 0 / 1
Регистрация: 09.06.2014
Сообщений: 19
07.05.2017, 23:59  [ТС] 5
На сколько я понял проблема в том что главная форма приложения недоступна из .dll как собственно и все остальные обьекты. Если так, то встает вопрос что делать чтоб были доступны?
0
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
09.05.2017, 21:00 6
Делать "формы" в DLL и как-либо связывать их с "формами" в EXE - как бы вообще не рекомендуется.

Про ShareMem не забыли кстати?
library Project1;

{ Important note about DLL memory management: ShareMem must be the
first
unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
Добавлено через 27 секунд
З.Ы. http://www.gunsmoker.ru/2009/01/blog-post.html
1
0 / 0 / 1
Регистрация: 09.06.2014
Сообщений: 19
10.05.2017, 11:45  [ТС] 7
Я заюзал ShareMem в .dpr вызывающего приложения, и .dpr .dll'ки, не помогло
0
0 / 0 / 1
Регистрация: 09.06.2014
Сообщений: 19
12.05.2017, 16:42  [ТС] 8
Я понимаю что нехорошо но тут уже чисто спортивный интерес, понять почему не работает и что можно сделать. А еще когда создавал обычную форму в .dll тоже несколько раз славил AV не смотря на заюзаный sharemem. У меня такое чувство что у приложения и .dll всеровно свои собственные менеджеры памяти!?
0
884 / 586 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
13.05.2017, 18:40 9
Посмотреть бы что ли весь проект... Или вернее сказать - оба.

Добавлено через 1 минуту
Delphi
1
DllAppHandle := Application.Handle;
Delphi
1
Application.Handle := MainApp;
Delphi
1
Application.Handle := DllAppHandle;
гм? Это чё за финты вообще..? о____0
0
0 / 0 / 1
Регистрация: 09.06.2014
Сообщений: 19
15.05.2017, 17:36  [ТС] 10
Это я application .dll-ки заменяю на оный вызывающего приложения, зачем не знаю, в примерах которые видел так...?
0
Заблокирован
18.05.2017, 00:02 11
Цитата Сообщение от koshchei Посмотреть сообщение
DllAppHandle := Application.Handle; Application.Handle := MainApp;
В DLL нет объекта Application.

Не по теме:

p.s.: Код чрезвычайно грязный, отрубите себе руки, картонным мечом.

0
884 / 586 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
18.05.2017, 15:43 12
Application не "в dll" и не "в exe", оно в модуле "Forms". Если в dll используется этот модуль - значит создаётся Application.
Другое дело что эти непонятные финты совсем непонятные, тем более что зачем не знаю.
0
18.05.2017, 15:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.05.2017, 15:43
Помогаю со студенческими работами здесь

Ошибка Access Violation в Delphi XE7
Начала работать на форме. Загрузила одно изображение, второе (больше ничего не делала). Запустила....

Ошибка access violation executing location при динамическом подключении dll
Товарищи, помогите понять, что я упустил. Делаю все dроде как в статьях пишут, но возникает ошибка...

Ошибка при создании массива "Access violation. Link terminated"
создается массивы float X, Y, Z, E,F,Fan; все отлично но при попытке увеличить размер до...

Запуск DLL. При работе с потоками появляется ошибка "Access violation"
Здравствуйте, у меня вопрос. Я запускаю dll через консоль с помощью RUNDLL32.EXE В библиотеке...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru