我经常看到它发生:我在Delphi中编写应用程序,当我编译它时,病毒扫描程序告诉我,我已经创建了病毒,然后立即再次删除可执行文件.通过执行完全重建,首先删除*.dcu文件,有时只是等待,这很烦人但很容易修复.
据我所知,它发生在德尔福6,7,2005和2007年.赛门铁克,卡巴斯基,迈克菲和NOD32都对报告这些误报感到内疚.我知道这是因为Delphi为其DCU文件添加了时间戳,这些时间戳最终在最终的可执行文件中,显然似乎是一些随机病毒签名的一部分.
我不想禁用病毒扫描程序,即使对于单个文件夹或文件也是如此.我并不是真的想要解决方案,但我想知道以下内容:
我最近从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那么好.
对我来说,差异似乎是:
ProDelphi会更改您的代码.AQTime没有.如果出现问题,更改代码可能会损坏您的数据,但我对GpProfile的体验是它从未发生在我身上.加一个AQTime.
ProDelphi要求您关闭优化.但是你想要描述的是你的程序,它的优化程度,运行方式.加一个AQTime.
ProDelphi只能剖析功能或程序.AQTime可以归结为单独的线路.AQTime加2.
ProDelphi有一个免费版本,可以分析20个例程,其专业版本的成本不到100美元.AQTime是600美元.ProDelphi加4.
目前比分是4-4.你怎么看?
Addenum 3:Primoz Gabrijelcic计划让GpProfile再次运作.请参阅他对以下一些回复的评论.他在StackOverflow上饰演Gabr.
Addenum 4:看起来似乎可能有一个分析器解决方案.参见Andre的开源asmprofiler,如下所述.
我在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' '
有任何想法吗?
我来自使用MSC*MidiSequencer进行Delphi XE2项目的背景,并且本周末一直在玩DelphiASIOVST,因为MIDI可能足够稳定,可以用作我的核心MIDI引擎,同时也允许我支持VST插件插件.我将D16主干从SVN上拉下来,经过一些路径调整后毫不费力地编译.
我理解了很多我所看到的内容,但我想知道其他人是否在MiniHost示例应用程序中遇到MIDI文件播放问题.特别是在一个音轨旋律演奏的情况下,听起来音符会被跳过和/或稍后播放其他正在播放的音符.基本上,如果甚至根本没有播放音符,它就会被击中或错过.
我的机器上有很多专业音序器,MIDI文件很好.他们也支持VST几乎没有问题.我也知道MIDI最低级别的文件格式,并且知道文件结构是合理的.
TMidiFile可以直接播放到计算机中的标准MIDI合成器吗?我试图通过获得内置合成器的直接管道来排除VST问题.除此之外,任何人都可以使用组件集看到这些问题或者知道更多/更好的MIDI文件示例到VST?
我在安装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 尝试了以下解决方案,但仍然遇到相同的文件锁定问题:
我将尝试从头开始重新安装Windows并在Windows更新之前安装Delphi,以查看更新是否真的是原因.我现在的解决方法是在启动Delphi之前重命名EditorLineEnds.ttr.
更新: 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) 借助于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 …
我已经为这个问题开始了赏金
...因为我真的想要社区的意见.我可以(并且已经)查看了几种语言/框架,并且"好吧,这可能会正常工作" - 但我真的很感谢那些专门针对我面临的问题的建议,尤其是那些有经验整合/使用什么的人你推荐.
我从事科学分析软件的研究.它为数据的数学转换提供了许多工具.一个工具允许用户输入他们自己的等式,该等式在数据集(大的2D或3D矩阵值)上运行并进行评估.
这个工具有一个图形方程编辑器,它在内部构建一个面向对象的表达式树,每个操作都有一个不同的对象(例如,会有一个Logarithm类的实例,它是树中用于添加计算对数的节点一个值的基础;它有两个孩子作为其输入.)部分截图:

您可以在左侧看到它正在构建的树,以及右侧菜单中的许多(五十个)潜在操作中的一些.
这有一些缺点:
对于我们的用户希望能够使用它的那种东西,它更简单,但不再是更简洁.如果我现在写它我会做得完全不同 - 这是我的机会:)
我想为用户提供更强大的功能,让他们编写代码 - 脚本或编译 - 可以执行更高级的操作. 我正在寻求对这应该使用的技术或采取最佳方法的建议.
这问题的其余部分很长 - 我很抱歉.我试图详细描述这个问题.在此先感谢您阅读:)
我们的数学运算在大型矩阵上.在上面的等式中,V1表示输入(可能是许多之一)并且是2D或3D,并且每个维度可以是大的:大约数千或数十万.(我们很少同时计算所有这些,只是片段/片段.但如果答案涉及需要编组数据的内容,请注意这个问题的大小和速度.)
我们提供的操作允许您编写,比如说,2 x V将每个元素乘以V2.结果是另一个相同大小的矩阵.换句话说,一个脚本或编程语言,其中包括标准的数学元是不够的:我们需要的是能够控制哪些元可用,或如何得到实施.
这些操作可能很复杂:输入可以像数字(2,5.3,pi)一样简单,也可以像1,2或3维矩阵一样复杂,其中包含数字,布尔或复数(配对值)数据.我目前的想法是一种强大的语言,我们可以将数据类型公开为类,并可以实现标准运算符.一个简单的评估者是不够的.
我们的受众主要是研究科学家,他们不习惯编码,或者可能习惯于像Matlab或R这样的语言.
我们使用Embarcadero C++ Builder 2010进行开发,使用少量Delphi.这可能会限制我们可以使用的东西 - 仅仅因为某些东西的C++,并不意味着如果它只是针对VC++或GCC进行编码就会起作用.它还必须适合与商业软件一起使用.
我们的软件目前有一个COM接口,部分应用程序可以自动化,我们的应用程序是进程外的COM服务器.我们可以将COM接口添加到某些内部对象,或者如果需要,可以专门为此创建第二个COM框架.
包括这个在内的"工具"正在迁移到多线程框架.最终解决方案需要能够在任何线程中执行,并且可以在多个线程中同时执行多个实例.这可能会影响托管语言运行时 - 例如,Python 2.x具有全局锁定.
使用图书馆附带的语言进行数学或科学使用会很棒.
向后兼容旧表达式工具并不重要.这是版本2:干净的石板!
我真的想知道用TOpenDialog选择目录的各种方法,无论是下载新组件还是使用Delphi提供的内容,但最好使用Delphi提供的内容.
在此之前,我一直在使用SelectDirectory命令,但我认为我的程序用户查找指定目录会很困难.
我认为SelectDirectory是"弱"的,因为在搜索你想要的目录时它可能是一个很长的过程.比如说,您想要导航到Application Data目录.在那里航行需要多长时间或多长时间?最后,用户甚至可能无法访问他们想要的目录.
我需要这样的东西,用户可以将目录复制并粘贴到顶部的目录地址栏中.

谢谢你的所有答案.
我不止一次建议人们使用类型的返回值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 ×10
delphi-2010 ×2
delphi-xe2 ×2
antivirus ×1
api ×1
c++ ×1
com ×1
delimiter ×1
delphi-2006 ×1
delphi-2007 ×1
delphi-2009 ×1
delphi-7 ×1
fonts ×1
memory-leaks ×1
midi ×1
plugins ×1
profiling ×1
trichedit ×1
tstringlist ×1
virus ×1
vst ×1
windows ×1
wordpad ×1