Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > при закрытии модальной формы вылетает AV


Автор: morpheyushka 16.6.2008, 19:20
Возникла проблема...я разрабатываю окно, которое находится в dll и при подключении к основной программе, при закрытии моего окна вылетае Access Violetion по обращению (записи) к памяти по адресу 0x00...вобщем полнейший nil. Но самое интересное, что у меня такая ошибка не возникает. Я всё разрабатывал в Коде Гир 2007, а основная программа в делфи 7. Возможно ли эта ошибка вылетает из-за разных версий, или что то не так у меня?
Привожу код:

dll - вызов формы:
Код

function BetMessageShow(AppHandle: THandle; Connect, Login, Passwd: WideString): Integer;
begin
  Application.Handle := AppHandle;
  BetMessage := TBetMessage.Create(Application);
  BetMessage.Connection.ConnectionString := Connect;
  BetMessage.Connection.Open(Login, Passwd);
  Result := BetMessage.ShowModal;
  BetMessage.Free;
end;


при выходе из этой процедуры (та что выше...то есть BetMessage.Free; end; - а именно после end) вылетает AV

в exe
Код

procedure TMainForm.acOutlookExecute(Sender: TObject);
begin
  BetMessageShow(Application.Handle, ConnString, CurUser, CurPassword);
end;

Автор: RomanEEP 17.6.2008, 10:54
Мне кажется проблема в разных менеджерах памяти и работой со строками. Попробуй для теста выкинуть строковые параметры из библиотечной процедуры.

Автор: morpheyushka 17.6.2008, 14:49
пробовал...нормально выбрасывает все параметры, мне кажется нужно побаловаться с директивами вызова

Автор: ama_kid 17.6.2008, 15:17
morpheyushka
1) проверяй, что у тебя в конструкторе\деструкторе формы - возможно там идёт некорректная работа с динамическими объектами.
2) Ты передаешь в конструктор формы объект Application dll, заодно присваивая ему хендл основного приложения (строка присваивания хендла убила, если честно  smile ), таким образом присваивая ему Owner'а. Но освобождаешь - сам. Имхо - так нельзя... Попробуй передавать nil в Create...
3) Ну и еще одно:
Цитата(Delphi Help)
To free a form, call its Release method, which destroys the form and releases the memory allocated for it after all its event handlers and those of the components it contains are through executing.

Автор: aktuba 17.6.2008, 15:23
Цитата(RomanEEP @  17.6.2008,  11:54 Найти цитируемый пост)
Мне кажется проблема в разных менеджерах памяти и работой со строками. Попробуй для теста выкинуть строковые параметры из библиотечной процедуры. 

С WideString таких проблем нет.

Цитата(morpheyushka @  17.6.2008,  15:49 Найти цитируемый пост)
пробовал...нормально выбрасывает все параметры, мне кажется нужно побаловаться с директивами вызова 

Вот это правильно.

Автор: morpheyushka 17.6.2008, 15:50
Цитата(ama_kid @  17.6.2008,  15:17 Найти цитируемый пост)
Попробуй передавать nil в Create...

2 ama_kid, пробовал - тоже самое(((
я присваивал хэндл для того, чтобы и приложение и моя форма из dll были в одной панели. Подскажи как это сделать правильно.
И ещё - как посмотреть конструктор\деструктор формы?)))

Автор: ama_kid 17.6.2008, 16:06
Цитата(morpheyushka @  17.6.2008,  15:50 Найти цитируемый пост)
как это сделать правильно.
Можешь выложить максимально обрезанные исходинки проекта, где наблюдается исходная проблема? С нуля в лом создавать, к тому же не факт, что она у меня проявится, если я сам начну моделировать ситуацию...

Автор: morpheyushka 17.6.2008, 16:09
всё...тема закрыта - как я и предпологал - нужно было побаловаться с директивами вызова....как видно по коду - у меня стоит безопасный вызов, а exe, которое вызывает мою форточку, скорее всего stdcall. Я сменил у себя в объявлении на стандартный вызов и всё заработало. Просто у меня не было исходника exe - это совместный проект.

огромное всем спасибо за внимание

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)