我正在尝试连接到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相关.任何人都可以帮我解开这个谜团吗?我错过了设置的东西吗?
由于我不时在使用TWebBrowser和TEmbeddedWB时收到"浮点除零"异常,我发现我需要屏蔽除零除异常Set8087CW或SetMXCSR.
Q1:这样做的最佳方法是什么:
OnBeforeNavigate和OnDocumentComplete事件掩盖/取消屏蔽异常?(文档加载后是否有可能发生异常?)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而不是异常.我可以忍受 - 对于代码的生产版本,我将屏蔽它以避免错误,对于调试版本,它将被解除屏蔽以检测浮点除以零.
我正在尝试创建一个TVirtualStringTree类似于以下内容的视图:

在上面的例子中,我展示了一些我想要达到的可能场景.FolderA具有粗体文本,之后在同一节点中位于其后面的红色非压缩文本.我正在寻找制作这种输出的方法.
但是,如果创建太难或太难,我会对FolderB或FolderC类型的输出感到满意- 这可能是由2列组成的,一列包含文件夹名称,另一列包含内部文件的数量.
FolderD在这里仅作为没有文件的文件夹的示例和该文件夹的输出(文本是非文本的,没有数字).
我正在寻找任何方向如何产生这种效果,因为似乎VirtualTreeView每个节点只能有单色或粗体设置.任何提示或建议如何向FolderA或FolderB或FolderC的方向移动高度赞赏,所以我有一个起点.Delphi或C++ Builder示例都是受欢迎的(最终代码将在C++ Builder中).
我是否正确理解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应用中使用?
TVirtualStringTree行为默认情况下,如果它的重点是 - 它会在鼠标滚轮滚动即使鼠标不在控制(除非它是对另一TVirtualStringTree).
是否有一种快速而优雅的方法来禁用此行为?
我已经这样做与OnMouseWheel事件,并检查PtInRect是否Mouse.CursorPos如果是在控制,但我有一种感觉,有一种更好的方式做同样的,因为这样,我不得不定义每个树视图我想补充,也是一个新的事件处理何时聚焦/取消聚焦控件,所以我希望必须有更好的方法来禁用它.
所以要清楚,我希望鼠标滚轮功能像往常一样工作,但只有当鼠标在VirtualTreeView上时.
delphi c++builder virtualtreeview delphi-2010 c++builder-2010
我想在这里证实,如果我理解正确的是如何TCriticalSection和Synchronize操作.
据我所知,现在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
我使用以下代码为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版本,除非使用上述内容.
我想用以下目标进行初始化:
我认为代码的第一个版本会提供,但它会报告版本错误.上述目标是否可行,或者必须提供用户设置才能选择要使用的SSL版本?
我正在寻找一种方法来构建数据库与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等...越多的用户滚动加载整个树的速度越快,但如果他/她从不滚动,仍然不加载它.
这样,永远不会从数据库加载从未见过的节点.(当它经过点高速缓存为空,从盘需要更多的数据,偶尔短的延迟)和用于与箭头按钮/键滚动它工作正常用于与鼠标滚轮滚动.将滚动条拖动到某个位置(例如从底部到中间)时速度会慢一些,但由于无法立即从磁盘中获取数据,因此可以预期.
最好是我在加载之前预先确定要用于缓存/项目的内存量,滚动速度越快但当然如果数据从未显示则会占用更多内存.
现在 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。所以看上面的问题。
我有一个带有 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
delphi ×8
c++builder ×7
indy ×2
indy10 ×2
openssl ×2
chromium ×1
code-signing ×1
delphi-2010 ×1
exception ×1
safenet ×1
smtp ×1
sqlite ×1
synchronize ×1
twebbrowser ×1
webview ×1