小编Sco*_*ard的帖子

MakeScreenshot泄漏?

晚上好!

在当前的项目中,我遇到了一个相当令人担忧的内存泄漏,我似乎无法插入.

我让应用程序在标准使用情况下一夜之间运行,当我8小时后醒来时,它耗尽了大约750MB的内存,而它的起始速度却达到了50MB左右.Windows任务管理器不适合检查泄漏,除了允许您首先发现存在泄漏.

我已经清理了一些其他的内存泄漏,主要的一个与Firemonkeys有关TGlowEffect.它没有被检测到,ReportLeaksOnShutdown但是它的内存使用量在动态修改的对象上变得极其过度(例如旋转或缩放变化).

我已经将它跟踪到一个计时器(并且禁用它可以完全阻止泄漏),如果可能的话我需要帮助修复它.

说明:此代码使用Firemonkey MakeScreenshot函数将a的视觉外观保存TPanel (SigPanel)到a TMemoryStream.然后使用标准代码将此流数据上载到远程FTP服务器(见下文).在里面SigPanel,有4个TLabel孩子,1个TRectangle孩子和6个TImage孩子.

注意:CfId是一个全局字符串,它是根据随机extended浮点值生成的,随后浮点值将与格式化的DateTime一起进行哈希处理yyyymmdd_hhnnsszzz.这一代在创建表单时完成,并且一直重复直到它变为有效CfId(即不包含在Windows文件名中使用的非法字符).一旦它获得有效CfId,它就不会再次运行(因为我不再需要生成新的ID).这使我几乎可以完全消除重复的可能性CfId.

计时器中的代码如下;

var
  i : Integer;
  SigStream : TMemoryStream;
begin
  SigStream := TMemoryStream.Create;
  SigPanel.MakeScreenshot.SaveToStream(SigStream);
  SigPanel.MakeScreenshot.Free;
  if VT2SigUp.Connected then
  begin
    VT2SigUp.Put(SigStream,'Sig_'+CfId+'.png',False);
  end else
  begin
    VT2SigUp.Connect;
    VT2SigUp.Put(SigStream,'Sig_'+CfId+'.png',False);
  end;
    SigStream.Free;
end;
Run Code Online (Sandbox Code Playgroud)

与定时器NOT完全运行,则代码功能而不泄漏和ReportMemoryLeaksOnShutdownNOT生成的消息.启用定时器并允许至少"运行"一次,我得到大量泄漏,这会增加计时器运行的次数.报告的泄漏情况如下;

Small Block Leaks

1 - 12 …
Run Code Online (Sandbox Code Playgroud)

delphi memory-leaks delphi-xe2 firemonkey

9
推荐指数
1
解决办法
969
查看次数

将JSON解析为TListBox

晚上好!

我目前正在尝试CloudFlare为桌面组装一个客户端.我已经连接到他们的API并使用POST请求成功检索了JSON结果(结果已输出到a TMemo).我现在想要将这些结果解析为TListBox(例如,参见粗体区域).该项目正在设计中Firemonkey.

这是带有一些示例内容的响应的格式化布局;

{
 - response: {
   |- ips: [
      |- {
         ip: "xxx.xxx.xxx.xxx",
         classification: "threat",
         hits: xx,
         latitude: null,
         longitude: null,
         zone_name: "domain-example1"
         },
       - {
         ip: "yyy.yyy.yyy.yyy",
         classification: "robot",
         hits: yy,
         latitude: null,
         longitude: null,
         zone_name: "domain-example2"
         }
       ]
   }
  result : "success",
  msg: null
}
Run Code Online (Sandbox Code Playgroud)

我尝试了几个不同的组件--SuperObject,PawełGłowacki的JSON Designtime Parser,Tiny-JSON,LKJSON和内置的DBXJSON.但是,我根本没有使用JSON的经验,我似乎无法找到可以从中开始的最基本的示例.他们中的许多人都展示了样本数据,但我尝试的所有数据似乎都没有像我期望的那样工作,很可能是因为我误解了它们.我假设组件有效,所以我需要有关入门的指导.

ips"数组"中有数百个,通常是数千个结果(如果不正确,我会道歉,我认为它被称为数组,但我又是JSON的新手).

我真正需要的是一些非常基本的示例代码,我可以构建它(以及它用于解析等的组件).

例如,如果我想ip从JSON结果中获取每个结果,并将每个结果作为一个单独的项目放入TListBox(使用TListBox.add方法),我将如何实现这一目标?

当我说ip …

delphi json delphi-xe2 cloudflare firemonkey

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

