标签: delphi

无意中造成了病毒?

我经常看到它发生:我在Delphi中编写应用程序,当我编译它时,病毒扫描程序告诉我,我已经创建了病毒,然后立即再次删除可执行文件.通过执行完全重建,首先删除*.dcu文件,有时只是等待,这很烦人但很容易修复.

据我所知,它发生在德尔福6,7,2005和2007年.赛门铁克,卡巴斯基,迈克菲和NOD32都对​​报告这些误报感到内疚.我知道这是因为Delphi为其DCU文件添加了时间戳,这些时间戳最终在最终的可执行文件中,显然似乎是一些随机病毒签名的一部分.

我不想禁用病毒扫描程序,即使对于单个文件夹或文件也是如此.我并不是真的想要解决方案,但我想知道以下内容:

  • 其他编译器也会出现这些误报吗?
  • .NET可执行文件是否也会发生这种情况?
  • 其他人是否也注意到与Delphi类似的问题?

delphi antivirus virus false-positive

55
推荐指数
5
解决办法
9986
查看次数

适用于Delphi的Profiler和内存分析工具

我最近从Delphi 4升级到Delphi 2009.使用Delphi 4,我一直使用Primoz Gabrijelcic的GpProfile作为分析器,使用Turbo Power的Memory Sleuth进行内存分析和泄漏调试.两者都适合我.但我现在需要能够与Delphi 2009配合使用的新工具.

对于Delphi的分析/分析工具的领导者显然是AutomatedQA的AQTime.他们最近甚至吞噬了Atanas Soyanov的Memproof,据我所知这是一款出色的免费记忆分析工具,并将其功能融入AQTime.但AQTime对于个人程序员来说非常昂贵.它实际上比升级到Delphi 2009成本更高!

所以我的问题是:是否还有其他较便宜的选项可以在当前版本的Delphi中进行性能分析和内存分析,您对此感到满意并推荐,或者我应该咬紧牙关并为AQTime付出巨额代价?


Addenum:似乎早期的回答者表明已经包含在Delphi中的FastMM管理器非常适合发现内存泄漏.

那么,源代码分析有什么好的选择吗?

我很好奇的是Michael Adolph的ProDelphi,它不到AQTime成本的六分之一.你用它吗?AQTime值六倍的价值吗?


Addenum 2:我下载了AQTime和ProDelphi的试用版.

AQTime起初有点压倒性,有点令人困惑.花了几个小时才找到了解决它所需的一些技巧.

ProDelphi非常像我习惯的GpProfile.但是它的窗户混乱而且令人困惑,而且它不如GpProfile那么好.

对我来说,差异似乎是:

  1. ProDelphi会更改您的代码.AQTime没有.如果出现问题,更改代码可能会损坏您的数据,但我对GpProfile的体验是它从未发生在我身上.加一个AQTime.

  2. ProDelphi要求您关闭优化.但是你想要描述的是你的程序,它的优化程度,运行方式.加一个AQTime.

  3. ProDelphi只能剖析功能或程序.AQTime可以归结为单独的线路.AQTime加2.

  4. ProDelphi有一个免费版本,可以分析20个例程,其专业版本的成本不到100美元.AQTime是600美元.ProDelphi加4.

目前比分是4-4.你怎么看?


Addenum 3:Primoz Gabrijelcic计划让GpProfile再次运作.请参阅他对以下一些回复的评论.他在StackOverflow上饰演Gabr.


Addenum 4:看起来似乎可能有一个分析器解决方案.参见Andre的开源asmprofiler,如下所述.

delphi profiling memory-leaks

54
推荐指数
4
解决办法
3万
查看次数

Delphi:StringList Delimiter始终是空格字符,即使设置了Delimiter也是如此

我在TStringList类中使用分隔符时遇到问题.看一看:

var
  s: string;
  sl: TStringList;

begin
  sl := TStringList.Create;
  s := 'Users^foo bar^bar foo^foobar^barfoo';
  sl.Delimiter := '^';
  sl.DelimitedText := s;
  ShowMessage(sl[1]);
end;
Run Code Online (Sandbox Code Playgroud)

sl[1] 应该回来 'foo bar'

sl[1] 回来了 'foo'

看来分隔符现在是'^'AND' '

有任何想法吗?

delphi tstringlist delphi-7 delimiter

54
推荐指数
3
解决办法
7万
查看次数

Delphi ASIO VST和MiniHost的Midi时序问题

我来自使用MSC*MidiSequencer进行Delphi XE2项目的背景,并且本周末一直在玩DelphiASIOVST,因为MIDI可能足够稳定,可以用作我的核心MIDI引擎,同时也允许我支持VST插件插件.我将D16主干从SVN上拉下来,经过一些路径调整后毫不费力地编译.

我理解了很多我所看到的内容,但我想知道其他人是否在MiniHost示例应用程序中遇到MIDI文件播放问题.特别是在一个音轨旋律演奏的情况下,听起来音符会被跳过和/或稍后播放其他正在播放的音符.基本上,如果甚至根本没有播放音符,它就会被击中或错过.

我的机器上有很多专业音序器,MIDI文件很好.他们也支持VST几乎没有问题.我也知道MIDI最低级别的文件格式,并且知道文件结构是合理的.

TMidiFile可以直接播放到计算机中的标准MIDI合成器吗?我试图通过获得内置合成器的直接管道来排除VST问题.除此之外,任何人都可以使用组件集看到这些问题或者知道更多/更好的MIDI文件示例到VST?

delphi midi vst delphi-xe2

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

Delphi 2006-2010错误:"无法创建文件C:\ Users\Admin\AppData\Local\Temp\EditorLineEnds.ttr"

我在安装Delphi 2007后遇到错误(编辑:这个问题发生在2006年到2010年的所有Delphi版本中),我无法弄清楚,以前从未见过.重新启动后,我可以毫无问题地启动程序,但如果我要关闭程序并重新启动它会给我以下错误:

"无法创建文件C:\ Users\Admin\AppData\Local\Temp\EditorLineEnds.ttr".该进程无法访问该文件,因为它正由另一个进程使用."

"System"具有此文件的句柄,除非我重新启动,否则无法清除该句柄.我也可以通过在启动程序之前重命名文件来解决问题.

我试过没有运气重新安装程序.

安装版本:CodeGear™Delphi®2007forWin32®R2版本11.0.2902.10471.操作系统:Windows 7 Pro 64bit

更新08/14 13:35 EDT 尝试了以下解决方案,但仍然遇到相同的文件锁定问题:

  1. 将Temp Directory重命名为我知道具有完全安全权限的目录.启动Delphi时,文件将在此目录中创建,但是EditorLineEnds.ttr仍然会被SYSTEM锁定并阻止我重新启动.
  2. 卸载了以下安全更新KB2982791和KB2976897,但这并没有解决问题.我暂时禁止了Windows更新,并尝试卸载8/13的所有安全补丁.
  3. 完全卸载Delphi并重新安装.重新安装所有内容后仍然会出现问题.

我将尝试从头开始重新安装Windows并在Windows更新之前安装Delphi,以查看更新是否真的是原因.我现在的解决方法是在启动Delphi之前重命名EditorLineEnds.ttr.

delphi delphi-2009 delphi-2007 delphi-2006 delphi-2010

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

是否在XE2中打破了COM,我该如何解决它?

更新: XE2 Update 2修复了下面描述的错误.

下面的程序,从真实程序中减少,在XE2中失败.这是从2010年开始的回归.我没有XE可以测试,但我希望程序在XE上运行正常(感谢Primož确认代码在XE上正常运行).

program COMbug;

{$APPTYPE CONSOLE}

uses
  SysUtils, Variants, Windows, Excel2000;

var
  Excel: TExcelApplication;
  Book: ExcelWorkbook;
  Sheet: ExcelWorksheet;
  UsedRange: ExcelRange;
  Row, Col: Integer;
  v: Variant;

begin
  Excel := TExcelApplication.Create(nil);
  try
    Excel.Visible[LOCALE_USER_DEFAULT] := True;
    Book := Excel.Workbooks.Add(EmptyParam, LOCALE_USER_DEFAULT) as ExcelWorkbook;
    Sheet := Book.Worksheets.Add(EmptyParam, EmptyParam, 1, EmptyParam, LOCALE_USER_DEFAULT) as ExcelWorksheet;

    Sheet.Cells.Item[1,1].Value := 1.0;
    Sheet.Cells.Item[2,2].Value := 1.0;
    UsedRange := Sheet.UsedRange[LOCALE_USER_DEFAULT] as ExcelRange;
    for Row := 1 to UsedRange.Rows.Count do begin
      for Col := 1 to UsedRange.Columns.Count do begin
        v := …
Run Code Online (Sandbox Code Playgroud)

delphi com delphi-xe2

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

如何在更改某些非文本字符的字体时使TRichEdit在Windows 7上的行为类似于写字板?

借助于Sertac Akyuz它,似乎直接原因与charset有关\bullet:在我的本地化Windows中,\bullet输入Alt(0149)总是得到输入\fcharset134,并且尝试通过改变其字体EM_SETCHARFORMAT总是失败(好吧,颜色,大小,样式确实可以改变但不是字体系列名称).

因此,最简单的解决方法是首先重置字符集,然后更改字体.

注意:应该使用RichEdit (版本> = 4.1)!

注意:RichEdit版本可以在MSDN的About Rich Edit Controls,Murray Sargent的MSDN Blog RichEdit版本RichEdit版本更新到7.0中找到.后面的页面提到RichEdit版本高于4.1.作为测试,我将使用Office 2010的RICHED20.DLL与应用程序一起复制到Windows 2000,一切都像一个魅力!

procedure TMainForm.ButtonFontClick(Sender: TObject);
var
  format: TCharFormat2;
begin
  if dlgFontCdxTxt.Execute then
  begin
    FillChar(format, sizeof(format), 0);
    format.cbSize:= Sizeof(format);
    format.dwMask:= CFM_CHARSET;
    format.bCharSet := 1; // or 0;
    redtTextBlock.Perform(EM_SETCHARFORMAT, SCF_SELECTION, Integer(@format));

    FillChar(format, sizeof(format), 0);
    format.cbSize:= Sizeof(format);
    format.dwMask:= CFM_FACE;
    StrPLCopy(format.szFaceName, dlgFontCdxTxt.Font.Name, High(format.szFaceName));
    redtTextBlock.Perform(EM_SETCHARFORMAT, SCF_SELECTION, Integer(@format));
  end;
  redtTextBlock.SetFocus;
end;
Run Code Online (Sandbox Code Playgroud)

==================================================

根据维基百科,WordPad …

windows delphi fonts wordpad trichedit

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

针对高度数学依赖用户编码的脚本或插件语言的建议?

我已经为这个问题开始了赏金

...因为我真的想要社区的意见.我可以(并且已经)查看了几种语言/框架,并且"好吧,这可能会正常工作" - 但我真的很感谢那些专门针对我面临的问题的建议,尤其是那些有经验整合/使用什么的人你推荐.


我从事科学分析软件的研究.它为数据的数学转换提供了许多工具.一个工具允许用户输入他们自己的等式,该等式在数据集(大的2D或3D矩阵值)上运行并进行评估.

这个工具有一个图形方程编辑器,它在内部构建一个面向对象的表达式树,每个操作都有一个不同的对象(例如,会有一个Logarithm类的实例,它是树中用于添加计算对数的节点一个值的基础;它有两个孩子作为其输入.)部分截图:

在此输入图像描述

您可以在左侧看到它正在构建的树,以及右侧菜单中的许多(五十个)潜在操作中的一些.

这有一些缺点:

  • 对于复杂的方程式,图形编辑器变得笨拙
  • 有些操作难以用图形表示,例如创建大型矩阵(例如x n卷积的内核)
  • 它只允许方程式:没有分支或其他逻辑

对于我们的用户希望能够使用它的那种东西,它更简单,但不再是更简洁.如果我现在写它我会做得完全不同 - 这是我的机会:)

我想为用户提供更强大的功能,让他们编写代码 - 脚本或编译 - 可以执行更高级的操作. 我正在寻求对这应该使用的技术或采取最佳方法的建议.

这问题的其余部分很长 - 我很抱歉.我试图详细描述这个问题.在此先感谢您阅读:)

重要限制:

  • 我们的数学运算在大型矩阵上.在上面的等式中,V1表示输入(可能是许多之一)并且是2D或3D,并且每个维度可以是大的:大约数千或数十万.(我们很少同时计算所有这些,只是片段/片段.但如果答案涉及需要编组数据的内容,请注意这个问题的大小和速度.)

  • 我们提供的操作允许您编写,比如说,2 x V将每个元素乘以V2.结果是另一个相同大小的矩阵.换句话说,一个脚本或编程语言,其中包括标准的数学元是不够的:我们需要的是能够控制哪些元可用,或如何得到实施.

    这些操作可能很复杂:输入可以像数字(2,5.3,pi)一样简单,也可以像1,2或3维矩阵一样复杂,其中包含数字,布尔复数(配对值)数据.我目前的想法是一种强大的语言,我们可以将数据类型公开为类,并可以实现标准运算符.一个简单的评估者是不够的.

    • 而不是仅仅编写迭代地在一个或多个输入上评估的操作以提供输出,如当前(可通过表达式评估器轻松实现),我希望用户能够:提供不同大小的输出到输入; 打电话给其他功能; 对于主程序,能够询问用户的代码以评估切片或输出的一部分所需的输入的哪个部分或切片将是有用的.我认为暴露我们课程的某些部分并使用OO语言可能是实现这些要点的最佳方式.
  • 我们的受众主要是研究科学家,他们不习惯编码,或者可能习惯于像Matlab或R这样的语言.

  • 我们使用Embarcadero C++ Builder 2010进行开发,使用少量Delphi.这可能会限制我们可以使用的东西 - 仅仅因为某些东西的C++,并不意味着如果它只是针对VC++或GCC进行编码就会起作用.它还必须适合与商业软件一起使用.

  • 我们的软件目前有一个COM接口,部分应用程序可以自动化,我们的应用程序是进程外的COM服务器.我们可以将COM接口添加到某些内部对象,或者如果需要,可以专门为此创建第二个COM框架.

  • 包括这个在内的"工具"正在迁移到多线程框架.最终解决方案需要能够在任何线程中执行,并且可以在多个线程中同时执行多个实例.这可能会影响托管语言运行时 - 例如,Python 2.x具有全局锁定.

  • 使用图书馆附带的语言进行数学或科学使用会很棒.

  • 向后兼容旧表达式工具并不重要.这是版本2:干净的石板!

目前的想法:

c++ delphi api plugins

48
推荐指数
4
解决办法
3092
查看次数

使用TOpenDialog选择目录

我真的想知道用TOpenDialog选择目录的各种方法,无论是下载新组件还是使用Delphi提供的内容,但最好使用Delphi提供的内容.

在此之前,我一直在使用SelectDirectory命令,但我认为我的程序用户查找指定目录会很困难.

我认为SelectDirectory是"弱"的,因为在搜索你想要的目录时它可能是一个很长的过程.比如说,您想要导航到Application Data目录.在那里航行需要多长时间或多长时间?最后,用户甚至可能无法访问他们想要的目录.

我需要这样的东西,用户可以将目录复制并粘贴到顶部的目录地址栏中.

在此输入图像描述

谢谢你的所有答案.

delphi delphi-2010

48
推荐指数
4
解决办法
8万
查看次数

为什么WideString不能用作互操作的函数返回值?

我不止一次建议人们使用类型的返回值WideString进行互操作.

这个想法是a WideString和a一样BSTR.因为a BSTR是在共享COM堆上分配的,所以在一个模块中分配并在另一个模块中解除分配是没有问题的.这是因为所有各方都同意使用相同的堆,即COM堆.

但是,它似乎WideString不能用作互操作的函数返回值.

考虑以下Delphi DLL.

library WideStringTest;

uses
  ActiveX;

function TestWideString: WideString; stdcall;
begin
  Result := 'TestWideString';
end;

function TestBSTR: TBstr; stdcall;
begin
  Result := SysAllocString('TestBSTR');
end;

procedure TestWideStringOutParam(out str: WideString); stdcall;
begin
  str := 'TestWideStringOutParam';
end;

exports
  TestWideString, TestBSTR, TestWideStringOutParam;

begin
end.
Run Code Online (Sandbox Code Playgroud)

和以下C++代码:

typedef BSTR (__stdcall *Func)();
typedef void (__stdcall *OutParam)(BSTR &pstr);

HMODULE lib = LoadLibrary(DLLNAME);
Func TestWideString = (Func) GetProcAddress(lib, "TestWideString"); …
Run Code Online (Sandbox Code Playgroud)

delphi

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