- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
此代码创建一个 AV:
function PAIsMainAppWindow(Wnd: THandle): Boolean;
var
ParentWnd: THandle;
ExStyle: DWORD;
begin
if IsWindowVisible(Wnd) then
begin
ParentWnd := THandle(GetWindowLongPtr(Wnd, GWLP_HWNDPARENT));
ExStyle := GetWindowLongPtr(Wnd, GWL_EXSTYLE);
Result := ((ParentWnd = 0) or (ParentWnd = GetDesktopWindow)) and
((ExStyle and WS_EX_TOOLWINDOW = 0) or (ExStyle and WS_EX_APPWINDOW <> 0));
end
else
Result := False;
end;
function PAEnumTaskWindowsProc(Wnd: THandle; List: TStrings): Boolean; stdcall;
var
Caption: array [0..1024] of Char;
begin
if PAIsMainAppWindow(Wnd) and (GetWindowText(Wnd, Caption, SizeOf(Caption)) > 0) then
List.AddObject(ExtractFileName(GetProcessNameFromWnd(Wnd)), Pointer(Wnd));
Result := True;
end;
function PAGetTaskWindowHandleFromProcess(const AProcessName: string): THandle;
var
sl: TStringList;
i: Integer;
begin
Result := 0;
sl := TStringList.Create(True); // stringlist owns objects
try
if EnumWindows(@PAEnumTaskWindowsProc, LPARAM(sl)) then
begin
for i := 0 to sl.Count - 1 do
begin
if SameText(AProcessName, sl[i]) then
begin
Result := THandle(sl.Objects[i]);
BREAK;
end;
end;
end;
finally
sl.Free; // AV!
end;
end;
ChromeHandle := PAGetTaskWindowHandleFromProcess('chrome.exe');
很明显,AV 的发生是因为释放字符串列表也会破坏函数结果。但如何避免这种情况呢?
最佳答案
首先,让我们看一下实际的代码。字符串列表不包含对象。它装有窗 Handlebars 。所以 OwnsObjects
根本不合适。这将假设 Objects[]
中的内容是 Delphi 类的实例,并在这些实例上调用 Free
。这就是失败发生的地方。
您不拥有这些窗口句柄,因此您不应尝试销毁它们。
因此,不要将 OwnsObjects
设置为 True
,问题就会消失。即替换这一行:
sl := TStringList.Create(True); // stringlist owns objects
这样:
sl := TStringList.Create;
此外,您还将这些对象转换为 THandle
。这是错误的,但这并不重要。但从语义上讲,这些是窗口句柄,因此将它们转换为 HWND
。事实上,在任何使用 THandle
的地方,您都应该使用 HWND
。
还有其他错误。当您调用 GetWindowText 时,您传递的是缓冲区的大小而不是其长度。这意味着您在缓冲区长度上撒了谎。因为这些是宽字符,所以缓冲区的长度只有您声称的一半。寻找桌面窗口的父窗口感觉是错误的。
<小时/>为了便于论证,我们假设您的字符串列表确实包含对象。在这种情况下,在理想的情况下,字符串列表类将提供一个Extract方法,该方法是从所属容器中删除对象而不破坏该对象的传统方法。因此,您可以执行 OwnsObjects
随机播放。
if SameText(AProcessName, sl[i]) then
begin
sl.OwnsObjects := False;
Result := TSomeObject(sl.Objects[i]);
sl.Objects[i] := nil;
sl.OwnsObjects := True;
BREAK;
end;
如果您愿意,可以在创建字符串列表时将 OwnsObjects
设置为 False
,并且仅将其设置为 True
就在您调用 Free
之前。
关于delphi - 如何避免函数结果被函数内部的Free破坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34359797/
这是我的测试用例。 http://tobeythorn.com/isi/dummy2.svg http://tobeythorn.com/isi/isitest.html 如果我自己打开 svg,内部
这是我的测试用例。 http://tobeythorn.com/isi/dummy2.svg http://tobeythorn.com/isi/isitest.html 如果我自己打开 svg,内部
我正在尝试做类似的事情: SELECT SUM( CASE WHEN ( AND EXISTS(SELECT 1
我想问如何在外部 ng-repeat 内部正确使用内部 ng-repeat: 这意味着你想使用这样的东西: {{milestone.id}} {{
我希望在 wordpress 的仪表板内编辑 css 样式并且如果可能的话不必编辑 php 文件。 我知道至少可以编辑一些属性,所以我希望我可以直接在仪表板中编辑所有属性。 更具体地说如何更改自定义类
我在安装在 windows10 上的 vmware 中的 Ubuntu 上安装了伪分布式独立 hadoop 版本。 我从网上下载了一个文件,复制到ubuntu本地目录/lab/data 我在 ubun
我有一个如下所示的 WHERE 语句: WHERE ((@Value1 IS NULL AND [value1_id] IS NULL) OR [value1_id] = ISNULL(@Va
我有一个如下所示的 WHERE 语句: WHERE ((@Value1 IS NULL AND [value1_id] IS NULL) OR [value1_id] = ISNULL(@Va
在我的一些测试帮助程序代码中,我有一个名为 FakeDbSet(Of T) 的 IDbSet(Of T) 实现,它模拟了许多 EF 行为,但没有实际的数据库。我将类声明为 Friend ,因为我想强制
我正在寻找 Cassandra/CQL 的常见 SQL 习语 INSERT INTO ... SELECT ... FROM ... 的表亲。并且一直无法找到任何以编程方式或在 CQL 中执行此类操作
如何防止内部 while 循环无限运行?问题是,如果没有外部 while 循环,内部循环将毫无问题地运行。我知道它必须对外循环执行某些操作,但我无法弄清楚是什么导致了问题。 import java.u
我正在努力学习更多有关 C++ 的知识,但在国际象棋程序中遇到了一些代码,需要帮助才能理解。我有一个 union ,例如: union b_union { Bitboard b; st
这是我项目网页中的代码片段。这里我想显示用户选择的类别,然后想显示属于该类别的主题。在那里,用户可以拥有多个类别,这没有问题。我可以在第一个 while 循环中打印所有这些类别。问题是当我尝试打印主题
我想知道如何在 swing 中显示内部框架。这意味着,当需要 JFrame 时,通常我所做的是, new MyJFrame().setVisible(true); 假设之前的表单也应该显示。当显示这个
我最近发现了一些有趣的行为,这让我想知道对象如何知道存在哪些全局变量。例如,假设我有一个文件“test.py”: globalVar = 1 toDelete = 2 class Test(objec
我知道它已经在这里得到回答: google maps drag and drop objects into google maps from outside the Map ,但这并不完全是我所需要的
我目前正在学习Javascript DOM和innerHTML,发现在理解innerHTML方面存在一些问题。 这是我的代码:http://jsfiddle.net/hphchan/bfjx1w70/
我构建了一个布局如下的库: lib/ private_class_impl.cc private_class_decl.h public_class_impl.cc include/
我有一个使用 bootstrap 3 的组合 wordpress 网站。它基本上是一个图像网格。当屏幕展开时,它会从三列变为四列。移动时它是一列。 我想出了如何调整图像的顶部和底部边距,但我希望图像的
我正在试用 MSP-EXP430G2 的教程程序,使用 Code Composer Studio 使 LED 闪烁。最初,它有一个闪烁的无限循环: for(;;) // This emp
我是一名优秀的程序员,十分优秀!