Delphi - DirectX - OSD /屏幕叠加

晚上好,我现在正在使用Delphi 2010中的NVIDIA GPU温度监视器.它还将提供来自WMI的系统信息.

目前,我正在针对不同的情况开发一些不同的OSD(屏幕显示)方法.我已经有两种方法了,但我还需要一种专门用于游戏的方法.

我想要做的是使用Direct2D或Direct3D显示带有一些文本的叠加层或OSD.DLL注入是有风险的,更不用说完美了.你可以想象,我试图将它叠加到游戏中,但将它覆盖在任何地方都同样好.

可以想象,使用Direct2D或Direct3D覆盖它会好得多.挂钩只是一个想法,但同样,这可能会导致我也要求注入代码.

本质上,我想要在屏幕上显示文本的最简单的方法,该方法没有大的性能损失,并且在屏幕刷新时不会闪烁(即渲染新帧).我也希望能够绘制图像(因为我在我的应用程序中包含图形,输出这些将是一个奖励,但输出文本是这里的主要任务).

老实说,如果我需要挂钩和/或注射,我不介意,但我没有这样做的经验,绝对需要很多帮助.做类似于MSI Afterburner或FRAPS的事情就是我所追求的.

我也缺乏DX编程或设计方面的知识,因此需要大量的帮助.我已经完成了大部分设计和工作的应用程序,这是完成这一项大任务,并清理其他较小部分的问题.

有任何想法吗?

编辑:减少段落数量,以便于阅读.减少它可能无法解释这一点.对于看过编辑版本的人,我确实做了大量的研究,但没有得到任何结果.

编辑:没有人得到更多的投入?是否可以使用另一种语言编写的DLL来输出OSD,并简单地将我的参数传递给它?如果是这样,我将如何这样做,是否有任何可用于使用的语言的示例代码?

delphi delphi-2010

7
推荐指数
1
解决办法
1954
查看次数

共享数据系统

晚上好.我正在寻找一种方法来从我的应用程序系统中共享数据,以便其他应用程序可以读取该数据然后随意执行任何操作(例如,将其格式化以用于显示,将其用于日志记录等).数据需要在方法本身中动态更新.

WMI首先浮现在脑海中,但是当你从WMI阅读时,你会遇到应用程序暂停的问题.另外,如果在Delphi中甚至可以实现,我也不知道如何设置我自己的命名空间或类.

使用文件是另一个想法,但这可能会让磁盘变得很重,而且这对于实时数据来说是一种非常糟糕的方法.

使用驱动程序可能是最好的选择,但是根据我的喜好,这对用户端来说有点过于干扰,而且我不知道从哪里开始使用它.

WM_COPYDATA会很棒,但我不确定它是否足够动态,以及它是否会对资源造成沉重负担.

使用TCP/IP将是通过网络的最佳选择,但在没有网络要求的单个系统上运行时显然没什么用处.

正如你所看到的,我正在努力弄清楚要去哪里.我不想进入一种方法只是为了发现它最终不会成功.本质上,类似于服务或后台进程,用于记录数据,然后允许其他应用程序读取该数据.我只是不确定方法.我宁愿不需要提升/ UAC这样做,但如果需要,我会满足于此.

我正在使用Delphi 2010进行此练习.

有任何想法吗?

delphi delphi-2010

5
推荐指数
1
解决办法
495
查看次数

Firemonkey - 消息处理

我目前正在尝试开发一个基于Firemonkey的项目.我正在使用Firemonkey的UI功能,因为该项目由许多较小的应用程序组成,每个应用程序都有一个3D方面.我目前只使用FMX框架开发/部署到Windows,但可能会在以后跨平台.

通过在后台构建VCL Windows应用程序来执行非常具体的操作,然后构建FMX前端,我遇到了大多数问题.但是,这仅适用于您只想执行应用程序以执行其设计的操作,因此可以使用参数执行应用程序.在其中一个应用程序中,我发现需要使用消息(或类似的东西).例如,在我的FMX应用程序中,如果我单击"button1",我希望它向后台VCL应用程序发送消息以执行"action1",而不是使用参数执行它.

一个很好的例子可能是在后台应用程序中使用VCL TMediaPlayer,前端FMX应用程序用于显示信息并提供播放,暂停等控制.这样它基本上就成为具有VCL功能的FMX UI.

到目前为止,我还没有找到任何关于消息的信息(例如在VCL中,用"SendMessage"或"PostMessage"或类似的东西完成)是通过Firemonkey处理的,可以通过本地帮助文件,也可以通过广泛的谷歌搜索.我发现的所有内容都与电子邮件有关(大概是因为我的大多数搜索术语中都有"消息"这个词).

