如何在用户没有管理员/提升权限时以编程方式更改文件关联(Win XP,Vista,7)?关于如何解决这个问题的任何想法?基本上我想保持我的应用程序像现在一样精简(它不需要提升安装和运行的权限).目前我提供了一个GUI界面,用户可以在其中更改文件关联,但如果用户权限有限,那么它所做的只是显示一条消息,表明它无法执行此操作,并向其解释如何激活"运行此程序"作为管理员"框然后重新启动该程序.如果用户拥有权限,那么我只需更改关联.
有一种更好的方法来保持"精简"吗?
我在这里有一个类似的问题,但它面向PHP方面.看起来PHP能够接收一个数据包并立即(在同一个会话中)发送和回复.我的问题是Delphi能做到吗?据我所知,答案是一个很大的NO.我需要分两步完成(两个程序).问题是当第一个程序结束时,会话可能会关闭.我可以在两个过程调用之间保持会话打开.
我在Indy 10.5.7(Delphi 7下)中有这个漏洞.
5 - 12字节:TIdThreadSafeInteger x 1
21 - 36字节:TIdCriticalSection x 2
我像这样使用Indy:
function getWeb(a,b:Integer):Integer;
var url: string;
H: TIdHttp;
SS: TStringStream;
begin
url := 'http://blabla';
H := TIdHttp.Create(nil);
try
SS := TStringStream.Create('');
try
H.Get(url, SS);
Result := StrToInt(SS.DataString);
FINALLY
SS.Free;
END;
finally H.Free;
end;
Run Code Online (Sandbox Code Playgroud)
泄漏本身并不打扰我,因为在应用程序关闭.这使得我的瓜爆炸是我每次关闭应用程序时看到的错误消息.
为什么会出现这种泄漏
我检查了Indy网站,但它几乎没有意义.无论如何,看起来这个bug无法修复:最新版本的Indy无法用Delphi 7编译.唯一的解决方案可能是Indy 9.更新:看起来网站上的内容调用v10.203实际上是v10.2.3 .
我有2条记录,如下所示:
TYPE
TRecord2= packed record
i2: Integer;
end;
TRecord1= packed record
i1: Integer;
R2: TRecord2;
end;
Run Code Online (Sandbox Code Playgroud)
.
我想将记录字段初始化为零,但我不想使用FillMemory,因此我声明了2个常量记录,我在其中初始化字段.
CONST
Record2c: TRecord2=
(
i2: 0;
);
Record1c: TRecord1=
(
i1: 0;
R2: Record2c; <------- error line
);
Run Code Online (Sandbox Code Playgroud)
但是,我无法将Record2c分配给R2字段.编译器说:E2029'('期望但标识符'Record2c'找到.
但这有效(如果我评论我有错误的行):
procedure test;
var Record1: TRecord1;
begin
Record1:= Record1c; // initialize variable by associating the constant to it
end
Run Code Online (Sandbox Code Playgroud)
那么,我如何初始化R2字段?
有些人说我必须使用现代控件更新Win3.1调色板(尤其是TFilterComboBox)中的控件.但是德尔福是否提供了这样的新控件?
我需要创建一个GUI(以某种方式类似于Windows资源管理器,包含DirectoryListBox,FileListBox和FilterComboBox),我允许用户轻松浏览特定类型的文件.由于界面以此Explorer为中心,因此TOpenDialog就像用锤子击中客户一样.我需要一个"易于使用"的解决方案.
不幸的是,Shell Controls不够稳定,无法用作替代品.
我想快速显示一些图像(jpg,png等)作为缩略图.因为解码和调整大小过程是懒惰的,所以我要在一个或多个线程中完成它.
但是,看起来使用TBitmap的画布并且TJpeg不是多线程安全的.
在这种情况下,我的问题是:
1.如果不完全重写GIF/PNG/BMP/JPG库,怎么办呢?
2.有人知道Embarcadero的Gif和Png libs是否也不安全?
3.如果我使用Lock锁定画布不会破坏性能,因为调整大小部分访问画布并占用大部分CPU周期?
我发现这让我很烦恼:
David HAROUCHE写道:这不正确.真正令人困惑的部分是,即使本地TBitmap不是线程安全的,除非你锁定它们.这是因为每个TBitmap都将自己注册到graphics.pas中的全局BitmapCanvasList列表.当DC垃圾收集FreeMemoryContexts()
http://www.codenewsfast.com/cnf/thread/0/permalink.thr-ng1908q2024
在某些情况下,我需要设置动态数组的大小,然后用零填充它.
就像是:
procedure SetLengthAndZero(VAR X; NewSize: Integer);
begin
SetLength(x, newsize);
if newsize > 0
then FillChar(x[0], length(x)* SizeOf(x[0]), 0);
end;
Run Code Online (Sandbox Code Playgroud)
但上面的代码(显然)不会编译.
我通过单击系统关闭按钮使用下面的代码关闭MDI子窗体,它工作正常:
procedure Tfrm_main.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
end;
Run Code Online (Sandbox Code Playgroud)
但是,如果我想通过使用标准按钮(在子表单本身内)关闭MDI子表单.如果我Close在事件处理程序中调用,那么我会收到访问冲突异常.
有没有办法通过使用放置在子表单本身内的标准按钮(不是系统关闭按钮)来关闭MDI子表单,而不会引发访问冲突异常?
我已经完成了类似的问题搜索,并尝试了各种代码,但仍然有例外.
我发现我的 Delphi 应用程序有多个线程 - 更准确地说是 7 个线程。当然,我不会创建自己的线程,我只使用“经典”VCL 控件。程序闲置。它只显示主窗体。没有对话框处于活动状态,没有个人/Indy/等线程运行。
注 1:这与程序冻结有关,但 CPU 利用率为零
注 2:我刚刚意识到其中 2 或 3 个线程来自调试器(当我暂停程序并调用“CPU 视图”窗口时会出现额外的线程) 。
我在TMemo中有100000行.我想做的事情如下:
for i:= 0 to Memo.Lines.Count-1 do
Memo.Lines[i]:= SomeTrim(Memo.Lines[i]);
Run Code Online (Sandbox Code Playgroud)
但速度是每秒0.5线!!
添加BeginUpdate/EndUpdate后,我没有看到任何速度提升.
Memo.Lines.BeginUpdate;
for i:= 0 to Memo.Lines.Count-1 do
Memo.Lines[i]:= SomeTrim(Memo.Lines[i]);
Memo.Lines.EndUpdate;
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么BeginUpdate/EndUpdate无济于事?