2012-6-24 17:29
李啸林
CnDebugViewer 怎么无法捕获 CnDebugger.logMsg输出 ?
环境: Delphi XE2 + win7 (64位)
在单元中引用 CnDebug 单元,
代码如下:
procedure TForm1.FormCreate(Sender: TObject);
begin
CnDebugger.StartDebugViewer;
CnDebugger.LogMsg('aaaa');
OutputDebugString(PWideChar('xxxxxxxxxxxxxxxx'));
end;
结果, OutputDebugString的输出能够被 CnDebugViewer 捕获,而CnDebugger.LogMsg('aaaa') 却不能, 问题在那里啊 ?
2012-6-24 22:24
李啸林
回复 #2 Passion 的帖子
谢谢老大的回复,可用Trace 方法也不行啊。
跟踪了一下,是因为下面这个过程,在我的电脑执行结果为False
function TCnMapFileChannel.CheckReady: Boolean;
begin
Result := (FMap <> 0) and (FMapHeader <> nil) and (FQueueEvent <> 0);
if not Result then
begin
FMap := OpenFileMapping(FILE_MAP_READ or FILE_MAP_WRITE, False, PChar(SCnDebugMapName));
if FMap <> 0 then
begin
FMapHeader := MapViewOfFile(FMap, FILE_MAP_READ or FILE_MAP_WRITE, 0, 0, 0);
if FMapHeader <> nil then
begin
FQueueEvent := OpenEvent(EVENT_MODIFY_STATE, False, PChar(SCnDebugQueueEventName));
if (FQueueEvent <> 0) then
begin
UpdateFlush;
Result := IsInitedFromHeader;
end;
end;
end;
end
else // 区域都有效
Result := PCnMapHeader(FMapHeader)^.MapEnabled = CnDebugMapEnabled;
if not Result then
DestroyHandles;
end;
在我的电脑上
Result := (FMap <> 0) and (FMapHeader <> nil) and (FQueueEvent <> 0);
Result 返回值是 False
而且后面的这条语句
FMap := OpenFileMapping(FILE_MAP_READ or FILE_MAP_WRITE, False, PChar(SCnDebugMapName));
执行后,FMap 的值为 0 。
因此整个 TCnMapFileChannel.CheckReady 的返回值为 False ,于是后面的GenerateMsgDesc过程就没有执行。
不明白为什么会 打开内存印象文件失败, 原因到那里去查找。