Can anyone point me in the right direction on how messages would be handled with Firemonkey/FMX?

此致,Scott Pritchard

delphi message-queue delphi-xe2 firemonkey

5
推荐指数
1
解决办法
6896
查看次数

执行UPDATE时出错

我在使用节点mysql2模块执行更新查询时遇到了一些麻烦.我正在使用'?'准备查询 占位符然后传递值如此;

socket.on('connection', function(client){
    [...]
    client.on('userjoin', function(username, userid){
        run_db_insert("UPDATE users_table SET clientid = ? WHERE user = ?", [client.id, userid], function(){
            console.log(client.id + ' <=> ' + userid);
        });
    [...]
});
Run Code Online (Sandbox Code Playgroud)

不幸的是,这引起了一个错误; You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''12345678' WHERE userid = ?' at line 1

数据未反映在数据库中.出于某种原因,该代码不会出现被拿起第二个问号占位符,因此它没有传递正确的值(即它试图找到userid?).

如果我将代码更改为此;

run_db_insert("UPDATE users_table SET clientid = ? WHERE …
Run Code Online (Sandbox Code Playgroud)

mysql node.js

5
推荐指数
1
解决办法
73
查看次数

SuperObject - 从带有"."的字段名解析数据.文字

我最近在解析JSON时遇到了问题.您可以看到,在使用CloudFlare Client Interface API时,我想查找特定IP的"威胁评级".问题是由于API的设计,格式是这样的;

{
 response: {
            xxx.xxx.xxx.xxx: <value>,
            calls_left: 299
            },
 result: "success",
 msg: null
}
Run Code Online (Sandbox Code Playgroud)

xxx.xxx.xxx.xxx表示从中检索数据所需的字段名称.马上,你可能会看到我面临的问题; 假设解析字符串中的点字符是当前路径中的子级别.

<value>代表IP的实际评级.但是,从它返回的格式和数据类型会有所不同.对于不是威胁的IP,或者没有威胁等级的IP,它将false作为布尔值返回.在搜索引擎爬虫上,它返回"SE:<var>"(其中<var>是数值)字符串.在已知威胁上,它返回"BAD:<var>"(其中<var>是数值).因此,我不能依赖于返回的已知数据类型.

然而,主要问题是,由于字段名称中的点,尝试从该字段读取值显然会失败.

delphi json cloudflare firemonkey superobject

4
推荐指数
1
解决办法
1727
查看次数

来自DLL的DWM交互

大家早上好.

我目前正在尝试编写一个围绕通过Windows DWM API提供的功能(例如DWM缩略图)构建的小应用程序.一个这样的功能是能够从应用程序中动态选择缩略图区域,并将其放大/放大.可以通过某种"设置区域"功能从DWM执行此操作,但是我我想先尝试自己的路线,然后才能进入API.

最近我发现了Delphi的一个例子,我曾希望从演示中扩展并构建更具体的东西.我着手将代码移动到Firemonkey FM2应用程序(因为我更喜欢框架的视觉功能与VCL相比).通过一些调整,我设法将其构建,但不幸的是DWMRegisterThumbnail,尽管VCL版本运行完美,但在FMX应用程序中运行时似乎不会返回有效结果.

然后我再看了一下,决定给Hydra一个机会.我将工作的VCL示例复制到Hydra插件,并创建了Firemonkey主机应用程序.我正确设置了两个部分并进行了编译.DLL加载正确,我可以按预期看到FMX主机内的VCL插件接口.但是,在尝试查看窗口的DWM缩略图时,我再次遇到了运行非hydra FMX应用程序时遇到的相同问题.

然后我开始创建一个VCL主机应用程序,以确保它不是特定于VCL-FMX交互的问题.我编译了VCL主机,加载到VCL插件中,我再次看到VCL主机内的VCL插件.然而,我仍然发现我无法从DWM查看缩略图.显然,这不是Firemonkey-VCL交互问题.

因此,我已经得出结论,从DLL运行DWM代码是一个问题.理想情况下,我想要一个FMX主机应用程序只是因为我更容易删除TSelection缩略图,并以这种方式处理缩放(例如,非常少的代码,而不需要寻找自定义组件)提及额外的奖金,如MakeScreenshot.

所以,切入追逐; 是否可以从Hydra插件调用DWM API,和/或将DWM缩略图输出到Firemonkey表面?

我的Hydra插件中使用的代码与链接示例中使用的代码相同,我的宿主应用程序中使用的代码基于Remobject Youtube Channel上的简单示例.

delphi remobjects dwm firemonkey firemonkey-fm2

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

生活绑定JSON对象和数组

晚上好.

我目前正试图掌握Delphi中的实时绑定,因为我想刷新我当前的一个项目(从基础完成返工,以便推送到其他平台,优化性能和最小化代码).我正在使用返回JSON数据的Web API.一个示例调用返回的JSON格式如下所示;

{
  "response": {
    "ips": [
      {
        "ip": "111.222.333.444",
        "classification": "regular",
        "hits": 134,
        "latitude": 0.0000,
        "longitude": 0.0000,
        "zone_name": "example.com"
      },
      {
        "ip": "555.666.777.888",
        "classification": "regular",
        "hits": 134,
        "latitude": 50.0000,
        "longitude: 50.0000,
        "zone_name": "example-2.com"
      },
    ]
},
"result": "success",
"msg": null
}
Run Code Online (Sandbox Code Playgroud)

如您所见,它是一个带有数组的JSON对象和一些不同类型的数据字段(字符串,浮点数,整数等).

在我的应用程序中,我有TRESTClient,TRESTRequest,TRESTResponse,TRESTResponseDataSetAdapter,TClientDataSet和TBindSourceDB组件.我还有一个TButton,一个TMemo和一个TListView.我已经设法通过livebindings挂起所有组件,当我单击按钮(执行请求)时,通过调用返回的整个数据显示在备忘录中.

我正在努力的是将数据链接到ListView.我创建了FieldDefs用于TClientDataSource本身(这是相对于字面树视图ChildDefs);

  • | --result(类型:ftString)
  • | --response(类型:ftObject)
  • | - | --ips(类型:ftArray,大小:6)
  • | - | - | - ip(类型:ftString)
  • | - | - | - 分类(类型:ftString)
  • | - | - | - …

delphi firemonkey livebindings firemonkey-fm3 delphi-xe5

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

Tyiast子组件属性到ini文件

我目前在组件属性的类型转换方面遇到了严重的问题.

在我的表格上,我有一个名为"场景"的TPanel.同样在表单上,​​我有一个创建一个按钮TSelection,然后在其中TSelection创建一个TImage然后将图片加载到该TImage中.TSelection的名称通过称为"ImgObjName"的TEdit分配.然后它将此名称写入inifile.TSelection的事件被分配给代码中其他位置的过程.如您所知,TSelection组件可以在运行时移动(并调整大小).当TSelection打开时,TImage关闭了它的HitTest.

上面的工作正如我所希望的那样,但下一部分是我被困住的地方.本质上,在计时器上,我想将每个子组件的一些属性写入TMemIniFile.有两种方式我愿意这样做;
1)写下每个孩子的属性以分开TMemInifiles.
2)将每个子项的属性写入单个TMemIniFile,但要section确定该部分中的值与哪个组件相关.

我尝试了一些不同的方法,但所有这些方法都给我带来了一些重大问题(通常是"索引越界").

我目前的方法是这样的;

ChgPos是一个全局布尔变量,当其中一个TSelection对象上的mousedown事件触发时为TRUE,当触发MouseUp事件时为FALSE.这个布尔过程非常适合这些目的,因此不需要进行任何更改.

TimerBarTTrackBar在设计时创建的.它的值根据计时器而变化.

AnimIni是早先在代码中分配的TMemIniFile.为此,我将其设置为不释放文件(因为没有访问冲突).

var
  i: Integer;
  PosX, PosY: Integer;
begin
  for i := 0 to Scene.ChildrenCount - 1 do
  begin
    if Scene.Components[i] is TSelection then
    begin
      PosX := AnimIni.ReadInteger(IntToStr(Round(TimerBar.Value)) + '_Object' +
        IntToStr(i), 'PosX', PosX);
      PosY := AnimIni.ReadInteger(IntToStr(Round(TimerBar.Value)) + '_Object' +
        IntToStr(i), 'PosY', PosY);
    end;
  end;
  if ChgPos = False then
  begin
    if Scene.Components[i] is TSelection then
    begin
      (Scene.Components[i] as …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-xe2 firemonkey

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

字符串加密问题

在我目前的一个项目中,我正在使用单用户身份验证系统.我说"单用户",因为我没有计划在同一个Windows帐户上为多个用户进行此项工作(仅仅因为它不是我想要做的事情).

当用户启动应用程序时,会向他们显示身份验证屏幕.此验证屏幕使用图像(即点击图像中的3个特定点),用户名(标准编辑框)和图像选择(下拉菜单允许他们选择他们希望使用的图像).图像选择,用户名和在图像上单击的点必须与用户在设置密码时指定的内容相匹配.

将所有3个结果组合成一个字符串,然后用该Soap.EncdDecd.EncodeString方法对其进行编码.然后使用SHA-512进行散列.最后,它使用DES加密.然后将此值与设置密码时创建的值进行比较.如果匹配,则授予他们访问权限.如果不是,则拒绝访问.我计划在应用程序的其他位置使用SHA512值(例如"主密码",用于在主应用程序中使用各种不同的模块进行授权).

在一个示例中,初始字符串的长度为29个字符,SOAP编码的字符串为大约40个字符,SHA-512字符串为128个字符,DES值为344个字符.由于我不使用大量字符串,所以它实际上非常快.SOAP被用作非常基本的混淆,而不是作为安全措施.

我担心的是第一部分(普通字符串和SOAP)可能是弱点.基本字符串不会给他们一些他们可以输入并被授予访问权限的东西,但它会给他们"图像点击坐标",以及用户名和图像选择,这可能允许他们访问应用程序.SOAP字符串可以很容易地解码.

加强认证的第一部分以试图避免从内存直接撕掉这些值的最佳方法是什么?我是否应该关注潜在的剥削者或攻击者以这种方式阅读价值观?

作为与同一主题直接相关的另一个问题;

存储用户在初始设置期间创建的密码哈希的最佳方法是什么?

我目前正在运行一种TIniFile.SectionExists方法,因为我还没有想出更优雅的东西.这是我缺乏知识的一个领域.我需要跨会话存储密码"hash"(因此使用内存流不是一个选项),但我需要确保安全性足够好,以至于任何脚本小子都无法完全破解它.


更重要的是我是否应该关注,以及我所做的编码,散列和加密是否足够.我开发的图片密码系统已经是一个很好的基础,可以阻止传统的"我知道你的基于文本的密码是什么,所以现在我在你的系统中"攻击,但我担心从内存中读取的技术攻击越多.

delphi authentication encryption delphi-xe2

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

WMI值为数组

大家下午好!

我目前正在开发一个小型系统管理工具,其风格类似于Firemonkey(Delphi XE2)中的Windows 8任务管理器.目前,我正在尝试使用TPanels内部创建CPU核心使用率磁贴TGridLayout.我在设计时添加了所有面板,直到我将实际功能排序.

我的问题在于将数据从WMI输出到数组中.我已经有一个不涉及数组的工作版本,但是我在创建更动态的东西时遇到了麻烦,并且不太可能在不同的配置中出现问题.这是目前完全不起作用的代码;

Procedure CoreUsage;
const
  WbemUser            ='';
  WbemPassword        ='';
  WbemComputer        ='localhost';
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService   : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject   : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;
  i : Integer;
begin
try
  CoInitialize(nil);
  try
    FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
    FWMIService   := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
    FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_PerfFormattedData_Counters_ProcessorInformation WHERE NOT Name="_Total" AND NOT Name="0,_Total"',
                                           'WQL',
                                           wbemFlagForwardOnly);
    oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
    begin …
Run Code Online (Sandbox Code Playgroud)

delphi wmi delphi-xe2 firemonkey

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

TMediaPlayerControl视频大小

早上好家伙!

我目前正在尝试使用XE3,我对使用它构建视频(和普通媒体)播放器感兴趣FM2.我正面临一个关于视频比例的问题,或者更确切地说,看起来完全缺乏对它的支持.

我在表格中添加了一个TMediaPlayer和一个TMediaPlayerControl并将它们连接起来.然后我添加了一个具有简单播放/停止功能的按钮,另一个用于加载视频文件.但是,每个播放的视频都以其实际分辨率进行(尽管对齐设置为alClient).我尽可能地通过文档和源代码看,我似乎无法找到任何缩放或重新调整实际视频区域的方法.该唯一的例外是,如果我调整实际窗口比视频区域,此时它会缩小,同时保持纵横比.

另外请注意,视频区域显示在所有标准控件上方,无论它是否为"已发送回".

至少,我很欣赏使用新的FM²/ Firemonkey2 XE3媒体组件调整视频区域大小或缩放的任何输入.目前是否可能,或者我们是否会等待补丁来改进实施?

delphi firemonkey delphi-xe3

0
推荐指数
1
解决办法
3803
查看次数