Tag: delphi

找出哪个进程注册了全局热键? (Windows API)

据我所知,Windows不提供API函数来告诉哪个应用程序注册了一个全局热键(通过RegisterHotkey)。 我只能发现,如果RegisterHotkey返回false,而没有“拥有”热键,则注册一个热键。 在没有直接的API的情况下,会不会有一个迂回的方式? Windows维护与每个注册热键相关的句柄 – 有点让人发疯,因为应该没有办法获取这些信息。 可能不起作用的示例:发送(模拟)一个已注册的热键,然后截获Windows将发送到注册它的进程的热键消息。 首先,我不认为拦截消息会显示目标窗口句柄。 其次,即使有可能,这也是一件坏事,因为发送热键会触发各种程序的各种可能有害的活动。 这并不重要,但是我经常看到这样的function需求,而且我自己也是注册热键的应用程序的牺牲品,甚至没有在UI或文档中的任何地方透露它。 (在delphi工作,只不过是在WinAPI的学徒,请善待。)

有没有办法通过编程来判断FastMM是否没有释放特定的内存块?

我试图检测一个内存块是否没有被释放。 当然,经理告诉我,通过对话框或日志文件,但是如果我想将结果存储在数据库中呢? 例如,我想在数据库表中有分配给定块的例程名称。 在阅读FastMM的文档之后,我知道从4.98版本开始,我们就有可能通过pipe理员通知内存分配,释放和重新分配。 例如OnDebugFreeMemFinish事件传递给我们一个PFullDebugBlockHeader ,其中包含有用的信息。 有一件事PFullDebugBlockHeader丢失 – 如果给定的块被应用程序释放的信息。 除非OnDebugFreeMemFinish仅被称为未被释放的块? 这是我不知道,并希望找出。 问题是,即使挂钩到OnDebugFreeMemFinish事件,我无法确定该块是否被释放。 这里是一个例子: program MemLeakTest; {$APPTYPE CONSOLE} uses FastMM4, ExceptionLog, SysUtils; procedure MemFreeEvent(APHeaderFreedBlock: PFullDebugBlockHeader; AResult: Integer); begin //This is executed at the end, but how should I know that this block should be freed //by application? Unless this is executed ONLY for not freed blocks. […]

如何从Delphi程序或编译器生成的debugging信息中提取本地variables信息(地址和types)?

我的目标是: 给定一个Delphi编译的32位或64位Windows程序中挂起的线程,走栈(可行) 给定堆栈条目,枚举每个方法中的局部variables及其值。 也就是说,至less可以find他们的地址和types(整数32/64 /有符号/无符号,string,浮点,logging,类…)的组合可以用来find它们的值。 第一个很好,这是第二个问题。 在很高的层次上, 如何在Delphi中给出一个堆栈条目来枚举局部variables? 在低层次,这是我一直在调查: RTTI:不列出这种方法的信息。 这不是我曾经认为是一个现实的select,但无论如何这里列出。 debugging信息:加载为debugging版本生成的debugging信息。 地图文件:即使是一个详细的地图文件(一个文本格式的文件!打开一个,看看)不包含本地variables信息。 这基本上是地址和源文件行号的列表。 非常适合地址到文件和行相关,例如排水沟中的蓝点; 不是很好的更详细的信息 远程debugging信息(RSM文件) – 没有关于其内容或格式的已知信息 。 TD32 / TDS文件:我目前的研究。 它们包含许多其他信息中的全球和地方符号。 我遇到的问题是: 没有关于TD32文件格式的文档(我可以find)。 我对他们的大部分知识来自使用它们的Jedi JCL代码(JclTD32.pas),我不知道如何使用该代码,或者结构是否足够显示本地variables。 我很确定它会处理全球符号,但我对本地的情况很不确定。 有很多定义的常量,没有格式的文档,阅读它们的意思,我只是猜测。 然而,这些常数和他们的名字必须来自某个地方。 我可以find使用TDS信息源不加载或处理本地符号。 如果这是正确的方法,那么这个问题就变成了:“TDS / TD32文件格式是否有文档,有没有加载局部variables的代码示例? 代码示例不是必需的,但可能非常有用,即使它非常小。

