标签: delphi

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

更新2017-05-17.我不再为出现此问题的公司工作,也无法访问Delphi XEx.当我在那里时,问题通过迁移到混合FPC + GCC(Pascal + C)来解决,NEON内在函数用于某些例程,它们有所不同.(强烈建议使用FPC + GCC,因为它可以使用标准工具,特别是Valgrind.)如果有人能够通过可靠的示例演示他们如何实际能够从Delphi XEx生成优化的ARM代码,我很高兴接受答案.


Embarcadero的Delphi编译器使用LLVM后端为Android设备生成本机ARM代码.我有大量的Pascal代码需要编译到Android应用程序中,我想知道如何使Delphi生成更高效的代码.现在,我甚至都没有谈论自动SIMD优化等高级功能,只是关于生成合理的代码.当然必须有一种方法将参数传递给LLVM端,或以某种方式影响结果?通常,任何编译器都会有很多选项来影响代码编译和优化,但是Delphi的ARM目标似乎只是"优化开/关"就是这样.

LLVM应该能够产生合理紧密且合理的代码,但似乎Delphi以一种奇怪的方式使用它的设施.Delphi希望非常频繁地使用堆栈,它通常只利用处理器的寄存器r0-r3作为临时变量.也许是最疯狂的,似乎是将正常的32位整数加载为四个1字节的加载操作.如何让Delphi产生更好的ARM代码,而且没有逐字节麻烦的Android?

起初我认为逐字节加载是用于从big-endian交换字节顺序,但事实并非如此,它实际上只是加载一个带有4个单字节加载的32位数字.*可能是加载完整的32位而不进行未对齐的字大小的内存加载.(是否应该避免这是另一回事,这将暗示整个事情是编译器错误)*

让我们来看看这个简单的函数:

function ReadInteger(APInteger : PInteger) : Integer;
begin
  Result := APInteger^;
end;
Run Code Online (Sandbox Code Playgroud)

即使启用了优化,带有更新包1的Delphi XE7以及XE6也会为该功能生成以下ARM汇编代码:

Disassembly of section .text._ZN16Uarmcodetestform11ReadIntegerEPi:

00000000 <_ZN16Uarmcodetestform11ReadIntegerEPi>:
   0:   b580        push    {r7, lr}
   2:   466f        mov r7, sp
   4:   b083        sub sp, #12
   6:   9002        str r0, [sp, #8]
   8:   78c1        ldrb    r1, [r0, #3]
   a:   7882        ldrb    r2, [r0, #2]
   c:   ea42 2101   orr.w   r1, r2, r1, lsl #8
  10:   7842        ldrb    r2, [r0, #1] …
Run Code Online (Sandbox Code Playgroud)

delphi android arm llvm android-ndk

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

始终禁用Delphi XE自定义生成目标

我已经创建了一个自定义的MSBuild .targets文件,我通过IDE将其包含在Delphi XE项目中,并从项目管理器的上下文菜单中启用它.虽然文件验证,但在重新保存项目文件后它总是被禁用.

这是目标文件的简化版本,名为Custom.targets.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="Hello">
    <Message Text="Hello from custom target"/>
  </Target>
</Project>
Run Code Online (Sandbox Code Playgroud)

作为一个独立的文件,这按预期工作:输入...

MSBuild Custom.target /t:Hello
Run Code Online (Sandbox Code Playgroud)

...在命令行中给出了预期的消息.

Custom.targets通过IDE 添加到Delphi项目会按预期在项目管理器中显示该文件,该.dproj文件现在包含该行...

<TargetsFile Include="Custom.targets"/>
Run Code Online (Sandbox Code Playgroud)

我在IDE的项目管理器中右键单击该文件并进行选择Enable.但是在构建项目时,Build消息窗口显示:

[MSBuild警告] Custom.targets(1):忽略禁用导入: PathToProjectSource\\Custom.targets

在项目管理器中再次右键单击仍显示该Enable选项而不是预期Disable.

在命令行MSBuild ProjectName.dproj /t:Hello也失败了.

我试过黑客攻击.dproj文件添加行...

<Import Project="Custom.targets"/>
Run Code Online (Sandbox Code Playgroud)

打字MSBuild ProjectName.dproj /t:Hello现在有效.但是下次我从IDE保存项目文件时,<Import>语句将被删除.

有人知道出了什么问题吗?

delphi msbuild delphi-xe

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

应用程序无法正确启动(0xc000007b)

我有一个客户端/服务器应用程序,我一直在一台PC上开发.现在它需要两个串口,所以我从朋友那里借了一台电脑.

当我构建我的应用程序并尝试运行或调试它时(无论是在Delphi IDE中还是从Windows文件管理器中),它出现错误"应用程序无法正确启动(0xc000007b)".

谷歌搜索没有带来多少,但似乎表明这不是特定于Delphi的其他应用程序.它似乎是由64位应用程序调用32位DLL引起的,反之亦然.

  • 两台PC都是Windows 7,64位
  • 两者都有Delphi Xe2入门版,只能处理32位
  • 该应用程序在我的电脑上正常运行,但不在我朋友的电脑上运行
  • 其他Delphi应用程序在两台PC上运行良好

任何人都可以给我一个提示,如何跟踪这个?

windows delphi 64-bit

153
推荐指数
7
解决办法
37万
查看次数

用于Delphi XE的SOAP服务器和客户端应用程序VCL + indy演示?

Delphi过去常常包含一个用于Web服务的demos文件夹,但似乎不再包含这个.

我刚刚尝试了Delphi 7演示项目(SOAPDMServerWAD一个几乎没有UI的服务器,并且SOAPDMClient)并且无法让它们运行,即使在Delphi 7中也是如此.

如果有人在Delphi XE或Delphi 2010中做过类似的演示工作,与旧版SOAPDMServerWAD+SoapDMClient演示相同,在Delphi XE中工作,并且至少具有来自Delphi SOAP Server应用程序向导的最小UI,那将是完美的.

更新:该演示一直出现在Delphi 2010上,但使用现已废弃的WAD(web-app-debugger),我试图将它移植到新的Indy runtime/web-app-development-harnessing-code,但我似乎无法让它工作.演示运行,但服务器没有用户界面,并且似乎没有运行任何HTTP服务器(使用常规Web浏览器,通过http://localhost:port/网址测试.顺便说一下,尝试使用Google搜索演示,此网址出现,并且我问不到一个小时前.那可怕,谷歌.

Update2请参阅下面的我自己的答案,工作代码即将推出一个链接.

delphi soap web-services delphi-xe delphi-xe2

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

Visual Studio中的缩进快捷方式

我是Visual Studio 2010和C#的新手.如何使用快捷方式将所选文本向左/向右缩进?

在此输入图像描述

在Delphi IDE中,等价物是Ctrl+ Shift+ ICtrl+ Shift+U

c# delphi indentation visual-studio-2010

150
推荐指数
7
解决办法
25万
查看次数

如何在Firemonkey中创建"No Activate"表单

在XCode中,通过将这些方法添加到NSView子类可以防止窗口在单击时变为活动状态:

- (BOOL)shouldDelayWindowOrderingForEvent:(NSEvent )theEvent {
    return YES;
}
- (BOOL)acceptsFirstMouse:(NSEvent )theEvent {
    return YES; 
}
- (void)mouseDown:(NSEvent )theEvent {
    [[[NSApp]] preventWindowOrdering]; 
}
Run Code Online (Sandbox Code Playgroud)

在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);
Run Code Online (Sandbox Code Playgroud)

我怎样才能将NSView子类化以防止我的FMX TForm在点击时变为活动状态?

如何在firemonkey中创建" No Activate "表单?

delphi macos c++builder delphi-xe2 firemonkey

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

Delphi中的EProgrammerNotFound异常?

在Delphi 2009中,SysUtils.pas包含第425行:

EProgrammerNotFound = class(Exception);
Run Code Online (Sandbox Code Playgroud)
  • 这只是一个复活节彩蛋还是严肃的东西?
  • 什么时候应该提出这个例外?
  • 它是否也存在于Delphi Prism和/或Free Pascal中?

问:这个异常类是否仍在Delphi中声明(目前是XE7)?答:是的,甚至有记录!

指示软件故障的非标准方式.

您可以使用EProgrammerNotFound作为替代,以指示在运行时检测到的软件故障.

delphi delphi-2009 delphi-xe7

122
推荐指数
6
解决办法
8221
查看次数

Delphi语言功能列表以及引入/弃用它们的版本

在开始之前,我想指出的是,我已经通过谷歌进行了这样的事情,并且无法找到一个,我已经诚实而真实地搜索过.

我要求(对于我正在开发的项目)列出所有Delphi(2007年到最新发布的版本,我不再支持2007年以前的任何版本)"语言功能",以及它们被引入的版本和(在适用的情况下)弃用,改进或删除.

我之前已经在Stack Overflow上注意到类似的问题,尽管其中大部分是以"哪个特征最好"的形式表达的,并且被认为是不合适的.

如果有人知道这样的清单(或有足够的业余时间来编制一个清单),我将非常感激.

接受的答案将包含指向此类列表的链接或列表本身.

delphi delphi-2007

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

找出注册全球热键的流程?(Windows API)

据我所知,Windows没有提供API函数来告诉应用程序注册了一个全局热键(通过RegisterHotkey).我只能发现如果RegisterHotkey返回false,则注册了热键,但不是"拥有"热键的人.

在没有直接API的情况下,是否会有迂回的方式?Windows维护与每个注册热键相关联的句柄 - 这有点令人抓狂,因此无法获取此信息.

可能不起作用的示例:发送(模拟)已注册的热键,然后拦截Windows将发送给注册它的进程的热键消息.首先,我不认为拦截消息会显示目标窗口句柄.其次,即使有可能,这也是一件坏事,因为发送热键会触发各种程序中各种可能不需要的活动.

这并不重要,但我已经看到了对这种功能的频繁请求,并且我自己也是注册热键的应用程序的受害者,甚至没有在UI或文档中的任何地方公开它.

(在Delphi工作,只不过是WinAPI的学徒,请善待.)

delphi api winapi hotkeys registerhotkey

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

当Windows字体缩放大于100%时,如何使我的GUI表现良好

在Windows控制面板中选择大字体大小(如125%或150%)时,每次按像素设置某些内容时,VCL应用程序中都会出现问题.

拿走TStatusBar.Panel.我已经设置了它的宽度,使它只包含一个标签,现在使用大字体标签"溢出".与其他组件相同的问题.

戴尔的一些新笔记本电脑已经默认设置为125%,因此在过去这个问题非常罕见,现在非常重要.

可以做些什么来克服这个问题?

windows delphi windows-7

105
推荐指数
4
解决办法
5万
查看次数