如何通过Innosetup删除桌面快捷方式?它是由以前的版本创建的,不再需要了.我尝试在[InstallDelete]中删除它
[InstallDelete]
Type: files; Name: {userdesktop}\Shortcut Name
Run Code Online (Sandbox Code Playgroud)
并删除CurStepChanged事件处理程序的"ssInstall"中的文件
DeleteFile(ExpandConstant('{userdesktop}\Shortcut Name'));
Run Code Online (Sandbox Code Playgroud)
但它们不起作用.任何建议表示赞赏!
我正在测试Synapse并想知道如何建立安全连接.我注意到它支持SSL,但我不确定它是否适合我的需求.我没有CA的证书.我只想加密我的服务器程序和客户端程序之间的所有数据.当然,我可以在发送之前自己加密数据.但是如果SSL可以加密数据,也许我可以使用它.据我所知,SSL用于"加密"和"身份验证".我需要的只是"加密".Synapse有可能吗?
更新:
感谢daemon_x和Synapse的作者Lukas Gebauer的帮助,我想我终于让它发挥了作用.这是我做的:
服务器端:
1)在你的单元中使用ssl_openssl并将'libeay32.dll'和'ssleay32.dll'放到exe文件的同一目录中
2)接受连接后,为新创建的套接字添加以下代码行.
fclient.SSLAcceptConnection;
Run Code Online (Sandbox Code Playgroud)
客户方:
1)在你的单元中使用ssl_openssl并将'libeay32.dll'和'ssleay32.dll'放到exe文件的同一目录中
2)连接到服务器后,添加以下行.
fclient.SSLDoConnect;
Run Code Online (Sandbox Code Playgroud)
如果没有发生错误,则连接现在是安全的.但是当您运行代码时,如Synapse文档中所述,您可能会注意到SSLAcceptConnection需要一些时间才能返回.因此,如果您想加快速度,最好先预先创建证书文件和私钥文件.并在SSLAcceptConnection之前添加以下代码
fclient.SSL.CertificateFile := 'bs-cert';
fclient.SSL.PrivateKeyFile := 'bs-privatekey';
Run Code Online (Sandbox Code Playgroud)
如果您没有证书和私钥,请参阅ssl_openssl中的"CreateSelfSignedCert"以获取自签名证书和私钥.您可以通过WriteStrToStream将FCertificate和FPrivatekey保存到文件中,稍后再使用它们.
当我以LocalSystem帐户运行服务时,我可以使用以下代码在当前登录帐户下启动GUI程序:
WTSGetActiveConsoleSessionId-> WTSQueryUserToken-> CreateProcessAsUser
但是,当我将该服务作为我的个人帐户运行时,GUI程序将不会显示.我可以在任务管理器中看到它.
当我的个人帐户下运行服务时,我该怎么做才能启动GUI程序?
我有一个TDictionary并添加一些项目:
for index := 0 to 10 do
dict.Add(IntToStr(index), index);
Run Code Online (Sandbox Code Playgroud)
现在,我需要迭代容器并删除我想要的项目:
pairEnum := dict.GetEnumerator;
while pairEnum.MoveNext do
begin
if pairEnum.Current.Value mod 2 = 0 then
dict.Remove(pairEunm.Current.Key);
end;
Run Code Online (Sandbox Code Playgroud)
我希望我现在只有字典中的奇数.但我实际得到的是:
key=1 value=1
key=3 value=3
key=5 value=5
key=7 value=7
key=9 value=9
key=8 value=8 <-
Run Code Online (Sandbox Code Playgroud)
为什么"8"没有从字典中删除?
如果我添加更多项目.例如
for index := 0 to 12 do
dict.Add(IntToStr(index), index);
Run Code Online (Sandbox Code Playgroud)
然后,结果是正确的.这是为什么?如何正确迭代TDictionary并删除项?谢谢.
例如,当我按"Ctrl + C"时,Wordpad会做什么?它为剪贴板放置了许多不同的格式.因此,记事本可以获取没有任何颜色或字体等的文本,并且当您粘贴到另一个Wordpad窗口时,您仍然可以保留原始格式.
MSDN说我应该多次调用SetClipboardData.但它根本不起作用.
如果服务的"登录"帐户有密码,我可以正确启动服务.但当我删除用户密码并再试一次时,我收到错误: "错误1069:由于登录失败,服务未启动"
服务无法在密码为空的帐户下运行?
我有两张桌子,ta和tb:
TA:
key col1
--------
k1 a
k2 c
Run Code Online (Sandbox Code Playgroud)
TB:
key col2
-------
k2 cc
k3 ee
Run Code Online (Sandbox Code Playgroud)
他们用"钥匙"连接起来.我想知道如何获得一个表,tc,如:
key col1 col2
-------------
k1 a
k2 c cc
k3 ee
Run Code Online (Sandbox Code Playgroud)
是否有简单的方法而不是插入每条记录?它们是一百万张表的记录,所以我需要一种有效的方法.
我需要将目录中的文件显示到 TVirtualStringTree。所以,我使用 SHGetFileInfo 来获取文件的图标。但似乎我只能获得“正常”图标(以下屏幕截图的左侧)。如果是这样,TVirtualStringTree 可以将图标绘制为“禁用”吗?就像您禁用了 a 节点一样。请看屏幕截图:

更新
Soft Gems 论坛中有一个类似的帖子。我可以获得图标的矩形,然后自己绘制图标。我正在使用 TcxImageList,它可以轻松绘制“禁用”图标。我首先在 GetImageIndex 事件中分配了一个不存在的图像索引,所以我有一个空间来绘制图标。然后使用以下代码进行绘制。
procedure TfrmMain.tvSharesAfterItemPaint(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; ItemRect: TRect);
var
rImage: TRect;
OffsetLeft: Integer;
begin
rImage := ItemRect;
with TVirtualStringTree(Sender) do begin
if (toShowRoot in TreeOptions.PaintOptions) then
OffsetLeft := Indent * (GetNodeLevel(Node) + 1)
else
OffsetLeft := Indent * GetNodeLevel(Node);
Inc(rImage.Left, Margin + OffsetLeft);
Inc(rImage.Top, (NodeHeight[Node] - Images.Height) div 2);
rImage.Right := rImage.Left + Images.Width;
rImage.Bottom := rImage.Top + Images.Height;
end;
// draw the …Run Code Online (Sandbox Code Playgroud) 我希望在以下函数中获得任何"记录"类型的大小.但似乎它不起作用:
function GetDataSize(P : Pointer) : Integer;
begin
Result := SizeOf(P^); // **How to write the code?**
end;
Run Code Online (Sandbox Code Playgroud)
例如,后续记录的大小为8个字节
SampleRecord = record
Age1 : Integer;
Age2 : Integer;
end;
Run Code Online (Sandbox Code Playgroud)
但GetDataSize(@a)总是返回1(当然,a是SampleRecord类型的变量).我该怎么办?
我注意到Delphi有一个程序过程New(var P:Pointer),可以分配内存块对应P指向的类型的大小.怎么能达到这个尺寸?