Delphi XE VCL是否支持确保只运行单个应用程序实例?
在过去,我使用库代码来控制一直看起来很复杂的Mutex.当我在Delphi XE中开始一个新项目时,我想知道是否需要挖掘旧代码,或者是否已经在XE中内置了支持?或者是否有另一个易于应用的代码,既漂亮又现代?
我们有一个简单的问题,但原因很复杂.我们是经验丰富的开发人员,并且已经对可能导致它的原因进行了大量研究.我们希望MonoTouch开发人员能够与我们合作,以确定人们所面临的常见问题,而且目前还没有解决方案.我们已经为此工作了两个多星期,但未能解决它.
问题是:为什么我们的MonoTouch应用程序在垃圾收集器中崩溃?它并没有内存不足.
情况是我们有一个应用程序定期检查Web服务(可能每5秒).经过一段时间后,内存管理中止失败.这通常在大约一个半小时后发生,但可以是十分钟到一夜之间的任何地方.这种情况发生在我们所有的测试设备上(我们总共有7个测试设备,包括iOS3和iOS4,iPod Touch,iPhone和iPad(1和2).在查看StackOverflow之后,我们在计时器中添加了一个System.Gc.Collect.这改善了一些事情(失败需要更长的时间),但它并没有消失.还有一点值得补充的是,来自iPad的内存日志显示有777个免费模块,我们的应用程序使用了2041个,共有26488个有线页面.由于我们收集了垃圾,并且没有做出与我们之前5秒做的不同的事情,因此内存耗尽似乎很奇怪.
我们升级到MonoTouch 4.0.1,但还没有修复它.
计算器上可能出现的同一个问题的问题,但没有回答它:五六六六九〇五 /四五四五三八三/五四九二四六九/5426733
iPad2上发生故障的堆栈如下.失败可能发生在主线程或http线程中,但始终在此GC_序列中.我已经在下面列出了内存管理器GC_remap的代码,并进行了讨论.
Thread 10 Crashed: 0 libsystem_kernel.dylib 0x34b4da1c __pthread_kill + 8 1 libsystem_c.dylib 0x3646a3b4 pthread_kill + 52 2 libsystem_c.dylib 0x36462bf8 abort + 72 3 MyApp 0x004ca92c mono_handle_native_sigsegv (mini-exceptions.c:2249) 4 MyApp 0x004f2208 sigabrt_signal_handler (mini-posix.c:195) 5 libsystem_c.dylib 0x36475728 _sigtramp + 36 6 libsystem_c.dylib 0x3646a3b4 pthread_kill + 52 7 libsystem_c.dylib 0x36462bf8 abort + 72 8 MyApp 0x0061dc94 GC_remap (os_dep.c:2092) 9 MyApp 0x00611678 GC_allochblk_nth (allchblk.c:730) 10 MyApp 0x00611028 GC_allochblk (allchblk.c:561) 11 …
我有一个应用程序,它使用库中的键盘钩子程序.一条消息的钩子中的wParam是255,我们认为是"(reserved/OEMClear)".我想弄清楚这条消息的来源,因为它会导致我的应用程序在库中崩溃,并且鉴于它不应该发生,识别它会很好.该消息仅在我们拥有的一台PC上反复出现 - 其他计算机根本看不到该消息.
那么,有没有办法跟踪发送到窗口的消息的来源,或者系统上的所有人?
我可以在不更改值的情况下更改TDictionary中的键吗?
为了解释,我使用的是TObjectDictionary,它源自Delphi XE Generics.Collections单元中的TDictionary.这一切都很好,除了我还需要能够更改存储的对象的键值.
我的第一次尝试如下:
MyObject := MyDictionary.Items[OldKeyValue];
MyDictionary.Remove(OldKeyValue);
MyDictionary.Add(NewKeyValue, MyObject);
Run Code Online (Sandbox Code Playgroud)
这个问题是Remove()导致对象被释放.我尝试使用AddOrSetValue将值更改为nil,但这也是Free的对象.既然我已经告诉它拥有它们的字典,这是公平的.虽然TObjectDictonary中没有额外的功能可以在没有Free的情况下删除,所以我因此尝试在不改变值的情况下更改字典中的Key.但是我无法在Delphi XE帮助中看到任何看起来会这样做的内容.这有可能吗?如果没有,我会回到使用字典并自己释放它.
采用标准的Windows应用程序.它使用LoadLibrary加载DLL来调用其中的函数(我们称之为DLL_A).该函数加载另一个DLL(我们称之为DLL_B).应用程序现在使用FreeLibrary卸载DLL_A DLL,因为它不再需要它.
问题是: DLL_B是否仍在内存中并加载?
这是我可以依赖的东西,还是没有文件记录?
我想要了解Mac版Office 2011的API和附加功能.我在MSDN上找不到任何文档 - 它必须被隐藏得很好.有人能指点我吗?谢谢.
我需要知道我的应用程序是否被最流行的防病毒软件包标记为病毒(不是最好的,但最大的是用户群).因此,我想知道其他人如何解决这个问题.一些背景:
我有一个用Delphi编写的应用程序.自从发现Delphi病毒以来,我的应用程序出现了误报问题,特别是我的演示版由于某种原因(它们都共享相同的代码).AVG一直很好,我现在可以轻松地将我的文件列入白名单,但后来我得到了最新的DevExpress安装程序,它也是假的.鉴于这种情况越来越普遍,让我感到震惊的是,我需要了解我的应用程序是否被最受欢迎的反病毒软件包标记.因此,我想知道其他人如何解决这个问题.我不希望人们下载我们的演示版本,获得AV警告,并决定不尝试它.
到目前为止,我唯一的选择是购买大量AV包并将它们放入VM,或者使用像VirusTotal这样的服务.后者似乎是一个理想的选择,但事实上,他们将测试限制在20Mb以下的文件,我的文件比这大.没有付费选项来扩展功能.(我认为这是一个奇怪的限制,但Kaperskis免费检查仅限于1Mb!)
你如何检查你的申请?
我和朋友正在开发一个使用SQL Server的新项目.在我之前完成项目的SQL中,我总是将索引放在JOIN或WHERE中使用的任何字段上.
我的朋友只有在他们有性能需求时才添加它们.这个想法是维护索引需要付出代价,并且您希望确保支付这笔费用.可以公平地说,有些查询不会经常使用,而且有些表会比其他表更加积极地添加.
因此,我正在寻找有关数据库索引的"最佳实践"的建议.什么对你有用?
我正在使用Delphi XE,并编写一个使用RemObjects SDK进行通信的应用程序(如果可能相关).我有FastMM调试,有时(并不总是)当我关闭它时会发出关于单个"意外内存泄漏"的警告."发生意外的内存泄漏.意外的小块泄漏是:117-124字节:UnicodeString x 1".很偶然,我得到x2报道.
现在,我的理解是字符串是引用计数,并且由于没有其他对象导致泄漏,可能导致这种情况发生的情况是什么?在这个StackOverflow问题中,人们无法找到泄漏的方法.
如果没有明显的方法,那么我将下载最新的FastMM源(它似乎不包含在XE源中).
[编辑一旦解决]找到这个的解决方案是安装FastMM源,并启用FullDebugMode来获取堆栈跟踪.
在这里的问题中,示出了用于创建与SetValue一起使用的兼容TValue的方法.我正在尝试制作一个通用版本,使用RTTI将类存储到INI文件中.这是我的减少代码:
procedure TMyClass.LoadRTTI(xObject: TObject);
var
LContext: TRttiContext;
LClass: TRttiInstanceType;
xField : TRttiField;
szNewValue : String;
xValue : TValue;
begin
LContext := TRttiContext.Create;
LClass := LContext.GetType(xObject.ClassType) as TRttiInstanceType;
for xField in LClass.GetDeclaredFields do
begin
szNewValue := IniFile.ReadString(szSection, xField.Name, '');
if szNewValue <> '' then // emumerated will be '0' (zero) as that is what GetValue.AsString returns
begin
case xField.FieldType.TypeKind of
tkEnumeration: xValue := StrToIntDef(szNewValue, xField.GetValue(xObject).AsOrdinal);
end;
xField.SetValue(xObject, xValue); // FAILS HERE with 'Invalid calss typecast
end;
end;
end;
Run Code Online (Sandbox Code Playgroud)
在引用的答案中,解决方案是使用TValue.From()方法获取值,但这似乎需要适当类型的变量.我没有这样的类型,因为我的代码不知道它是什么. …