小编mgh*_*hie的帖子

如何通过shell打开调用Delphi程序打开多个文件

我目前正在使用:

if ParamStr(1)<>'%1' then
begin
  address.Text:=ParamStr(1);
  autoconfigfile;
end;
Run Code Online (Sandbox Code Playgroud)

获取用于通过文件关联打开文件的文件的名称.

我现在想要开发对多个文件进行操作的能力.即如果我选择5个文件并右键单击并选择打开"EncryptionSystem".我有注册表项:

  reg.OpenKey('*\shell\Encrypt\command', true);
  reg.WriteString('','C:\Program Files\EncryptionSystem\EncryptionSystem.exe "%1"');
  reg.CloseKey;
Run Code Online (Sandbox Code Playgroud)

为所有文件添加右键单击打开功能.然后我想要检测的能力

  1. 多少个文件
  2. 每个文件的路径名

delphi parameters filenames command-line

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

比SHA1更好的散列

我正在处理一个应用程序,我需要存储用户密码,所以我想我会将它存储在注册表的当前用户类中,但我也想把它哈希,原因很明显,我已经看到新闻项目表明SHA1已被破解,"标准"系统或.net中是否有更好的(未破解的)散列算法?

c# hash

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

Delphi数组对齐设置为4,8或16字节边界?

我想使用Delphi 2009的FFTW C库并根据本文档;

http://www.fftw.org/install/fftw_usage_from_delphi.txt

为了提高FFTW库内的性能(使其可以使用SIMD扩展),传入Single(float)或Double(double)的数组需要在4或8字节边界对齐.我找到了关于记录结构对齐的文档,但没有关于数组的具体内容.在Delphi 2009中有没有办法做到这一点.

所以代码(从上面的文档中复制)看起来像这样;

var
      in, out : Array of Single; // Array aligned at 4 byte boundary
      plan : Pointer;

    {$APPTYPE CONSOLE}

    begin

      ...  

      SetLength(in, N);
      SetLength(out, N);

      plan := _fftwf_plan_dft_1d(dataLength, @in[0], @out[0],
                                 FFTW_FORWARD, FFTW_ESTIMATE);
Run Code Online (Sandbox Code Playgroud)

同样在上面的文档中,他们讨论了8和16字节的边界,但它看起来它应该是4和8字节边界,如果有任何可以清除,那将是伟大的.

谢谢,布鲁斯

arrays delphi alignment

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

Firebird:如何从新添加的生成器为现有行分配id

我有一个表已经包含一些行,并没有主键.

我想现在添加一个主键,但为此我需要为现有行的主键字段设置唯一值.如何使用新添加的发电机完成?

sql firebird

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

我在inno设置自定义页面中需要帮助

在Inno Setup中,我创建了一个自定义页面,其中包含以下代码,其中包含3个文本框.

现在我想验证自定义窗体下一个按钮单击的文本框.如果在text.text ='2121212'中,用户输入了一些文本,则只启用下一个按钮.

[CustomMessages]
CustomForm_Caption=CustomForm Caption
CustomForm_Description=CustomForm Description
CustomForm_Label1_Caption0=College Name:
CustomForm_Label2_Caption0=Product Type:
CustomForm_Label3_Caption0=Product ID:

[Code]
var
  Label1: TLabel;
  Label2: TLabel;
  Label3: TLabel;
  Edit1: TEdit;
  Edit2: TEdit;
  Edit3: TEdit;
  Edit4: TEdit;
  Edit5: TEdit;
  Edit6: TEdit;

{ CustomForm_Activate }

procedure CustomForm_Activate(Page: TWizardPage);
begin
  // enter code here...


end;

{ CustomForm_ShouldSkipPage }

function CustomForm_ShouldSkipPage(Page: TWizardPage): Boolean;
begin
  Result := False;
end;

{ CustomForm_BackButtonClick }

function CustomForm_BackButtonClick(Page: TWizardPage): Boolean;
begin
  Result := True;
end;

{ CustomForm_NextkButtonClick }

function CustomForm_NextButtonClick(Page: TWizardPage): Boolean;
begin
  RegWriteStringValue(HKEY_LOCAL_MACHINE, …
Run Code Online (Sandbox Code Playgroud)

inno-setup

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

如何在Inno Setup的InputDirPage中显示/使用用户选择的应用程序路径{app}?

我正在使用Inno Setup创建一个安装程序.我必须从用户那里采取两条路径.一个用于程序可执行文件,另一个用于库.默认的app文件夹是{pf}/companyname/applicationname

InitializeWizard我创建了第二页,它从用户获取lib文件夹.

有没有办法将默认的lib文件夹更改为用户选择的文件夹{app}

我试过了WizardDirValue.它只提供默认{app}值,而不是用户在第一页中选择的路径.

[code]  
procedure InitializeWizard();  
begin  
  page2:= CreateInputDirPage(wpProgress,
    'Select Library Location', 'Where Library files should be stored?',
    'To continue, click Next. If you would like to select a different folder, click Browse.',
    False, 'Libs');    
  page2.Add('');  
  page2.Values[0] := WizardDirValue+'\libs';  
  LibDir := page2.Values[0];  
end
Run Code Online (Sandbox Code Playgroud)

installer pascal inno-setup

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

将参数传递给Synchronize过程调用

在创建线程对象时,我想从需要同步的应用程序中调用代码.问题是我不知道如何调用Synchronize带参数的应用程序函数.

说我们有

procedure ThreadObject.Execute;
var
  val1,val2:integer;
  Star:string;
begin
  Synchronize(funcyfunc); //how to pass val1,val2,star here?
end;
Run Code Online (Sandbox Code Playgroud)

其中funcyfunc定义如下

procedure OtherClass.funcyfunc(param1,param2:integer;spok:string);
begin
   letsCallFriends(spok,param1);
   letsCallFriends(spok,param2);
end;
Run Code Online (Sandbox Code Playgroud)

现在奇怪的解决方案是在ThreadObject私有中说

private
  star:string;
  val1,val2:integer;
  procedure starVal;
Run Code Online (Sandbox Code Playgroud)

在我们的实施中

procedure ThreadObject.starVal;
begin
  funcyfunc(Star,val1,val2);
end;
Run Code Online (Sandbox Code Playgroud)

并在线程执行中我们改为

procedure ThreadObject.Execute;
var
  val1,val2:integer;
  Star:string;
begin
  Synchronize(starVal); //how to pass val1,val2,star here?
end;
Run Code Online (Sandbox Code Playgroud)

但这是一个麻烦,因为每个过程调用必须有一个全局变量.有没有更好的办法?

码:

unit ThreadObject;

interface

uses
  Classes;

type
  TThreadObject= class(TThread)
  private
    star:string;
    val1,val2:integer;
    procedure starVal;
  protected
    procedure Execute; override;

    //assume we have a constructor that ini the star …
Run Code Online (Sandbox Code Playgroud)

delphi multithreading delphi-2009 synchronize

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

调用FastMM4 LogAllocatedBlocksToFile()是否会定期用完内存空间吗?

我正在Delphi 5程序中寻找一个难以捉摸的内存问题,该内存在客户站点被随机覆盖。在尝试了许多没有结果的事情之后,我现在想使用来自的FastMM4输出LogAllocatedBlocksToFile()来找出在覆盖区域之前立即分配了哪些对象。该程序使用计时器每30分钟将分配的块信息写入一个新文件。不幸的是EOutOfMemory,根据MadExcept的说法,使用分配的1.83 GB内存后,我的程序(DEBUG版本)的测试运行在大约23小时后崩溃,但异常。

在SysInternals Process Explorer中,它看起来像每次LogAllocatedBlocksToFile()分配调用,但不会释放内存:

运行100分钟的程序的Process Explorer屏幕快照

“ CPU使用率”图中的红色峰值是LogAllocatedBlocksToFile()调用。我已经LogMemoryManagerStateToFile()在之前和之后添加了调用,最后一个峰值的数据(私有字节从大约183 MB增加到大约218 MB)看起来像这样:

55054K分配的
47911K开销
53%的效率

和这个:

55055K分配的
47910K开销
53%的效率

因此,根据Process Explorer,FastMM4似乎不知道程序占用的额外内存。

我使用的是FastMM4的4.991版本,今天已从SourceForge下载。测试程序以DEBUG模式运行,并设置了以下定义:

FullDebugMode

UseCustomFixedSizeMoveRoutines
UseCustomVariableSizeMoveRoutines
NoDebugInfo
ASMVersion
DetectMMOperationsAfterUninstall
RawStackTraces
LogErrorsToFile
LogMemoryLeakDetailToFile
AlwaysAllocateTopDown
SuppressFreeMemErrorsInsideException
EnableMemoryLeakReporting
HideExpectedLeaksRegisteredByPointer
RequireDebuggerPresenceForLeakReporting
EnableMMX
ForceMMX EnableBackwardCompatibleMMSharing
UseOutputDebugString

问题:

这些功能是否存在任何已知问题?我是否没有正确使用它们,难道它们不打算在一个调试会话中多次调用吗?有没有办法再次释放该内存?

delphi delphi-5 fastmm

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

从 D2006 移植到 XE5 后偶尔出现访问冲突,在 XP 兼容模式下不会发生

我们有一个在 Delphi 2006 中运行良好的大型应用程序。我们已将其移至 XE5,并且经常遇到零星的访问冲突。我们正在使用 VCL 表单和许多 DevExpress 和其他第三方组件。我们正在使用带有 Delphi XE Enterprise 版本 19.0.14356.6604 的 Windows 7 Professional。

在移植到 XE5 之后,我们在网上、这里和其他地方查看了有关 A/V 的帖子,但没有发现任何似乎与我们的问题相关的内容。

以下是我们对 A/V 的了解:

  • 它们通常出现在相同的地址:0x50059f27。有时它们发生在 0x5005eb86,通常是在另一个地址触发了 A/V 之后。
  • 它们发生在应用程序中的各种不同位置和操作中。
  • 它们不是 100% 可重复的。有时,项目的重建会消除一个触发因素,但随后其他因素会触发它。它们似乎在构建中保持相当一致的可重现性。
  • 它们通常与打开对话框或激活返回大量记录(1,000+)的查询有关。
  • D2006 版本(我们在 XP 机器或 XP 虚拟机上运行)不会发生这种情况。 - 当我们在 XP-SP3 兼容模式下运行 XE5 应用程序时,它们不会发生。
  • 如果我们在典型的 A/V 之后中断,则指针将在 System.pas 中的第 562 行,在下面的代码部分的{$IFDEF CPUX86}asm 部分procedure Move(const Source; var Dest; Count: NativeInt);中。线路是FILD QWORD PTR [EAX] {Last 8}

我们猜测这个问题与我们的应用程序如何处理 Windows 7 内存管理有关,但我们不知道如何找出哪里出错了。附加了一个示例调用堆栈。

任何人都可以建议我们如何继续解决此问题?是否有第三方调试工具可以提供帮助?我们是否可以使用 Delphi IDE …

delphi access-violation windows-7 delphi-xe5

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

如何在列表视图中获取项目和子项目?

我想在listview中获取所有项目和子项目,但我得到的只是"TlistItem"

这是我的代码:

procedure TFrameAnalyzer.AddEntry(opcode:word;data:Array of byte;direction:byte);
begin
  MessageBox(0,PChar(sListView1.Items.Item[4].ToString),'',0);
end;
Run Code Online (Sandbox Code Playgroud)

如何将项目的名称作为字符串以及它的2个子项目的名称?

delphi vcl listviewitem

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