Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.12.19;
Скачать: [xml.tar.bz2];

Вниз

Создание объекта в DLLке   Найти похожие ветки 

 
MegaVolt   (2002-12-09 09:43) [0]

Есть мой самописный объект для записи неких данных на винт. В обычных программах работает на ура а вот в DLLке не хочет работать. Притом если удрать создание объекта то всё становится на свои места. Объект наследник TObject и внутри себя исспользует TFileStream. Что я не так делаю?


 
Calm   (2002-12-09 09:45) [1]

Чуть подробнее, если можно

> если удрать создание объекта

удалить?


 
MegaVolt   (2002-12-09 10:05) [2]

Убрать имелось ввиду :) Т.е. заремить строку My:=MyObj.create; и остальные обращения к этому объекту


 
Calm   (2002-12-09 10:07) [3]


> Чуть подробнее, если можно

Про то, как работает объект, как вызывается из DLL"ки...


 
MegaVolt   (2002-12-09 10:51) [4]

Вот полный текст


unit LogComponent;

interface

uses classes, windows, Sysutils;

type

TLog=class
private
LogFile:TFileStream;
StartTime:Cardinal;
debug: boolean;
{ Private declarations }
public
{ Public declarations }
constructor create;
destructor Destroy;
procedure StartF(Str:string);
procedure StopF(Str:string);
procedure Text(Str:string);
end;

implementation
{ TLog }

constructor TLog.create;
var
s:String;
begin
if FileExists("LogFile.log")
then debug:=true
else
begin
debug:=false;
exit;
end;
StartTime:=GetTickCount;
LogFile:=TFileStream.Create("LogFile.log",fmCreate);
s:="<0:Начало записи"+#13+#10;
LogFile.Write(s[1],Length(s));
end;

destructor TLog.Destroy;
var
s:String;
begin
if not Debug then exit;
s:=">"+IntToStr(GetTickCount-StartTime)+":Конец записи";
LogFile.Write(s[1],Length(s));
LogFile.Free;
inherited;
end;

procedure TLog.StartF(Str: string);
var
s:string;
begin
if not debug then Exit;
s:="<"+IntToStr(GetTickCount-StartTime)+":"+str+#13+#10;
LogFile.Write(s[1],Length(s));
end;

procedure TLog.StopF(Str: string);
var
s:string;
begin
if not debug then Exit;
s:=">"+IntToStr(GetTickCount-StartTime)+":"+str+#13+#10;
LogFile.Write(s[1],Length(s));
end;

procedure TLog.Text(Str: string);
var
s:string;
begin
if not debug then Exit;
s:="-"+IntToStr(GetTickCount-StartTime)+":"+str+#13+#10;
LogFile.Write(s[1],Length(s));
end;

end.
<\code>

а обращаюсь стандартно: создать а затем обращатся по необходимости


 
Calm   (2002-12-09 10:56) [5]

А ты его осовобождаешь (free) в основной программе?
Если нет, то файл остается занятым и следующий вызов инициирует ошибку доступа.
Других предположений нет :(


 
Anatoly Podgoretsky   (2002-12-09 11:14) [6]

Странный код, например зачем то скрыт деструктор, компилятор тебя должен был предупредить об этом.
Если файла на диске нет, то файл никогда не создастся, разве что внешне.
Работа с файлами на грани фола, все пути относительные, не уверен что вообще в этом случае получится запись и создание файла, а если получится то неизвестно куда и будет ли это работать с от вызова к вызову.
Start/Stop методы ничего не останавливают и не запускаю, как бы лишнии.
Наверно есть и еще проблемы за пределами данного кода.


 
Polevi   (2002-12-09 11:14) [7]

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. }


 
MegaVolt   (2002-12-09 11:19) [8]

Я пробовал писать так

procedure DLLProc(Reason: Integer);
begin
if Reason = DLL_PROCESS_DETACH then Log.Destroy;
end;



