相关疑难解决方法(0)

如何使AllocateHwnd线程安全?

VCL组件设计为仅从应用程序的主线程使用.对于视觉组件,这从未给我带来任何困难.但是,我有时希望能够使用例如TTimer来自后台线程的非可视组件.或者确实只是创建一个隐藏的窗口.由于依赖,这是不安全的AllocateHwnd.现在,AllocateHwnd我理解的不是线程安全是设计的.

是否有一个简单的解决方案,允许我AllocateHwnd从后台线程使用?

delphi

18
推荐指数
2
解决办法
3288
查看次数

在delphi中调用例程调用

我想修补一个例程调用,以便能够通过一些修改自己处理它.我正在写一个资源加载器.我想修补Delphi的LoadResourceModule和InitInheritedComponent例程.我已经在MadExcept.pas单元中检查了PatchAPI调用,但如果我可以将其用于我的项目,则无法弄明白.

我想要类似的东西

我的exe在运行时调用 - > LoadResourceModule - >跳转到 - > MyCustomResourceModule ...

任何关于此的指针都会非常有帮助.

delphi monkeypatching

18
推荐指数
2
解决办法
4156
查看次数

我如何修补delphi类的私有方法?

我已经阅读了这些问题和答案

如何更改外部声明的函数的实现(绕行)

在delphi中调用例程调用

但我不能弄清楚如何修补位于其他单元中的类的私有方法.

检查此示例我想修补Bar程序.

Unit ThidParty;
Interface
   Type
      TFoo =Class
        private
           procedure Bar;
       end;
Run Code Online (Sandbox Code Playgroud)

我认为关键是找到一种方法来获取私有方法的地址.

那么,我如何修补delphi类的私有方法?

delphi delphi-xe2

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

有一种简单的方法来解决Delphi utf8文件缺陷吗?

我发现(很难)如果一个文件有一个有效的UTF-8 BOM但包含任何无效的UTF8编码,并且被任何Delphi(2009+)编码启用的方法读取LoadFromFile,那么结果就是完全空文件,没有错误指示.在我的几个应用程序中,我宁愿丢失一些不良编码,即使在这种情况下我也没有得到任何错误报告.

调试显示MultiByteToWideChar调用两次,首先获取输出缓冲区大小,然后进行转换.但是TEncoding.UTF8包含FMBToWCharFlags这些调用的私有值,并使用MB_ERR_INVALID_CHARS值初始化.因此,获取charcount的调用返回0并且加载的文件完全为空.在没有标志的情况下调用此API将"默默地删除非法代码点".

我的问题是如何最好地编织Encoding区域中的类的嵌套来解决这个私有值的事实(并且需要,因为它是所有线程的类var).我想我可以使用Marco Cantu的Delphi 2009书中的指南添加自定义UTF8编码.并且如果MultiByteToWideChar在没有标志的情况下再次调用它之后返回编码错误,它可以选择性地引发异常.但这并没有解决如何使用我的自定义编码而不是Tencoding.UTF8.

如果我可以在初始化时将其设置为应用程序的默认设置,也许通过实际修改类var for Tencoding.UFT8,这可能就足够了.

当然,我需要一个解决方案,而不是等待提交质量控制报告,要求更强大的设计,接受它,并看到它改变.

任何想法都会非常受欢迎.并且有人可以确认这仍然是XE4的一个问题,我还没有安装?

delphi utf-8

13
推荐指数
2
解决办法
1711
查看次数

如何检测整个应用程序中的表单是否被销毁?

我们的应用程序中有很多表单,我需要一个全局事件处理程序来检测其中一个表单何时被销毁(然后采取一些操作).

ps:我想避免向每个表单添加代码,这些表单需要在主表单即将销毁时向主表单发送消息.此外,大多数表单都是在运行时动态创建和销毁的.

我在考虑使用全球TApplicationEvents.

对此最好的方法是什么?

delphi delphi-7

8
推荐指数
4
解决办法
3455
查看次数

OS X上的WriteProcessMemory等价物

我在我的图书馆使用方法挂钩/绕行.

由于WriteProcessMemory/ReadProcessMemory是Windows API函数,因此OS X上方法挂钩/绕行的解决方案是什么?

编辑:

好吧,让我在这里提供更多信息,以便更清楚我为什么要问这个问题:

在我的DSharp库的即将推出的功能中,我有以下代码:

procedure FreeInstance(Self: TObject);
begin
  ...

  Self.CleanupInstance;
  FreeMem(Pointer(Self));
end;

var
  FreeInstanceBackup: TXRedirCode;

initialization
  ...
  HookCode(@TObject.FreeInstance, @FreeInstance, FreeInstanceBackup);

finalization
  UnhookCode(@TObject.FreeInstance, FreeInstanceBackup);
  ...

end.
Run Code Online (Sandbox Code Playgroud)

事实是,我需要挂钩到TObject.FreeInstance方法以获得每个对象销毁的通知(是的,我知道,如果有人决定覆盖它并且不调用继承,则可能不会调用它).

另一个使用WriteProcessMemory的单元是ReturnTypePatch.pas,它修复了QC#98687,这对于像我这样的模拟库和来自Vincent Parrett的Delphi Mocks来说不必要的(他们基本上有一个用户在我们都知道这个问题之前报告了这个问题).

WriteProcessMemory的另一个用途是在DSharp的AOP部分中,我基本上用从RTTI的TVirtualMethodInterceptor类创建的代理类VMT替换类的VMT.使用TVirtualMethodInterceptor,您只能代理现有对象 - 我的实现对整个类执行此操作(因此所有现有和将来的对象,即使是继承的).

在所有情况下,使用Move都无法写入内存,因为它们受到保护(在通过调用CopyMemory替换WriteProcessMemory时获取AV).

希望这是关于我正在使用这些功能的足够信息 - 有人可以指出我将在OS X上工作的解决方案(不幸的是我没有,所以我无法测试任何东西).

delphi macos hook delphi-xe2

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

在浏览TOpenPictureDialog中的非图像时,如何避免调试器停止我的程序?

我正在使用TOpenPictureDialog来浏览图像.在调试模式下,当我在此对话框中浏览图片时,我碰巧在快捷方式(.lnk)上单击(而不是双击),调试器会中断我的程序,因为它捕获异常,说它不是有效文件格式.

怎么克服这个?我知道这只是在调试时间,并且在最终的EXE中没有任何问题,但它变得非常烦人,因为我希望能够通过这些快捷方式.

delphi dialog shortcut delphi-7

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

标签 统计

delphi ×7

delphi-7 ×2

delphi-xe2 ×2

dialog ×1

hook ×1

macos ×1

monkeypatching ×1

shortcut ×1

utf-8 ×1