Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2009, 16:46   #1
prizrak1390
-=PriZraK=-
Форумчанин
 
Аватар для prizrak1390
 
Регистрация: 12.12.2007
Сообщений: 399
Вопрос Крах при выгрузке DLL

Доброе время суток уважаемые программисты!
Вот столкнулся с проблемой...
Пишу DLL-ку,подключаю её в своей программе,вызываю форму из dll,форма ведёт себя адекватно,закрывается и открывается без ошибок. Но вот при закрытия окна программы из которой и вызывалась DLL, происходят ошибки сначала,что-то с Pointer, а затем run time error....

Вот код проги вызывающей функцию из dll:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,sharemem{Где-то вычитал,что это может помочь........};

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure FormShow(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
Function regist(Handle:Thandle):byte; Stdcall; External 'project1.dll';

procedure TForm1.FormShow(Sender: TObject);
begin
Regist(application.Handle)
end;

end.
Вот код DLL, но без кода форм и без шифрующих алгоритмов(вода):
Код:
library Project1;

uses
  SysUtils,Classes,registry,windows,forms,dialogs,sharemem,
  Unit1 in 'Unit1.pas' {registration},
  Unit2 in 'Unit2.pas' {manual};

{$R *.res}

...
{тут идет описание функций шифрования: MD5,BASE64 и функция для работы с реестром,получающая тип процессора}
...
function regist(Handle:Thandle):byte;stdcall;
var
Rform:Tregistration;
 begin
 Application.Handle:=Handle;
 rform:=Tregistration.Create(Nil);
 unit1.gapp:=Application; {в первой форме GAPP:TAPPLICATION}
 Rform.ShowModal;
 Rform.free;
 result:=1; 
end;


Exports regist;
begin

end.
Вот как-то так...
prizrak1390 вне форума Ответить с цитированием
Старый 11.09.2009, 17:24   #2
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

ShareMem следует писать первым в uses.
Somebody вне форума Ответить с цитированием
Старый 11.09.2009, 17:35   #3
prizrak1390
-=PriZraK=-
Форумчанин
 
Аватар для prizrak1390
 
Регистрация: 12.12.2007
Сообщений: 399
По умолчанию

Somebody, не помогло....
prizrak1390 вне форума Ответить с цитированием
Старый 11.09.2009, 17:53   #4
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Попробуйте поставить брейк-поинты и отловить место с ошибкой
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 11.09.2009, 18:03   #5
prizrak1390
-=PriZraK=-
Форумчанин
 
Аватар для prizrak1390
 
Регистрация: 12.12.2007
Сообщений: 399
По умолчанию

russian-stalker, в программе всего 1-на строчка:
Код:
Regist(application.Handle)
Отлавливать в DLL не получится,так как у меня слегка крякнулся делфи и установить HostApplication не получается...Так что средств для отладки как таковых нетю...Да и явных ошибок нет и в процессе работы не возникает проблем...только при закрытии главной(вызывающей) программы.
prizrak1390 вне форума Ответить с цитированием
Старый 11.09.2009, 18:07   #6
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Ну я длл отлаживал установив после каждой строчку Showmessage('Nomer strochki'); и после смотрел где программа стопорится(не сочтите за мазохиста, но по мне это очень быстрый способ).
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 11.09.2009, 18:10   #7
prizrak1390
-=PriZraK=-
Форумчанин
 
Аватар для prizrak1390
 
Регистрация: 12.12.2007
Сообщений: 399
По умолчанию

russian-stalker,нас уже два таких мазохиста))))))))))))
Делал так же,не помогло.
prizrak1390 вне форума Ответить с цитированием
Старый 11.09.2009, 18:53   #8
856100
Форумчанин
 
Регистрация: 12.08.2008
Сообщений: 135
По умолчанию

1. sharemem надо писать первым
2. писать его в длл и в ПРОЕКТЕ, а не форме (Проект-показать исходный текст)
3. помимо написания в uses sharemem, надо еще с собой таскать BORLNDMM.DLL (лежит рядом с дельфи (папка BIN))

а чтоб не возникало таких ошибок, прочитайте комментарии, которые дельфи пишет при создании длл.
Будь проще, бери пример с одноклеточных
856100 вне форума Ответить с цитированием
Старый 11.09.2009, 18:56   #9
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

И я так отлаживал, можно клуб мазохистов открывать )

Еще как вариант, попробуй не из под отладчика запустить программу, т.е. не из под Дельфи. Бывает иногда ошибка именно из-за этого (в новых дельфях есть даже опция такая - запустить без отладки, и она там неспроста =).

sharemem можно и вовсе не использовать, смотря как строки передавать.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 11.09.2009 в 18:58.
mutabor вне форума Ответить с цитированием
Старый 11.09.2009, 18:57   #10
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Значит я не один такой
Сорри за флуд
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузка dll при автозапуске ! poster123 Win Api 5 05.08.2009 11:49
создание dll при старте приложения и удаление при завершении TyoshA Общие вопросы Delphi 7 13.07.2009 13:56
Ошибка при загрузке dll nikmay Общие вопросы Delphi 10 25.06.2009 15:42