- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我从运行我们在 Delphi 2007 中构建的大型产品之一的客户处获得的崩溃报告,我无法重现该报告,甚至没有任何通过调用堆栈直接涉及的非 VCL 代码。
Delphi 2007 中 TMonitor 的 VCL 源代码非常简单 ( Forms.pas
)
TMonitor.GetBoundsRect
在初始化 a 之后调用 win32 API GetMonitorInfo
struct 的 cbSize
以便 Windows API 知道要返回的大小。
我已经一遍又一遍地检查这段代码,但我看不出这个级别如何崩溃,除非 Self 指针无效,尽管我怀疑它实际上可能是 THintWindow
级别发生故障,并且仅在 TMonitor.GetBoundsRect
处发生故障此故障变成了可见的崩溃,因为它以某种方式获取了指向无效 TMonitor
对象的指针并调用了其上的方法。
function TMonitor.GetBoundsRect: TRect;
var
MonInfo: TMonitorInfo;
begin
MonInfo.cbSize := SizeOf(MonInfo);
GetMonitorInfo(FHandle, @MonInfo); // <----- CRASH.
Result := MonInfo.rcMonitor;
end;
通过 madExcept 的崩溃调用堆栈只能在客户端系统上重现:
main thread ($70):
004f5004 +010 myapp.exe Forms 6361 +2 TMonitor.GetBoundsRect
004f4fe2 +00a myapp.exe Forms 6352 +1 TMonitor.GetWidth
004e022f +06b myapp.exe Controls 9929 +7 THintWindow.ActivateHint
004e0457 +017 myapp.exe Controls 9970 +1 THintWindow.ActivateHintData
004f95fa +31a myapp.exe Forms 8923 +56 TApplication.ActivateHint
004f8fc1 +02d myapp.exe Forms 8728 +8 TApplication.HintTimerExpired
004f61e6 +022 myapp.exe Forms 7083 +3 HintTimerProc
7e4196c2 +00a USER32.dll DispatchMessageA
004f7f00 +0fc myapp.exe Forms 8105 +23 TApplication.ProcessMessage
004f7f3a +00a myapp.exe Forms 8124 +1 TApplication.HandleMessage
004f822f +0b3 myapp.exe Forms 8223 +20 TApplication.Run
0155cf77 +2f3 myapp.exe myapp 368 +41 initialization
上面整个调用堆栈中的所有代码都是VCL源代码,没有一个是我的。
除了禁用整个应用程序中的所有提示之外,我还能做些什么来进一步解决此问题或解决它吗?
更新:注册和解除,以及异常地址:
exception class : EAccessViolation
exception message : Access violation at address 004F5004 in module 'hirepnt.exe'. Read of address 00000004.
cpu registers:
eax = 00000000
ebx = 0012fccc
ecx = 7e42ac2c
edx = 0012fccc
esi = 07b694a8
edi = 0012fd14
eip = 004f5004
esp = 0012fc90
ebp = 0012fd1c
stack dump:
0012fc90 94 fc 12 00 28 00 00 00 - 2c ac 42 7e 70 b3 6f 02 ....(...,.B~p.o.
0012fca0 fc fc 12 00 01 00 00 00 - 70 b3 6f 02 cc 53 4f 00 ........p.o..SO.
0012fcb0 01 00 00 00 01 00 00 00 - 3c 56 4f 00 14 fd 12 00 ........<VO.....
0012fcc0 a8 94 b6 07 00 00 00 00 - e7 4f 4f 00 00 00 00 00 .........OO.....
0012fcd0 4b 64 4f 00 14 fd 12 00 - a8 94 b6 07 00 00 00 00 KdO.............
0012fce0 34 02 4e 00 4c fd 12 00 - c4 5c 40 00 1c fd 12 00 4.N.L....\@.....
0012fcf0 40 fd 12 00 97 fd 12 00 - 0c 23 4d 00 e0 01 00 00 @........#M.....
0012fd00 6d 01 00 00 e0 01 00 00 - 6d 01 00 00 41 02 00 00 m.......m...A...
0012fd10 80 01 00 00 34 fd 12 00 - 10 cc 6e 02 40 fd 12 00 ....4.....n.@...
0012fd20 5d 04 4e 00 d8 fd 12 00 - 0c 23 4d 00 f0 fd 12 00 ].N......#M.....
0012fd30 e0 01 00 00 6d 01 00 00 - 41 02 00 00 7c 01 00 00 ....m...A...|...
0012fd40 f4 fd 12 00 00 96 4f 00 - 00 00 00 00 0c fe 12 00 ......O.........
0012fd50 c4 5c 40 00 f4 fd 12 00 - 8c fe 12 00 c4 61 4f 00 .\@..........aO.
0012fd60 40 41 6f 02 00 00 00 00 - 00 00 00 00 28 05 00 00 @Ao.........(...
0012fd70 15 02 00 00 00 00 00 00 - 00 00 00 00 d9 04 00 00 ................
0012fd80 ac 01 00 00 84 00 00 e0 - 01 00 00 6d 01 00 00 41 ...........m...A
0012fd90 02 00 00 7c 01 00 00 01 - 4f 00 00 00 69 00 00 00 ...|....O...i...
0012fda0 51 00 00 00 6b 00 00 00 - e0 01 00 00 61 01 00 00 Q...k.......a...
0012fdb0 f0 84 22 06 0c 23 4d 00 - e0 01 00 00 6d 01 00 00 .."..#M.....m...
0012fdc0 56 05 00 00 18 00 00 ff - fe ff ff ff fe ff ff ff V...............
disassembling:
[...]
004f4ff6 push edi
004f4ff7 add esp, -$28
004f4ffa mov ebx, edx
004f4ffc 6360 mov dword ptr [esp], $28
004f5003 6361 push esp
004f5004 > mov eax, [eax+4]
004f5007 push eax
004f5008 mov eax, [$1644560]
004f500d mov eax, [eax]
004f500f call eax
004f5011 6362 mov edi, ebx
[...]
最佳答案
很可能是QC #53932 (也 #25466 #57953 ),并且修补 Forms.pas 确实修复了它。就我而言,使用 D7,它仅通过使用远程访问触发,并且问题/修复与 D2007 相同。
具体来说,该补丁是更改TScreen.FindMonitor。这是 D7 的更改,不确定 D2007 是否需要任何编辑。
function TScreen.FindMonitor(Handle: HMONITOR): TMonitor;
var
I: Integer;
begin
Result := nil;
for I := 0 to MonitorCount - 1 do
if Monitors[I].Handle = Handle then
begin
Result := Monitors[I];
// break;
Exit;
end;
//if we get here, the Monitors array has changed, so we need to clear and reinitialize it
for i := 0 to MonitorCount-1 do
TMonitor(Monitors[i]).Free;
fMonitors.Clear;
EnumDisplayMonitors(0, nil, @EnumMonitorsProc, LongInt(FMonitors));
for I := 0 to MonitorCount - 1 do
if Monitors[I].Handle = Handle then
begin
Result := Monitors[I];
Exit;
end;
end;
关于delphi - Delphi 2007 中 TMonitor.GetBoundsRect 是否存在由 VNC 触发的访问冲突错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15252559/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!