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

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

06.05.2017, 09:49. Показов 1504. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
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
5868 / 4596 / 1448
Регистрация: 14.04.2014
Сообщений: 20,393
Записей в блоге: 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
5868 / 4596 / 1448
Регистрация: 14.04.2014
Сообщений: 20,393
Записей в блоге: 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
886 / 588 / 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
886 / 588 / 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
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
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
Ответ Создать тему
Новые блоги и статьи
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
Что лучше использовать при создании класса в Java: сеттеры или конструктор?
Alexander-7 08.01.2025
Вопрос подробнее: На вопрос: «Когда одновременно создаются конструктор и сеттеры в классе – это нормально?» куратор уточнил: «Ваш класс может вообще не иметь сеттеров, а только конструктор и геттеры. . .
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 07.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru