小编EPr*_*und的帖子

动态和虚拟方法有什么区别?

动态方法如何改进代码大小?
什么代码大小意味着??? 它意味着program.exe文件大小??

根据手册:

通常,虚方法是实现多态行为的最有效方法.当基类声明许多可覆盖的方法时,动态方法很有用,这些方法由应用程序中的许多后代类继承,但只是偶尔被覆盖.

当我只使用其中一个继承的类覆盖该方法时,如果我使用dynamic而不是virtual,我会得到什么,因为手册中还说:

虚拟方法优化速度,而动态方法优化代码大小.

delphi

21
推荐指数
1
解决办法
7659
查看次数

用于Blowfish引擎的Bouncy Castle CTS模式未按预期工作

也许我的期望是错的.我不是加密专家,我只是一个简单的用户.到目前为止,我已经详尽地试图使这项工作取得成功.

背景资料:

我正在尝试从Delphi Encryption Compendium移植Legacy Encryption,它使用Blowfish Engine(TCipher_Blowfish_)和CTS操作模式(cmCTS).私钥由RipeMD256(THash_RipeMD256)进行哈希处理.

问题:

输入纯文本字节数组的大小必须相同CIPHER_BLOCK.据我所知,它不应该.

来自维基百科:

在密码学中,密文窃取(CTS)是使用分组密码操作模式的一般方法,其允许处理不可均分成块的消息而不会导致密文的任何扩展,代价是稍微增加了复杂性.

输出与旧例程不同:

我正在使用:

  • 相同的IV
  • 相同的密码
  • 相同的输入纯文本

遗留应用程序使用ANSI String,新的使用Unicode,因此对于我调用的每个输入字符串Encoding.ASCII.GetBytes("plainText"),Encoding.ASCII.GetBytes("privatepassword").

然后由RipeMD256对私有密码字节进行散列,我检查了输出字节,它们是相同的.

我可以确认问题在Bouncy Clastle(操作模式或缺少配置/步骤)中是特定的,因为我已经下载了第二个库Blowfish.cs并使用8字节的输入(与密码块大小相同)并使用Encrypt_CBC(bytes[])with相同的IV产生与传统格式相同的输出.

这是我使用两个代码的草图Blowfish.csBouncy Castle:

德尔福加密纲要

var 
  IV: Array [0..7] of Byte (1,2,3,4,5,6,7,8);
  Key: String = '12345678';
with TCipher_Blowfish.Create('', nil) do
begin
  try
    InitKey(Key, @IV); //Key is auto hashed using RIPE256 here;
    Result:= CodeString('12345678', paEncode, -1); //Output bytes is later encoded as …
Run Code Online (Sandbox Code Playgroud)

c# delphi encryption bouncycastle

17
推荐指数
1
解决办法
716
查看次数

我需要在Delphi中完成记录数组吗?

在我的申请中,我有以下记录:

TTransaction = record
  Alias: string
  Description: string
  Creation: TDateTime
  Count: Integer
end;
Run Code Online (Sandbox Code Playgroud)

我在这个数组中使用此记录:

Transactions = array of TTransaction;
Run Code Online (Sandbox Code Playgroud)

我在运行时保持数组加载,但在给定时间我需要清除所有数据并添加一些新数据.

仅仅使用它就足够了:

SetLength(Transactions, 0); ?
Run Code Online (Sandbox Code Playgroud)

或者我需要完成一些事情吗?

delphi record finalization dynamic-arrays delphi-6

14
推荐指数
2
解决办法
1万
查看次数

Indy 10 - IdSMTP.Connect引发"无法加载SSL库".

这是我的配置:

IdSMTP1.Host := 'smtp.gmail.com';
IdSMTP1.Port := 587;
IdSMTP1.UseTLS := utUseExplicitTLS;
IdSMTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvTLSv1;
Run Code Online (Sandbox Code Playgroud)

我从下载了OpenSSL的这里,都libeay32.dllssleay32.dll在我申请的同一文件夹中.

Indy版本是:10.0.52

以下命令在我的机器上运行:

telnet smtp.gmail.com 587
Run Code Online (Sandbox Code Playgroud)

如何在TLS中正确连接启用SMTP服务器,在我的情况下是Gmail,使用Indy?

似乎IdSSLOpenSSLHeaders.Load无法找到以下程序的地址,其中包括:

  @IdSslSessionGetId := LoadIndyFunction(fn_SSL_SESSION_get_id);
  @IdSslSessionGetIdCtx := LoadIndyFunction(fn_SSL_SESSION_get_id_ctx);
  @IdSslCtxGetVersion := LoadIndyFunction(fn_SSL_CTX_get_version);
  @IdSslCtxSetOptions := LoadIndyFunction(fn_SSL_CTX_set_options);

  @iddes_set_odd_parity := LoadFunctionCLib(fn_des_set_odd_parity);
  @iddes_set_key := LoadFunctionCLib(fn_des_set_key);
  @iddes_ecb_encrypt := LoadFunctionCLib(fn_des_ecb_encrypt);
Run Code Online (Sandbox Code Playgroud)

这是从WhichFailedToLoad以下返回的消息:

 SSL_CTX_set_info_callback_indy 
 X509_STORE_CTX_get_app_data_indy 
 X509_get_notBefore_indy 
 X509_get_notAfter_indy 
 SSL_SESSION_get_id_indy 
 SSL_SESSION_get_id_ctx_indy 
 SSL_CTX_get_version_indy 
 SSL_CTX_set_options_indy 
 des_set_odd_parity 
 des_set_key des_ecb_encrypt
Run Code Online (Sandbox Code Playgroud)

delphi ssl smtp indy delphi-6

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

使用poFetchDetailsOnDemand刷新嵌套数据集

有没有办法只刷新Detail DataSet而不重新加载所有主数据集?

这是我到目前为止所尝试的:

DM.ClientDataSet2.Refresh;      
DM.ClientDataSet2.RefreshRecord;
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

DM.ClientDataSet1.Refresh;
Run Code Online (Sandbox Code Playgroud)

但是上面的方法会刷新整个Master数据集,而不仅仅是当前记录.

现在,以下代码似乎做了什么:

DM.ClientDataSet1.RefreshRecord;
Run Code Online (Sandbox Code Playgroud)

是否有解决方法或正确的方法来做我想要的?(也许是插入......)

附加信息:

ClientDataSet1 =主数据集

ClientDataSet2 = Detail DataSet,如下:*

object ClientDataSet2: TClientDataSet
    Aggregates = <>
    DataSetField = ClientDataSet1ADOQuery2
    FetchOnDemand = False
    .....
end
Run Code Online (Sandbox Code Playgroud)

提供者属性:

object DataSetProvider1: TDataSetProvider
    DataSet = ADOQuery1
    Options = [poFetchDetailsOnDemand]
    UpdateMode = upWhereKeyOnly
    Left = 24
    Top = 104
  end
Run Code Online (Sandbox Code Playgroud)

delphi tclientdataset delphi-7 dataset

9
推荐指数
1
解决办法
1449
查看次数

_TP_POOL结构的定义在哪里?

为了翻译windows vista线程池API在我的delphi应用程序中使用.我需要知道的定义_TP_POOL.我调查了一下winnt.h,发现了以下typedef声明:

typedef struct _TP_POOL TP_POOL, *PTP_POOL; 
Run Code Online (Sandbox Code Playgroud)

我找不到_TP_POOL我的本地头文件.它的位置是哪个?

c windows delphi winapi header-files

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

TADOQuery准备好了

TADOQuery组件具有"准备"属性,手册说当准备好设置为TRUE时,ADO'准备'命令,这意味着什么?

这是手册解释:

在调用Execute方法之前设置Prepared以指定ADO是否准备命令.如果将Prepared设置为True并且命令组件连接到数据存储,则ADO会在执行命令之前准备该命令.如果Prepared设置为False,则ADO不会准备该命令.

它将参数注入SQL Text?

delphi ado delphi-6

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

CompareMem是否适合比较两个数组是否相等?

我需要比较给定数组的所有项目是否相同。

现在,我有以下代码:

Type
  TD = array [0..1] of TDateTime;

var A: TD;
    B: TD;
begin
  A[0] := Date-1;   A[1] := Date+1;
  B[0] := Date-1;   B[1] := Date+1;

  if CompareMem(@A, @B, SizeOf(TD)) then
    Showmessage('Equals')
  else
    Showmessage('Differ');
Run Code Online (Sandbox Code Playgroud)

这工作正常,但是由于CompareMem是用汇编编写的,因此我(目前)还无法理解它的作用。

CompareMem是执行我想要的事情的有效方法吗?另外,我想知道是否适用于所有数据类型,例如字符串,整数等。

arrays delphi compare

5
推荐指数
2
解决办法
4041
查看次数

为什么TEdit只显示长度等于或小于37440个字符的文本?

如果你这样做:

  Edit1.Text := StringOfChar('X', 37440);
Run Code Online (Sandbox Code Playgroud)

它会显示文本,但是如果你这样做:

  Edit1.Text := StringOfChar('X', 37441);
Run Code Online (Sandbox Code Playgroud)

文本不会出现.

有人知道为什么吗?
如果这是一个错误,还有另一种方法可以调整而不是将所有现有组件替换为TMemo吗?
为什么选择37440?

delphi user-controls delphi-6

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

免费通知如何工作?

目前,我正在尝试了解Delphi的VCL,特别是通知机制(在我看来这是一个很棒的机制)。

当我学习这个主题时,我想起了TLabeledEdit,当然我已经使用它很长时间了,但我从来没有机会停下来研究它的代码。

据我所知到目前为止:

当 TComponent 被销毁时:

  1. 它将通知其所有子组件,将其包含csDestroying在其状态中。
  2. FreeNotifiers部分。我无法理解。
  3. 将迭代components列表并且:
    1. components从列表中删除每个项目
    2. 实际上销毁每个组件实例。

当子组件被销毁时,它会为其所有子组件重新启动相同的进程。所以,据我所知,这是一个连锁效应。

我不明白的是FreeNotification,我能用它做什么?

让我们TLabeledEdit首先考虑一下。通知的相关部分,在TLabeledEdit的代码中是对函数的重写Notification,代码如下:

  if (AComponent = FEditLabel) and (Operation = opRemove) then
    FEditLabel := nil;
Run Code Online (Sandbox Code Playgroud)

FreeNotification如果不使用会发生什么?

一般来说,由于这种机制我会得到什么好处,以及我没有看到什么最终可能使它的存在变得必要?

delphi user-interface vcl

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