寻求帮助从记录获取值到 CodeSite。虽然我有基本值(整数,字符串..)的记录,但一切正常。
但是问题来自记录中的数组。
姓氏:WideChar 的
数组[0..35] 名称:WideChar 的数组[0..25]
(我找到了这个,但有什么办法吗?)
对于静态数组,使用 RTTI 获取记录字段类型失败
虽然我想获取 Surname / Name 的字段值,但 TRttiField.FieldType.TypeKind 为空。
任何人都知道如何将属性的值转换为字符串?
有我的程序。
class procedure TCodeSite.SendObject<T>(Category: String; lObject : T; Msg: String);
var
lRTTIContext : TRttiContext;
lRTTIObjectType : TRttiType;
lRTTIField : TRttiField;
lRTTIRecordInRecord : TRttiRecordType;
lRTTIFieldInRecord : TRttiField;
lRTTIPointerType : TRttiPointerType;
lRTTIPointerValue : TValue;
lFieldName : string;
lFieldNameInRecord : string;
lStringList : TStringList;
begin
{$IfNDef CodeSiteDisabled}
if isActiveDebugCategory(Category) then
begin
lStringList := TStringList.Create;
lRTTIContext := TRttiContext.Create;
lRTTIObjectType := lRTTIContext.GetType(TypeInfo(T));
if lRTTIObjectType.TypeKind = …Run Code Online (Sandbox Code Playgroud) 我有CodeSite Express,与Delphi XE Enterprise捆绑在一起.现在我正在XE中开发一个ISAPI应用程序(我在XE中使用attach to process进行跟踪和调试 - 工作正常),我想从我的ISAPI应用程序中获取一些CodeSite消息.
在附带的CodeSite帮助中的高级技术中,我发现了这一点:
"从服务登录
服务应用程序在与桌面不同的窗口站中运行.但是,默认情况下,CodeSite Dispatcher在桌面窗口工作站中运行.因此,用于将CodeSite消息传输到Dispatcher的默认消息传输机制(wm_CopyData窗口消息)被Windows阻止.Microsoft Windows不允许窗口消息跨越窗口站边界.....因此,如果我们希望将CodeSite消息从服务应用程序发送到Dispatcher,我们需要使用TCP协议而不是CopyData连接到Dispatcher.
题:
我是否认为相同的规则适用于ISAPI应用程序?我必须使用TCP从ISAPI应用程序中获取CodeSite消息?
我正在尝试捆绑到Delphi XE中的CodeSite Express.我想使用这样的Category功能:
CodeSite.Category := 'SomeCategory';
CodeSite.EnterMethod ('SomeMethod');
try
DoSomething;
finally
CodeSite.ExitMethod ('SomeMethod');
end;
Run Code Online (Sandbox Code Playgroud)
问题是,如果DoSomething包含设置类别的日志记录代码,那么结果ExitMethod将以不同的类别结束,并将在查看器中炸毁整个层次结构.
更糟糕的是,如果线程插入:设置Category然后调用日志命令显然不是原子操作,因此使用CodeSite日志记录的两个线程无法真正使用Category.至少这就是我在日志中的样子.我原本期望它Category是线程局部的,但似乎不是.
在嵌套日志记录和线程的上下文中处理类别的正确模式是什么?
谢谢!
是否可以在运行时从包含的CodeSite express获取异常的堆栈跟踪?如果是这样,有没有人有这方面的经验或实例?
如果失败了,有没有办法通过开源库实现这一目标?
我将日志记录引入了一个已有10年历史的Delphi应用程序,因此在没有日志记录的情况下,仍有相当大比例的应用程序.因此,对于尚未重写的区域,我有一个Application.OnException挂钩.对我们在生产中获得的零星访问冲突进行有意义的堆栈跟踪将非常有用.下面是我已经拥有的,我很失望地发现StackTrace属性为空.
class procedure Log.Error(const err: Exception; const method: string);
begin
FileLog(err, method);
end;
class procedure Log.FileLog(const err: Exception; const method: string);
var
_msg: TStringList;
begin
//_msg := Format('%s Failed:%3:s%1:s%3:s %2:s%3:s', [PreparedEntry(method), err.Message, err.StackTrace, sLineBreak]);
_msg := PreparedEntry( Format('%s Failed:', [method]));
_msg.Add(err.Message);
_msg.Add(err.StackTrace);
WriteLog(_msg, _logFileName);
end;
Run Code Online (Sandbox Code Playgroud)
我们正处于从delphi win32应用程序迁移到仍然为delphi客户端应用程序提供服务的多层.net wcf服务器应用程序的高级阶段.长期和短期是在说服管理层购买Delphi XE5(只是为了获得改进的json支持和实时绑定)之后,要求购买另一个delphi是非常难以证明的.
谢谢