Visual Studio中的缩进快捷方式

我是新来的Visual Studio 2010和C#。 如何使用快捷方式将选定的文本缩进左/右? 在Delphi IDE中,相当于Ctrl + Shift + I和Ctrl + Shift + U

SOAP服务器和客户端应用程序VCL + indy demo for Delphi XE?

Delphi曾经为Web服务包含一个demos文件夹,但似乎不再包含这个。 我只是尝试了Delphi 7演示项目( SOAPDMServerWAD ,几乎完全没有UI的服务器和SOAPDMClient ),并且无法让它们运行,即使在Delphi 7中也是如此。 如果有人曾经在Delphi XE或Delphi 2010中做过类似于旧版本的SOAPDMServerWAD+SoapDMClient演示的工作,在Delphi XE中工作,并且至less有来自Delphi SOAP Server应用程序向导的最小UI,完美。 更新:演示出现在Delphi 2010中,但使用了现在已经过时的WAD(networking应用debugging器),我尝试将它移植到新的Indy runtime/web-app-development-harnessing-code ,但是我似乎无法得到它的工作。 演示运行,但服务器没有用户界面,似乎并没有运行任何HTTP服务器(使用普通的Web浏览器,通过http://localhost:port/ urls进行testing。顺便说一句,尝试谷歌search演示,这个url出现了,我不到一个小时前问,这太可怕了,谷歌。 Update2请参阅下面我自己的答案,一个链接即将推出的工作代码。

如何在Firemonkey中创build“不激活”窗体

在XCode中,通过将这些方法添加到NSView子类中,可以防止在单击该窗口时该窗口变为活动状态: – (BOOL)shouldDelayWindowOrderingForEvent:(NSEvent )theEvent { return YES; } – (BOOL)acceptsFirstMouse:(NSEvent )theEvent { return YES; } – (void)mouseDown:(NSEvent )theEvent { [[[NSApp]] preventWindowOrdering]; } 在Windows平台上它是由这个简单的代码完成的: HWND hWnd = FindWindowW((String("FM") + fmxForm->ClassName()).c_str(), fmxForm->Caption.c_str()); SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_NOACTIVATE); 我怎么能子类NSView,以防止我点击它时,我的FMX TForm变得活跃? 如何在firemonkey中创build“ 不激活 ”窗体?

Delphi XE自定义构build目标始终处于禁用状态

我已经创build了一个自定义的MSBuild .targets文件,通过IDE将其包含在Delphi XE项目中,并从项目pipe理器的上下文菜单启用它。 虽然文件validation,但是我重新保存项目文件后,它总是被禁用。 这里有一个名为Custom.targets的目标文件的简化版本。 <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Target Name="Hello"> <Message Text="Hello from custom target"/> </Target> </Project> 作为一个独立的文件,按预期工作:键入… MSBuild Custom.target /t:Hello …在命令行给出预期的消息。 通过IDE将Custom.targets添加到Delphi项目中,按预期在项目pipe理器中显示文件,现在.dproj文件包含行… <TargetsFile Include="Custom.targets"/> 我在IDE的项目pipe理器中右键单击该文件并selectEnable 。 但是当项目build立时, Build消息窗口显示: [MSBuild警告] Custom.targets(1):忽略禁用导入: PathToProjectSource\\Custom.targets 在项目pipe理器中再次右键单击仍显示Enable选项而不是预期的Disable 。 在命令行MSBuild ProjectName.dproj /t:Hello也失败。 我已经尝试黑客.dproj文件添加行… <Import Project="Custom.targets"/> 键入MSBuild ProjectName.dproj /t:Hello现在MSBuild ProjectName.dproj /t:Hello 。 但是下一次我从IDE中保存项目文件时, <Import>语句被删除。 任何人有什么想法是什么问题?

如何影响delphiXEx代码生成的Android / ARM目标?

更新2017-05-17。 我不再为发生此问题的公司工作,也无法访问Delphi XEx。 当我在那里的时候,问题通过迁移到混合FPC + GCC(Pascal + C)来解决,NEON内在函数对于一些例程有所不同。 (强烈build议使用FPC + GCC,因为它可以使用标准工具,尤其是Valgrind。)如果有人能够用可靠的例子演示如何实际上能够从Delphi XEx生成优化的ARM代码,我很乐意接受答案。 Embarcadero的Delphi编译器使用LLVM后端为Android设备生成原生ARM代码。 我有大量的Pascal代码,我需要编译到Android应用程序,我想知道如何使delphi生成更有效的代码。 现在,我甚至没有谈到像自动SIMD优化这样的高级function,而是谈论生成合理的代码。 当然,必须有办法将parameter passing给LLVM端,或者以某种方式影响结果? 通常情况下,任何编译器都会有很多选项来影响代码的编译和优化,但是Delphi的ARM目标似乎只是“优化开/关”,就是这样。 LLVM应该能够产生相当严密和合理的代码,但是似乎Delphi正在以一种奇怪的方式使用它的设施。 Delphi希望非常重要地使用堆栈,并且通常只使用处理器的寄存器r0-r3作为临时variables。 也许最疯狂的是,它似乎是加载正常的32位整数作为四个1字节的加载操作。 如何使delphi产生更好的ARM代码,并没有逐字节的麻烦,它为Android? 起初我以为逐字节加载是为了交换大字节的字节顺序,但事实并非如此,它实际上只是加载了一个32位的数字,有4个单字节的加载。*可能是加载完整的32位没有做一个不alignment的字大小的内存负载。 (是否应该避免这是另一回事,这将暗示整个事情是一个编译器错误)* 让我们看看这个简单的function: function ReadInteger(APInteger : PInteger) : Integer; begin Result := APInteger^; end; 即使启用了优化,带有更新包1的Delphi XE7以及XE6也会为该函数生成以下ARM汇编代码: Disassembly of section .text._ZN16Uarmcodetestform11ReadIntegerEPi: 00000000 <_ZN16Uarmcodetestform11ReadIntegerEPi>: 0: b580 push {r7, lr} 2: 466f mov r7, sp 4: […]

在Delphi 2009中将TMemoryStream转换为“String”

在Delphi 2009之前我们有以下代码: <span style="font: 10pt Courier New;"><span class="pas1-reservedword">function</span><span class="pas1-space"> </span><span class="pas1-identifier">MemoryStreamToString(M:</span><span class="pas1-space"> </span><span class="pas1-identifier">TMemoryStream):</span><span class="pas1-space"> </span><span class="pas1-reservedword">String</span><span class="pas1-symbol">; </span><span class="pas1-reservedword">var </span><span class="pas1-space"> </span><span class="pas1-identifier">NewCapacity:</span><span class="pas1-space"> </span><span class="pas1-identifier">Longint; </span><span class="pas1-reservedword">begin </span><span class="pas1-space"> </span><span class="pas1-reservedword">if</span><span class="pas1-space"> </span><span class="pas1-symbol">(M.Size</span><span class="pas1-space"> </span><span class="pas1-symbol">=</span><span class="pas1-space"> </span><span class="pas1-number">0)</span><span class="pas1-space"> </span><span class="pas1-reservedword">or</span><span class="pas1-space"> </span><span class="pas1-symbol">(M.Memory</span><span class="pas1-space"> </span><span class="pas1-symbol">=</span><span class="pas1-space"> </span><span class="pas1-reservedword">nil</span><span class="pas1-symbol">)</span><span […]

如何使用24位位图的ScanLine属性?

如何使用ScanLine属性进行24位位图像素操作? 为什么我更喜欢使用它而不是经常使用Pixels属性?