Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> AV на FreeLibrary со своей DLL 
:(
    Опции темы
SergSW
Дата 30.7.2009, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 14.9.2006

Репутация: нет
Всего: нет



Использую свою DLL.
Загрузил, проинициализировал, из DLL получаю интерфейсный объект, провожу с ним работу, всё ок
Удаляю объект (никаких ошибок, деструктор вызывается).
После этого пытаюсь выгрузить Dll на этом падает.

Код

  Result := Handle <> 0;
  if Result then
    Result := FreeLibrary(Handle); // здесь падает


с такой ошибкой

---------------------------
Debugger Fault Notification
---------------------------
Project Sample.exe raised too many consecutive exceptions: 'access violation at 0x00000000: read of address 0x00000000'. Process Stopped. Use Step or Run to continue.
---------------------------
OK   Help   
---------------------------

В библиотеке использую ShareMem.

PS если убрать FreeLibrary, AV не появляется
PM   Вверх
Romikgy
Дата 30.7.2009, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



а раньше по коду нигде не встречается 
Цитата(SergSW @  30.7.2009,  07:48 Найти цитируемый пост)
FreeLibrary(Handle);

?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
SergSW
Дата 30.7.2009, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 14.9.2006

Репутация: нет
Всего: нет



Конечно нигде больше не идёт
 более того
Код

function FreeDll: Boolean;
begin
  Result := Handle <> 0;
  if Result then
    Result := FreeLibrary(Handle);
end;

...
    IntfObj := nil; // здесь уничтожаем интерфейсный объект и всё работает. Проверено под отладчиком
    FreeDll; // здесь вызываем FreeLibrary. Под отладчиком код на DLL_PROCESS_DETACH отрабатывает без ошибок


PS Такое ощущение что сама система выгружает без ошибок. Т.к. без FreeLibrary, судя по ProcessExplorer утечки памяти не происходит

PPS Действительно осводождает, но всё равно некрасиво убирать FreeLibrary

Это сообщение отредактировал(а) SergSW - 30.7.2009, 09:44
PM   Вверх
CodeMonkey
Дата 30.7.2009, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Код целиком можно?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
SergSW
Дата 30.7.2009, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 14.9.2006

Репутация: нет
Всего: нет



Полностью привести код к сожалению немогу

Вот набросал тестовый примерчик на нём тоже самое получается
Код

//DLL
library Project2;
uses
  ShareMem,
  Windows,
  ActiveX,
  SysUtils,
  Classes;


{$R *.res}

procedure DLLEntryPoint(Reason: Word);
begin
 case Reason of
  DLL_PROCESS_ATTACH: CoInitialize(nil);
  DLL_PROCESS_DETACH: CoUninitialize;
 end;
end;

function CreateObj: IInterface;
begin
  Result := TInterfacedObject.Create;
end;  

exports
  CreateObj;

begin
  DLLProc := @DLLEntryPoint;
  DLLEntryPoint(DLL_PROCESS_ATTACH);
end.

// Test exe
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TProc = function : IInterface;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  H: THandle;
  Obj: IInterface;
  P: TProc;
begin
  H := LoadLibrary('project2.dll');
  try
    P := GetProcAddress(H, 'CreateObj');
    Obj := P;
    Obj := nil;
  finally
    FreeLibrary(H); // тут падает
  end;
end;

end.




PS в тестовой удалось решить проблему убрав модуль ShareMem, почему он вызывает ошибку понять не могу.
В рабочем варианте убрать не могу, при работе с объектами начинает валиться

Это сообщение отредактировал(а) SergSW - 30.7.2009, 10:11
PM   Вверх
MetalFan
Дата 30.7.2009, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



имхо не стоит в DllMain пихать CoInitialize/Uninitialize....
Цитата(MSDN)

The entry-point function should perform only simple initialization or termination tasks.
....
Calling functions that require DLLs other than Kernel32.dll may result in problems that are difficult to diagnose. For example, calling User, Shell, and COM functions can cause access violation errors, because some functions load other system components. Conversely, calling functions such as these during termination can cause access violation errors because the corresponding component may already have been unloaded or uninitialized.
....



--------------------
There are always someone smarter than you...
PM MAIL   Вверх
SergSW
Дата 30.7.2009, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 14.9.2006

Репутация: нет
Всего: нет



и без них валится

Это сообщение отредактировал(а) SergSW - 30.7.2009, 11:51
PM   Вверх
CodeMonkey
Дата 30.7.2009, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Цитата(SergSW @  30.7.2009,  10:03 Найти цитируемый пост)
в тестовой удалось решить проблему убрав модуль ShareMem, почему он вызывает ошибку понять не могу.

ShareMem присутствует первым модулем в dpr-файле?


Цитата(SergSW @  30.7.2009,  10:03 Найти цитируемый пост)
DLL_PROCESS_ATTACH: CoInitialize(nil);

DllMain и жизнь до родов:
Цитата
DllMain - это оружие, из которого вы легко можете застрелиться

Скольких вы знаете людей, которые хоть раз делели такие грубейшие ошибки, как вызов CoInitialize в DllMain? Я знаю случаи, когда это делали в ответ на DLL_THREAD_ATTACH, что означает, что мы не только рискуем попасть на deadlock, но и что COM будет инициализирован в каждом потоке. Что ещё хуже, он может быть инициализирован с неверной потоковой моделью. А потом эти люди будут удивляться: как это у них получились STA-потоки в потоковых пулах.



--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
SergSW
Дата 30.7.2009, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 14.9.2006

Репутация: нет
Всего: нет



Цитата(CodeMonkey @  30.7.2009,  14:36 Найти цитируемый пост)
ShareMem присутствует первым модулем в dpr-файле?

первым

Убрал из Dllmain CoInitialize/Uninitialize - жить легче не стало
PM   Вверх
CodeMonkey
Дата 30.7.2009, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



У меня не воспроизводится.

Проблемы начинаются только если неправильно подключать ShareMem. Если правильно или без него - всё работает.
Какая версия Delphi?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
SergSW
Дата 31.7.2009, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 14.9.2006

Репутация: нет
Всего: нет



Delphi7

Добавлено через 47 секунд
Цитата(CodeMonkey @  30.7.2009,  17:33 Найти цитируемый пост)
Проблемы начинаются только если неправильно подключать ShareMem

это как?
PM   Вверх
SergSW
Дата 31.7.2009, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 14.9.2006

Репутация: нет
Всего: нет



Попробовал вместо ShareMem использовать FastMM, теперь через раз падает... забавно

Поправлюсь! Падает теперь не на FreeLibrary а при выходе из программы, при условии что из библиотеки был получен хотябы один интерфейс. Поробую покопать мож где дважды уничтожить пытается

Это сообщение отредактировал(а) SergSW - 31.7.2009, 11:12
PM   Вверх
MetalFan
Дата 31.7.2009, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Выложи лучше аттачем тестовый проект, на котором ошибка воспроизводится. Может что прояснится


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
SergSW
Дата 31.7.2009, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 14.9.2006

Репутация: нет
Всего: нет



Собственно полный код и так выше приводил
 
ЗЫ В тестовом примере с FastMM не возникает а с ShareMem падает

Присоединённый файл ( Кол-во скачиваний: 13 )
Присоединённый файл  Test.rar 215,51 Kb
PM   Вверх
CodeMonkey
Дата 31.7.2009, 13:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Цитата(SergSW @  31.7.2009,  10:19 Найти цитируемый пост)
это как?

Это подключать не первым или только в одном проекте. Вы уж по ссылочкам-то не ленитесь гулять. Я их не просто так ставлю.

Цитата(SergSW @  30.7.2009,  14:12 Найти цитируемый пост)
ShareMem присутствует первым модулем в dpr-файле?

первым

Ну и зачем вы врёте?

Вот ваш uses из Test.rar/Project1.dpr:

Код
uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};


В каком месте здесь ShareMem? У вас в exe-проекте ShareMem вообще не подключен.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1087 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.