-
Если кому интересно... - Расширил значительно функциональность программы, добавил множество опций .... хочу знать ваше мнение, на сколько получилась хорошая прога. Добавлены новые процедуры в модуль MSGLog.pas SendDebugMsgWnd(WndCaption: String; DebugMsg: String); В этой процедуре добавлен параметр "WndCaption", если запущено несколько окон программы MSGLoger.exe с разными заголовками окна, например, одно окно имеет заголовок "MSGLoger", а другое "LogView", то каждому окну можно послать отдельное сообщение, для этого необходимо вызвать процедуры в следующем порядке SendDebugMsgWnd('MSGLoger','Сообщение программе с первым заголовком') и SendDebugMsgWnd('LogView','Сообщение программме с заголовком два'). SendDebugMsgLastError(DebugMsg: String; LastError: Integer); В этой процедуре реализована возможность передать код ошибки "GetLastError", например, вы не собираетесь обрабатывать и поднимать сообщение об ошибке через "RaiseLastOSError" или "RaiseLastWin32Error", или RaiseLastOSError(GetLastError) в сомой программе, то можно код ошибки отправить через процедуру SendDebugMsgLastError(), а "MSGLoger.exe" этот код преобразует текстовое сообщение как и "RaiseLastOSError" и отразит в очете. Например: try
ecxept
SendDebugMsgLastError('Ошибка в модуле Unit1 ...', GetLastError);
exit;
end; SendDebugMsgWndLastError(WndCaption, DebugMsg: String; LastError: Integer); Это процедура имеет такие свойства, как и предыдущие, она может отправлять сообщения в разные окна программы MSGLoger.exe и передавать код ошибки.
-
Адресочек для файла, то забыл... Для скачивания: www.elsetrue.narod.ru/Softfolder/msgloger_lastver.rar
-
Удалено модератором
-
> хочу знать ваше мнение, на сколько получилась хорошая прога. >
Довольно симпатичная. При запуске негативных эмоций не вызывает.
По сути: часто приходится разрабатывать многопоточные приложения, единственный надежным способом их отладки является запись в лог (в дебаггере отладить получается через раз, IDE (и винда) виснет постоянно). В таких случаях помимо ID процесса в лог полезно выводить ID потока. Было бы лучше, если бы такой вариант в модуле "MsgLog.pas" учитывался.
Еще пожелание. Назначение сообщений может быть разным. Это может быть критическая ошибка, некритическая ошибка, предупреждения, какое-либо событие, информационное сообщение, отладочное сообщение и т.д. Было бы хорошо, если бы программа учитывала тип сообщения, и подсвечивала их разным (лучше-настраиваемым) цветом.
Еще нашел интересную настройку: "Стартовать при старте в трэй"
-
Сорри.... для всех кто уже скачал, там была маленькая ошибочка в модуле MsgLog.pas Только что исправил и заменил архив... что бы не качать снова, вот исправленный модуль:
Unit MsgLog;
interface
Type
DWORD = LongWord;
HWND = type LongWord;
UINT = LongWord;
WPARAM = Longint;
LPARAM = Longint;
LRESULT = Longint;
PCopyDataStruct = ^TCopyDataStruct;
tagCOPYDATASTRUCT = packed record
dwData: DWORD;
cbData: DWORD;
lpData: Pointer;
end;
TCopyDataStruct = tagCOPYDATASTRUCT;
COPYDATASTRUCT = tagCOPYDATASTRUCT;
const
WndClass = 'TMSGLoger';
kernel32 = 'kernel32.dll';
user32 = 'user32.dll';
WM_USER = $0400;
WM_COPYDATA = $004A;
function FindWindow(lpClassName, lpWindowName: PChar): HWND; stdcall; external user32 name 'FindWindowA';
function SendMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; external user32 name 'SendMessageA';
function GetCurrentProcessId: DWORD; stdcall; external kernel32 name 'GetCurrentProcessId';
procedure OutputDebugString(lpOutputString: PChar); stdcall; external kernel32 name 'OutputDebugStringA';
function StrLen(const Str: PChar): Cardinal;
procedure SendDebugMsg(DebugMsg: String);
procedure SendDebugMsgWnd(WndCaption: String; DebugMsg: String);
procedure SendDebugMsgLastError(DebugMsg: String; LastError: Integer);
procedure SendDebugMsgWndLastError(WndCaption, DebugMsg: String; LastError: Integer);
implementation
function StrLen(const Str: PChar): Cardinal; assembler;
asm
MOV EDX,EDI
MOV EDI,EAX
MOV ECX,0FFFFFFFFH
XOR AL,AL
REPNE SCASB
MOV EAX,0FFFFFFFEH
SUB EAX,ECX
MOV EDI,EDX
end;
procedure SendDebugMsg(DebugMsg: String);
var
WND : HWND;
CopyData : TCopyDataStruct;
begin
OutputDebugString(PChar(DebugMsg));
WND:=FindWindow(PChar(WndClass),Nil); if WND <> 0 then begin
With CopyData do begin
dwData := 0;
cbData := StrLen(PChar(DebugMsg));
lpData := PChar(DebugMsg);
end;
SendMessage(WND,WM_COPYDATA,GetCurrentProcessId,Integer(@CopyData));
end;
end;
procedure SendDebugMsgWnd(WndCaption: String; DebugMsg: String);
var
WND : HWND;
CopyData : TCopyDataStruct;
begin
OutputDebugString(PChar(DebugMsg));
WND:=FindWindow(Nil,PChar(WndCaption)); if WND <> 0 then begin
With CopyData do begin
dwData := 0;
cbData := StrLen(PChar(DebugMsg));
lpData := PChar(DebugMsg);
end;
SendMessage(WND,WM_COPYDATA,GetCurrentProcessId,Integer(@CopyData));
end;
end;
procedure SendDebugMsgLastError(DebugMsg: String; LastError: Integer);
var
WND : HWND;
CopyData : TCopyDataStruct;
begin
OutputDebugString(PChar(DebugMsg));
WND:=FindWindow(PChar(WndClass),Nil); if WND <> 0 then begin
With CopyData do begin
dwData := LastError;
cbData := StrLen(PChar(DebugMsg));
lpData := PChar(DebugMsg);
end;
SendMessage(WND,WM_COPYDATA,GetCurrentProcessId,Integer(@CopyData));
end;
end;
procedure SendDebugMsgWndLastError(WndCaption, DebugMsg: String; LastError: Integer);
var
WND : HWND;
CopyData : TCopyDataStruct;
begin
OutputDebugString(PChar(DebugMsg));
WND:=FindWindow(Nil,PChar(WndCaption)); if WND <> 0 then begin
With CopyData do begin
dwData := LastError;
cbData := StrLen(PChar(DebugMsg));
lpData := PChar(DebugMsg);
end;
SendMessage(WND,WM_COPYDATA,GetCurrentProcessId,Integer(@CopyData));
end;
end;
end.
-
> Loginov Dmitry © (13.12.08 14:44) [3]
> помимо ID процесса в лог полезно выводитьID потока. Было > бы лучше, если бы такой вариант в модуле "MsgLog.pas"учитывался. >
- Учту ..
> Было быхорошо, если бы программа учитывала тип сообщения, > и подсвечивала ихразным (лучше-настраиваемым) цветом.
- Да вот именно так я и собирался сделать, наверное в следующей версии.... А кто тип должен указывать? программист при вызове отладочной функции или программа должна сама анализировать по коду GetLastError?
- еще в плане сделать ее сетевой: клиен-сервер дабы на удаленных просматривать код, как бы настройки уже есть, пока скрыты, но еще не реализован сам клиент-скервер.
-
В каждой процедуре модуля MsgLog.pas вызывается еще одна дополнительная функция OutputDebugString, которая отправляет сообшения в другую утилиту "Dbgview.exe" от "Sysinternals.exe" www.sysinternals.com
-
> А кто тип должен указывать? программист при вызове отладочной > функции или программа должна сама анализировать по коду > GetLastError?
Программист
-
-
> Loginov Dmitry © (13.12.08 14:44) [3]
> помимо ID процесса в лог полезно выводитьID потока.
В самом деле стало интересно, а как можно узнать ID потока в котором выполнятеся функция? Или узнать хотябы узнать в каком потоке произшло исключение?
-
> а как можно узнать ID потока в котором выполнятеся функция?
ВзятьТекущийПотокаИД()
-
> DVM © (13.12.08 17:46) [10] > > а как можно узнать ID потока в котором выполнятеся функция? > ВзятьТекущийПотокаИД()
имеется ввиду эта функция GetCurrentProcessId?
-
я протупил... да вот же она "GetCurrentThreadId"
-
Удалено модератором
|