小编Cod*_*345的帖子

对smtp.live.com和TIdSmtp(Indy,Delphi)的SSL支持

我正在尝试连接到smtp.live.com发送电子邮件(live.com支持自2009年以来的免费pop3/smtp,但这对我来说完全是新闻).

以下是当我尝试连接到smtp.live.com端口587时发生的情况:

Method sslvSSLv2  - timeout (obviously the server does not support SSL2)
Method sslvSSLv3  - Error connecting with SSL. - error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number
Method sslvSSLv23 - Error connecting with SSL. - error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
Method sslvTLSv1  - Error connecting with SSL. - error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number
Run Code Online (Sandbox Code Playgroud)

我使用与sslvSSLv23和sslvTLSv1相同的代码,它与gmail smtp(smtp.gmail.com,端口465)服务器一起正常工作.此外,Outlook在检查SSL时正常发送邮件,在端口587上发送邮件,因此它可能与OpenSSL相关.任何人都可以帮我解开这个谜团吗?我错过了设置的东西吗?

delphi openssl smtp indy indy10

8
推荐指数
1
解决办法
5788
查看次数

使用Set8087CW,SetMXCSR和TWebBrowser屏蔽浮点异常

由于我不时在使用TWebBrowser和TEmbeddedWB时收到"浮点除零"异常,我发现我需要屏蔽除零除异常Set8087CW或SetMXCSR.

Q1:这样做的最佳方法是什么:

  1. 在应用程序启动的早期屏蔽这些异常,再也不要再触摸它们(应用程序是多线程的)?
  2. 使用OnBeforeNavigateOnDocumentComplete事件掩盖/取消屏蔽异常?(文档加载后是否有可能发生异常?)

Q2:什么是最好的"命令"来屏蔽"除以零"而没有别的 - 如果应用程序是32位,是否需要屏蔽64位异常?

我正在使用它的应用程序,它一直可用于显示电子邮件内容的TWebBrowser控件.

此外,如果有人可以澄清 - 这是来自Microsoft的TWebBrowser控件的特定错误还是Delphi/C++ Builder和Microsoft工具之间的区别?如果我在Visual C++应用程序中托管TWebBrowser会出现如果出现除零错误会发生什么 - 它不会被转换为异常但会发生什么 - 那么Visual C++将如何处理"除以零"异常呢?

有点奇怪的是,微软在很长一段时间内没有注意到这个问题 - 也很奇怪,Embarcardero也没有注意到它.因为有效屏蔽浮点异常也会为此特定目的屏蔽您自己的程序异常.

UPDATE

经过一番检查,我的最终解决方案是

SetExceptionMask(GetExceptionMask() << exZeroDivide);
Run Code Online (Sandbox Code Playgroud)

GetExceptionMask()的默认状态返回:TFPUExceptionMask() << exDenormalized << exUnderflow << exPrecision.很明显,一些例外已被掩盖 - 这只会增加exZeroDivide掩盖的异常.

因此,现在每个除零都会导致浮点数+ INF而不是异常.我可以忍受 - 对于代码的生产版本,我将屏蔽它以避免错误,对于调试版本,它将被解除屏蔽以检测浮点除以零.

delphi exception c++builder webbrowser-control twebbrowser

8
推荐指数
1
解决办法
3585
查看次数

VirtualTreeView - 同一节点中不同颜色的文本

我正在尝试创建一个TVirtualStringTree类似于以下内容的视图:

用不同的字体颜色的文件夹视图

在上面的例子中,我展示了一些我想要达到的可能场景.FolderA具有粗体文本,之后在同一节点中位于其后面的红色非压缩文本.我正在寻找制作这种输出的方法.

但是,如果创建太难或太难,我会对FolderBFolderC类型的输出感到满意- 这可能是由2列组成的,一列包含文件夹名称,另一列包含内部文件的数量.

FolderD在这里仅作为没有文件的文件夹的示例和该文件夹的输出(文本是非文本的,没有数字).

我正在寻找任何方向如何产生这种效果,因为似乎VirtualTreeView每个节点只能有单色或粗体设置.任何提示或建议如何向FolderAFolderBFolderC的方向移动高度赞赏,所以我有一个起点.Delphi或C++ Builder示例都是受欢迎的(最终代码将在C++ Builder中).

delphi c++builder virtualtreeview tvirtualstringtree

8
推荐指数
1
解决办法
3594
查看次数

在Delphi / C ++ Builder中使用WebView(EdgeHTML)

我是否正确理解EdgeHTML现在可以在Windows 10中用于桌面(Win32 / Win64应用程序)?根据这些博客文章:

https://blogs.windows.com/msedgedev/2018/05/09/modern-webview-winforms-wpf-apps/ https://blogs.windows.com/msedgedev/2018/10/04/edgehtml-18- october-2018-update / https://docs.microsoft.com/zh-cn/windows/communitytoolkit/controls/wpf-winforms/webview

似乎Microsoft已添加了EdgeHTML WebViewControl for Windows桌面(Win32)应用程序,该应用程序到目前为止尚不适用于桌面应用程序(仅基于Trident的MSHTML控件可用于桌面应用程序)。

如果是这样,是否有可能在Delphi / C ++ Builder中使用它,还是必须在RAD Studio的新更新中等待新的TWebView控件?如果可能-是否有任何代码示例可供查看(C ++ Builder或Delphi)?.NET的要求是否意味着它不能在RAD Studio生产的常规Win32 / Win64应用中使用?

delphi c++builder webview microsoft-edge

8
推荐指数
2
解决办法
1802
查看次数

如果鼠标不在VirtualTreeView(TVirtualStringTree)上,如何禁用MouseWheel

TVirtualStringTree行为默认情况下,如果它的重点是 - 它会在鼠标滚轮滚动即使鼠标不在控制(除非它是对另一TVirtualStringTree).

是否有一种快速而优雅的方法来禁用此行为?

我已经这样做与OnMouseWheel事件,并检查PtInRect是否Mouse.CursorPos如果是在控制,但我有一种感觉,有一种更好的方式做同样的,因为这样,我不得不定义每个树视图我想补充,也是一个新的事件处理何时聚焦/取消聚焦控件,所以我希望必须有更好的方法来禁用它.

所以要清楚,我希望鼠标滚轮功能像往常一样工作,但只有当鼠标在VirtualTreeView上时.

delphi c++builder virtualtreeview delphi-2010 c++builder-2010

7
推荐指数
1
解决办法
2484
查看次数

了解TCriticalSection和Synchronize

我想在这里证实,如果我理解正确的是如何TCriticalSectionSynchronize操作.

据我所知,现在Synchronize使用SendMessage(更新:或者至少在下面几条评论中提到的较旧的VCL版本中使用它),它暂停当前正在执行的线程(以及任何其他线程),不像那样PostMessage,然后执行所需功能(来自主线程).在SendMessage执行时"停止"多线程.

但我不确定TCriticalSection.比方说我创建这样的东西:

// Global variables somewhere in my code any thread can access
boost::scoped_ptr<TCriticalSection> ProtectMyVarAndCallFnction(new TCriticalSection);
int MyVariable1;
void CallMyFunctionThatAlsoModifiesMoreStuff() { /* do even more here */ };


// Thread code within one of the threads
try {
    ProtectMyVarAndCallFnction->Acquire();
    MyVariable1++;
    CallMyFunctionThatAlsoModifiesMoreStuff();
    }
__finally {
    ProtectMyVarAndCallFnction->Release();
    }
Run Code Online (Sandbox Code Playgroud)

现在,我的问题是 - 关键部分如何"知道"我在这种情况下保护MyVariable1以及被调用的函数可以修改什么?

如果我理解正确 - 它没有 - 并且我有责任在任何线程中正确调用Acquire()想要更改MyVariable1或调用此函数(或执行任何两个).换句话说,我认为TCriticalSection是用户定义的块,它定义了我分配给它的逻辑.它可以是一组变量或任何特定函数,只要我在可能写入此块或使用此函数的所有线程中调用Acquire().例如,"DiskOp"可能是我TCriticalSection在磁盘上写入的名称,"Internet"可能是TCriticalSection调用从Internet检索某些数据的函数的名称.我弄错了吗?

此外,在这种情况下,TCriticalSection是否总是需要成为一种全局变量?

delphi multithreading c++builder critical-section synchronize

7
推荐指数
1
解决办法
3234
查看次数

如何使Indy OpenSSL与大多数服务器兼容

我使用以下代码为POP3/SMTP发送/接收应用程序设置SSLHandler:

IdSSLHandler->SSLOptions->Mode        = sslmClient;
IdSSLHandler->SSLOptions->Method      = slvSSLv23;
IdSSLHandler->SSLOptions->SSLVersions = TIdSSLVersions() << sslvSSLv3 << sslvTLSv1 << sslvTLSv1_1 << sslvTLSv1_2;
Run Code Online (Sandbox Code Playgroud)

因此,上述代码应该自动支持SSL 3,TLS 1,TLS 1.1和TLS 1.2.这不能很好地报告"错误的版本"错误.当该SSLVersions行被删除然后它工作但默认情况下它包括sslvSSLv2我不想支持.它是一样的:

IdSSLHandler->SSLOptions->Mode        = sslmClient;
IdSSLHandler->SSLOptions->Method      = slvSSLv23;
IdSSLHandler->SSLOptions->SSLVersions = TIdSSLVersions() << sslvSSLv2 << sslvSSLv3 << sslvTLSv1 << sslvTLSv1_1 << sslvTLSv1_2;
Run Code Online (Sandbox Code Playgroud)

出于某种原因,这可行,而上述不在同一台服务器上.我知道这slvSSLv23是一种"使用任何可用版本"的价值.那么为什么它不适用于版本2不存在的上述代码?

另外,我可以使用似乎广泛部署的TSL1,但如果服务器支持1.1或1.2,那么我的代码将不会使用更新版本,但会强制使用1.0版本,除非使用上述内容.

我想用以下目标进行初始化:

  • 与所有服务器兼容,无论他们使用的是v3,tls1,tls1.1还是tls1.2
  • 如果服务器上没有更新版本但不低于版本3,则自动使用最新版本并使用较低版本 - 如果版本低于3,则失败/异常

我认为代码的第一个版本会提供,但它会报告版本错误.上述目标是否可行,或者必须提供用户设置才能选择要使用的SSL版本?

openssl indy indy10

6
推荐指数
1
解决办法
6663
查看次数

如何构建数据库以进行快速节点访问

我正在寻找一种方法来构建数据库与VirtualTreeView和SQLite数据库,以便快速检索数据.使用VirtualTreeView有一个OnNodeInit事件,但它并不总是适用于此目的.

数据从Usenet新闻组中获取,需要进行线程化.对线程有用的数据是post id(int64,也是主键),引用(引用线程中先前帖子的字符串).

程序在引用中搜索字符串并确定它应该在哪个postid.因此,例如post id = 1234,则下一篇文章可能是1235,然后1236可能是对1234的回复.

这是一个可能的数据库示例:

post id    references    parent id
  1234      .... ....       0
  1235      .... ....       0
  1236      .... ....      1234
Run Code Online (Sandbox Code Playgroud)

所以现在这就是它现在的样子.

现在,问题是如何构建此数据以加快检索速度.如果只有一个根节点,我可以根据数据库条目分配RootNodeCount,然后在OnNodeInit中按要求逐个读取它们.当有子节点时,我需要以某种方式重新排列数据库,以便它知道如何更快地获取子节点,具体取决于打开哪个节点.

我正在考虑分配附加字段"has_subnodes",其中包含以下子节点的ID.单击节点时,它将读取该节点和每个链接节点.

你将如何组织这个数据库,以便在OnNodeInit中很好地阅读它,或者你会使用那个事件吗?也可以使用AddChildNoInit()方法启动节点.欢迎任何想法或指示.

更新(以及我如何解决)

这里提供了一些非虚拟视图相关信息: 在数据库中实现分层数据结构

我最终做的是使用Modified Preorder Tree Traversal在数据库中存储有关节点的信息,并且每次首先请求某个节点时:

a)在内部缓存中查找它基本上与VirtualTreeView结构保持相同的结构.

b)如果在缓存中找到,则删除此缓存条目(它永远不会超过100个项目)

c)如果未找到,则在缓存中添加额外的100个项目(从请求的节点向上50个,向下50个).如果需要,此课程数可以修改为500或1000个项目.还有一些额外的检查可以查看需要读取多少上/下来以避免读取过多的重复条目.

d)如果我需要更高的速度,我可以应用额外的技术 - 根据用户滚动虚拟视图的数量从数据库加载节点 - 类似于std :: vector如何分配内存 - 首先我只加载100个节点,然后如果用户滚动了很多,我加载200,然后400等...越多的用户滚动加载整个树的速度越快,但如果他/她从不滚动,仍然不加载它.

这样,永远不会从数据库加载从未见过的节点.(当它经过点高速缓存为空,从盘需要更多的数据,偶尔短的延迟)和用于与箭头按钮/键滚动它工作正常用于与鼠标滚轮滚动.将滚动条拖动到某个位置(例如从底部到中间)时速度会慢一些,但由于无法立即从磁盘中获取数据,因此可以预期.

最好是我在加载之前预先确定要用于缓存/项目的内存量,滚动速度越快但当然如果数据从未显示则会占用更多内存.

delphi sqlite c++builder hierarchical-data virtualtreeview

5
推荐指数
1
解决办法
2650
查看次数

在 Delphi 或 C++ Builder 中使用 Chromium Edge WebView2

现在 Microsoft Chromium Edge 是最终版本,是否可以在 Delphi 或 C++ Builder 中使用它?

据我了解,它基于一个WebView2组件。

是否有诸如TWebView2Embarcadero 之类的组件或将提供一个组件?是否有示例如何在 Delphi/C++ Builder 中托管 WebView2?

安装最新的 Edge 版本是否足以让应用程序可以使用它?

有一个旧版本的例子 - EdgeHTML - 这里: Using WebView (EdgeHTML) in Delphi / C++ Builder

更新:上述问题已在 RAD Studio 10.4+ 版本中使用新版本的 Edge 更新,该版本现在使用 WebView2。所以看上面的问题。

delphi c++builder chromium microsoft-edge

5
推荐指数
1
解决办法
2572
查看次数

使用 SafeNet Thales 令牌上的 EV 代码签名证书进行签名时避免出现重复的密码提示

我有一个带有 EV 代码签名证书的 Thales SafeNet 令牌。

signtool要签署我在命令行中使用的可执行文件:

signtool sign /tr "http://timestamp.digicert.com" /td sha256 /fd sha256 /as /n "CERTIFICATE NAME ON TOKEN" /v "D:\path\to\file.exe"

这个过程有效。对文件进行签名后,将弹出SafeNet 身份验证客户端密码提示,并且文件已成功签名。

但是,当在批处理循环中使用上述命令行对每个文件进行签名时,每次都会出现密码弹出窗口。

有没有办法在会话中只询问一次(或者将其作为命令行参数放入批处理文件中signtool- 我可以使用变量在批处理文件本身中提示密码SET)?

(密码)参数仅在从文件(参数)/p签名时才有效,因此这不适用于令牌。.PFX/f

code-signing code-signing-certificate safenet

4
推荐指数
1
解决办法
1391
查看次数