по моей задумке это и должно закрывать доступ.
Кстати интересно получается: при каждой загрузке DLLки старый лог затирается :( Скорее всего придётся писать в разные файлы


 
MegaVolt   (2002-12-09 11:40) [9]

Так приехали.
1. Модуль нормально работает при вызове с нормального приложения.
2. Если файла на вите нет то и лог соответственно не создаётся. Если же его там создать то создаётся. По моему очень удобно не нужно инишек и пр...
3. StartF и StopF вызываются из основной программы (DLLки) это же модуль а не готовая программа.
4. То что деструктор перекрыт недосмотр :( компилятор предупреждает но не ругается :)
5. Если путь не указан дельфи по умолчанию берёт каталог где лежит проект в часности ехешник.

Я спрашиваю почему это работает в нормальной проге и не работает в DLLke?
ShareMem включён первым в самой DLLке


 
mrcat   (2002-12-09 11:49) [10]

попробуй объявить методы класса как виртуальные


 
MegaVolt   (2002-12-09 12:07) [11]

и что это должно дать? Я не совсем понимаю :( Поясните пожалуйста


 
Fantasist   (2002-12-10 00:04) [12]


> MegaVolt

Первое: ты


> Polevi © (09.12.02 11:14)
> Important note about DLL memory management:


прочитал?

Второе: кто создает объект, разрушает и как им пользуются?


 
NailS   (2002-12-10 10:24) [13]


> это работает в нормальной проге и не работает в DLLke

Покажи как ты из длл-ки этот объект дергаешь?


 
han_malign   (2002-12-10 10:48) [14]

Во первых, если уж запихивать объект в DLL то он должен иметь полностью абстрактный интерфейс, иначе будет вызываться код методов лежащий в контексте основного процесса.
Во вторых, использовать лучше PChar, а не string(на худой конц ShortString), иначе огребешь описанную выше проблему с ShareMem.
В третих, объект должен создаваться и разрушаться в контексте DLL, для этого обычно используют оберточные функции:
................
function CreateMyObject: TMyObject;
begin Result:=TMyObject.Create; end;
procedure FreeMyObject(aObject: TMyObject);
begin aObject.Free; end;
exports
CreateMyObject,FreeMyObject;
..................


 
MegaVoltik   (2002-12-10 13:16) [15]

Так меня не поняли :)
Данный модуль применяется можно сказать для личного применения самой DLLкой. Т.е. при загрузке DLLки объект создаётся и дальше из самой же DLLки происходит обращение к нему. Т.е. если мне нужно из DLLки сохранить промежуточные результаты я вызываю одну из функций объекта:

library MultiArc;

uses
SysUtils,Classes,windows,dialogs;

{$R *.RES}

function FsInit(PluginNr:integer;pProgressProc:tProgressProc;pLogProc:tLogProc;
pRequestProc:tRequestProc):integer; stdcall;
begin
Log.StartF("FsInit: PluginNr:="+inttostr(PluginNr));
Result:=0;
Log.StopF("");
end;

procedure DLLProc(Reason: Integer);
begin
if Reason = DLL_PROCESS_DETACH then Log.Destroy;
end;

exports
FsInit;


begin
Log.create;
end.


 
NailS   (2002-12-10 13:36) [16]


> Log.create;

А может так надо
Log := TLog.Create; ?


 
asmith   (2002-12-10 13:40) [17]

>MegaVoltik (10.12.02 13:16)
Log.create; ?????
Может все-таки Log := TLog.create; ?


 
MegaVoltik   (2002-12-10 13:51) [18]

Весь покраснетл от стыда за такой ляп :(
Уже работает и не глючит правда и не пишет но я думаю разберусь :)



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.12.19;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.008 c
1-61545
tga
2002-11-28 06:51
2002.12.19
Помогите! плиззз. Execel не закрывается!!!


14-61820
sancho
2002-11-29 17:53
2002.12.19
Delphi3 client-server vs Delphi 7 ent


7-61856
Lars
2002-10-17 11:54
2002.12.19
Как записать на CD из моей программы!


3-61417
AVR
2002-11-28 20:25
2002.12.19
Interbase + сеть: TCP + NetBEUI. Проблемы с подключением.


1-61679
baryjul
2002-12-08 15:15
2002.12.19
Как на панели StatusBar отобразить объект TGaude ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский