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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.09.2011, 00:44   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию DLL самовыгружается... проблема с DLLProc

Доброго времени суток!

Есть программа которая подхватывает dll.
Пишу свою dll:
Код:
library TestLib;


uses
  Windows, Classes,SysUtils;

var
 myDir:string;

{$R *.res}


function GetMydir:string;
var
  Buff:array[0..MAX_PATH] of Char;
begin
  GetModuleFileName(hInstance,@Buff,MAX_PATH);
  Result:=StrPas(Buff);
end;

procedure log(aStr:string);
var
ts:TStringList;
begin
  ts:=TStringList.Create;
  try
  if FileExists(myDir+'Log.txt') then
  begin
  ts.LoadFromFile(myDir+'Log.txt');
  end;
  ts.Add(aStr);
  ts.SaveToFile(myDir+'Log.txt');
  finally
    FreeAndNil(ts);
  end;
end;


procedure MyDLLMain(dwReasson:DWORD);
begin
 case dwReasson of
   DLL_PROCESS_ATTACH:
   begin
    myDir:=ExtractFilePath(GetMydir);
    Log('myDir is "'+myDir+'"');
    log('Log STARTED!');
    log('DLL_PROCESS_ATTACH');
    //

   end;

   DLL_PROCESS_DETACH:
   begin
     Log('DLL_PRCESS_DETTACHED!');
     //
     log('Log CLOSED!');
   end;
 end;
end;

begin
  DllProc:=@myDLLMain;
  //MyDLLMain(DLL_PROCESS_ATTACH);
end.
Почему dll самовыгружается?
При запуске программы, создаётся мой log.txt
и там запись:
Код:
DLL_PRCESS_DETTACHED!
Log CLOSED!
Человек_Борща вне форума Ответить с цитированием
Старый 30.09.2011, 00:51   #2
_Troy
Я не простой
Пользователь
 
Аватар для _Troy
 
Регистрация: 29.09.2011
Сообщений: 77
По умолчанию

Тут явно неудавшаяся инициализация. А как загружаешь ее в программе?
Знание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нем сведения
_Troy вне форума Ответить с цитированием
Старый 30.09.2011, 00:58   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Программа не моя. Программа сама подхватывает dll и загружает их.
Почему выгружается моя dll?
Человек_Борща вне форума Ответить с цитированием
Старый 30.09.2011, 01:02   #4
_Troy
Я не простой
Пользователь
 
Аватар для _Troy
 
Регистрация: 29.09.2011
Сообщений: 77
По умолчанию

В таком случае навряд ли смогу тебе помочь.
Нужен кто лучше в этом соображает))
Могу только предположить что программа инициализирует какие-то определенные процедуры/функции из dll, к каковым твои не относятся.
Знание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нем сведения

Последний раз редактировалось _Troy; 30.09.2011 в 01:07.
_Troy вне форума Ответить с цитированием
Старый 30.09.2011, 01:04   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

нет таковых нет. Так уж получилось, что программа хватает все файлы с опр. расширением и пытается их загрузить в себя. При этом требуется инициализация с моей стороны.

Почему выгружается моя dll?
Человек_Борща вне форума Ответить с цитированием
Старый 30.09.2011, 01:07   #6
_Troy
Я не простой
Пользователь
 
Аватар для _Troy
 
Регистрация: 29.09.2011
Сообщений: 77
По умолчанию

И где кстати у тебя экспорт функции/процедуры?

По идее надо так:

Код:
exports MyDLLMain;

begin

end.
Знание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нем сведения
_Troy вне форума Ответить с цитированием
Старый 30.09.2011, 02:16   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

а зачем её экспорт....?
Она является DLLProcкоторый вызывается при инициализации dll в процессе
Человек_Борща вне форума Ответить с цитированием
Старый 30.09.2011, 03:07   #8
Asinkrit
Пользователь
 
Аватар для Asinkrit
 
Регистрация: 02.04.2011
Сообщений: 48
По умолчанию

Сдается мне экспорт как раз является ключевым моментом здесь... По идеи дллка выгружается из-за того, что система считает что она больше не нужна, а не нужна она потому, что в ней нет того, ради чего она вообще создана - внешних функций, то есть экспортируемых. Насколько я помню из теории, винда выгружает библиотеки, в случаях если они больше не нужны, а ваша библиотека не может быть нужна, она ничего не дает, вы ее написали как отдельную программу, но так она работать не будет.

а функцией Log(aStr:string); вы переплюнули даже индусский код. Вы создаете стринглист и загружаете весь лог файл, только для того, что бы добавить одну строку. жесть. Поверьте, банальные append и writeln, дадут в 1000000 раз больше производительности.
Asinkrit вне форума Ответить с цитированием
Старый 30.09.2011, 03:28   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Asinkrit, попробую указать stdcall,и сделать экспортируемой..

А процедура лог просто для дебага того, что троворится внутри. Потом уберу её...

Последний раз редактировалось Человек_Борща; 30.09.2011 в 03:34.
Человек_Борща вне форума Ответить с цитированием
Старый 30.09.2011, 04:21   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Так уж получилось, что программа хватает все файлы с опр. расширением и пытается их загрузить в себя.
Наверное, при этом она видит, что твоя DLL - не то, что она ожидает. Вот и выгружает. Как ненужное. Программа понятия не имеет, что делать с твоей DLL.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DLLProc Aleksey1989 Помощь студентам 1 14.04.2011 10:00
Проблема dll EXMP Софт 0 18.08.2010 09:30
Проблема с DLL _-Re@l-_ Паскаль, Turbo Pascal, PascalABC.NET 3 09.06.2010 14:28
Проблема с DLL. profi Помощь студентам 5 06.01.2009 23:48
Проблема с dll( DM_bite Помощь студентам 10 31.07.2008 16:05