我注意到以下现象:
使用Delphi 7构建的可执行文件和部分名称(包括"Update")(例如"UpdateMyApp.exe")会导致UAC显示警告,例如"您是否允许程序对您的计算机进行更改".
这是通过简单的hello world应用程序实现的.在资源管理器中显示该文件会显示覆盖在应用程序图标上的屏蔽符号.
只要重命名exe,屏蔽就会消失,应用程序会在没有警告的情况下启动.
如上所述,这只发生在使用Delphi 7构建并在Windows 7上启动的程序(我假设在Vista上相同),但不是在例如WinXP上.
使用Delphi 2007快速检查表明此问题已消失.
有趣......吓人......
除了重命名文件外,我该怎么做才能防止这种情况发生?
你知道在Delphi代码中捕获,记录和重新引发异常的方法吗?一个简单的例子:
procedure TForm3.Button1Click(Sender: TObject);
begin
try
raise Exception.Create('Bum');
except
on E: Exception do
begin
MyHandleException(E);
end;
end;
end;
procedure TForm3.MyHandleException(AException: Exception);
begin
ShowMessage(AException.Message);
LogThis(AException.Message);
// raise AException; - this will access violate
end;
Run Code Online (Sandbox Code Playgroud)
所以我需要在except块中重新提升它,但我想知道是否有更好的方法来编写我自己的方法来处理和(在特定条件下)重新引发异常.
该标准不允许这样的代码:
namespace Hello::World {
//Things that are in namespace Hello::World
}
Run Code Online (Sandbox Code Playgroud)
而是要求
namespace Hello { namespace World {
//Things that are in namespace Hello::World
}}
Run Code Online (Sandbox Code Playgroud)
理由是什么?这当时根本没有想到,还是有一个特定的原因不包括在内?
似乎第一个语法更直接地表达了应该在哪个命名空间中,因为声明模仿了以后代码中命名空间的实际使用.如果你不幸使用"哑"括号计算缩进工具,它也会减少缩进.
这可能看起来像是最近的一个问题,问为什么Perl不允许单行"被解锁",但我发现这个问题的答案不能令人满意,因为他们要么提到语法文档说需要括号,我就是认为只是乞求这个问题,或者忽略了这个问题而只是简单地给出了无用的选择.
为什么Perl需要大括号来控制语句,如if和for?换句话说,为什么Perl需要块而不是语句,就像其他一些流行语言所允许的那样?
目前,任何体面的Windows桌面应用程序必须在以下条件下运行良好并且看起来很好:
天啊!什么是一个微不足道的Windows桌面应用程序开发人员呢?:(
我希望得到一个关于如何处理这个GUI困境的建议的线程.
首先,我在Delphi 7上.a
)Delphi 2010是否带来了新的东西以帮助解决这种情况?
b)我们应该选择一个售后组件套件并依靠它们来解决所有这些问题吗?
c)我们应该选择售后市场剥皮引擎吗?
d)或许可以使用更多HTML类型的GUI.我们可以使用不需要使用浏览器的HTML制作相对复杂的GUI应用程序吗?(更喜欢保持它的形式)
e)我们应该只关注并编码这些场景中的每一个并放弃对它的哄骗吗?
f)最后,我们应该如何测试所有这些条件?
我尝试使用CreateProcess来运行一个简单的命令hg > test.txt
.我尝试将字符串作为一个整体运行(而不是将其分成应用程序名称及其参数).为什么CreateProcess(0, "notepad.exe test.txt", ...)
工作但CreateProcess(0, "hg > test.txt", ...)
不工作?
Delphi组件有CreateWnd
和CreateWindowHandle
(DestroyWnd
和DestroyWindowHandle
).它们都打算被后代覆盖,对吧?除了底层的VCL实现之外,不打算调用它?
它们之间有什么区别; 什么时候应该被覆盖?
为什么解除引用称为解除引用?
我只是正确地学习指针,我想知道为什么要解除引用.它使我感到困惑,因为它听起来像是要删除引用,而不是通过指向目标的指针.
任何人都可以解释为什么它被称为这个?
对我来说像destination或pointed_to_value这样的东西会更有意义.
我确信这曾经适合我,我已经在网上看到了它(Jolyon Smith和David Moorhouse).刚刚在D2007和XE2试用版中的一个简单程序中尝试过它,它不会保留修改后的消息.一旦"加注"发生,该消息将恢复为原始异常.
我错过了什么盲目明显的事情?另一种方法是"引发Exception.Create(...)",但我想只是在链上传播原始异常,只是在每个异常块上标记了附加信息.
var a: Integer;
begin
try
a := 0;
Label1.Caption := IntToStr(100 div a);
except
on e: Exception do
begin
e.Message := 'Extra Info Plus the original : ' + e.Message;
raise;
end;
end;
end;
Run Code Online (Sandbox Code Playgroud) 我按顺序继承了一个控件,所以我可以添加一些我需要的字段,但现在当我在运行时创建它时,我得到一个Access Violation
.不幸的是,这种访问冲突不会发生在我正在创建控件的地方,甚至那些我在启用所有调试选项的情况下构建的(包括"使用调试DCU构建")堆栈跟踪根本无法帮助我!
在我尝试重现错误时,我尝试创建一个控制台应用程序,但显然这个错误只出现在Forms应用程序中,并且只有当我的控件实际显示在表单上时!
以下是重现错误的步骤.创建一个新的VCL Forms应用程序,单击一个按钮,双击以创建OnClick处理程序并写入:
type TWinControl<T,K,W> = class(TWinControl);
procedure TForm3.Button1Click(Sender: TObject);
begin
with TWinControl<TWinControl, TWinControl, TWinControl>.Create(Self) do
begin
Parent := Self;
end;
end;
Run Code Online (Sandbox Code Playgroud)
每次我尝试时,这都会连续生成访问冲突.仅在Delphi 2010上测试过,因为这是我在这台计算机上唯一的版本.
问题是:
以下是质量控制报告的链接:http://qc.embarcadero.com/wc/qcmain.aspx?d = 112101
delphi ×6
c++ ×3
c ×2
components ×1
delphi-2010 ×1
delphi-7 ×1
dereference ×1
exception ×1
namespaces ×1
perl ×1
pointers ×1
rationale ×1
syntax ×1
terminology ×1
uac ×1
winapi ×1