动态方法如何改进代码大小?
什么代码大小意味着??? 它意味着program.exe文件大小??
根据手册:
通常,虚方法是实现多态行为的最有效方法.当基类声明许多可覆盖的方法时,动态方法很有用,这些方法由应用程序中的许多后代类继承,但只是偶尔被覆盖.
当我只使用其中一个继承的类覆盖该方法时,如果我使用dynamic而不是virtual,我会得到什么,因为手册中还说:
虚拟方法优化速度,而动态方法优化代码大小.
也许我的期望是错的.我不是加密专家,我只是一个简单的用户.到目前为止,我已经详尽地试图使这项工作取得成功.
背景资料:
我正在尝试从Delphi Encryption Compendium移植Legacy Encryption,它使用Blowfish Engine(TCipher_Blowfish_)和CTS操作模式(cmCTS).私钥由RipeMD256(THash_RipeMD256)进行哈希处理.
问题:
输入纯文本字节数组的大小必须相同CIPHER_BLOCK.据我所知,它不应该.
来自维基百科:
在密码学中,密文窃取(CTS)是使用分组密码操作模式的一般方法,其允许处理不可均分成块的消息而不会导致密文的任何扩展,代价是稍微增加了复杂性.
输出与旧例程不同:
我正在使用:
遗留应用程序使用ANSI String,新的使用Unicode,因此对于我调用的每个输入字符串Encoding.ASCII.GetBytes("plainText"),Encoding.ASCII.GetBytes("privatepassword").
然后由RipeMD256对私有密码字节进行散列,我检查了输出字节,它们是相同的.
我可以确认问题在Bouncy Clastle(操作模式或缺少配置/步骤)中是特定的,因为我已经下载了第二个库Blowfish.cs并使用8字节的输入(与密码块大小相同)并使用Encrypt_CBC(bytes[])with相同的IV产生与传统格式相同的输出.
这是我使用两个代码的草图Blowfish.cs和Bouncy 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) 在我的申请中,我有以下记录:
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)
或者我需要完成一些事情吗?
这是我的配置:
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.dll和ssleay32.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) 有没有办法只刷新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) 为了翻译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我的本地头文件.它的位置是哪个?
TADOQuery组件具有"准备"属性,手册说当准备好设置为TRUE时,ADO'准备'命令,这意味着什么?
这是手册解释:
在调用Execute方法之前设置Prepared以指定ADO是否准备命令.如果将Prepared设置为True并且命令组件连接到数据存储,则ADO会在执行命令之前准备该命令.如果Prepared设置为False,则ADO不会准备该命令.
它将参数注入SQL Text?
我需要比较给定数组的所有项目是否相同。
现在,我有以下代码:
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是执行我想要的事情的有效方法吗?另外,我想知道是否适用于所有数据类型,例如字符串,整数等。
如果你这样做:
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的VCL,特别是通知机制(在我看来这是一个很棒的机制)。
当我学习这个主题时,我想起了TLabeledEdit,当然我已经使用它很长时间了,但我从来没有机会停下来研究它的代码。
据我所知到目前为止:
当 TComponent 被销毁时:
csDestroying在其状态中。FreeNotifiers部分。我无法理解。components列表并且:
components从列表中删除每个项目当子组件被销毁时,它会为其所有子组件重新启动相同的进程。所以,据我所知,这是一个连锁效应。
我不明白的是FreeNotification,我能用它做什么?
让我们TLabeledEdit首先考虑一下。通知的相关部分,在TLabeledEdit的代码中是对函数的重写Notification,代码如下:
if (AComponent = FEditLabel) and (Operation = opRemove) then
FEditLabel := nil;
Run Code Online (Sandbox Code Playgroud)
FreeNotification如果不使用会发生什么?
一般来说,由于这种机制我会得到什么好处,以及我没有看到什么最终可能使它的存在变得必要?
delphi ×10
delphi-6 ×4
ado ×1
arrays ×1
bouncycastle ×1
c ×1
c# ×1
compare ×1
dataset ×1
delphi-7 ×1
encryption ×1
finalization ×1
header-files ×1
indy ×1
record ×1
smtp ×1
ssl ×1
vcl ×1
winapi ×1
windows ×1