VCL组件设计为仅从应用程序的主线程使用.对于视觉组件,这从未给我带来任何困难.但是,我有时希望能够使用例如TTimer来自后台线程的非可视组件.或者确实只是创建一个隐藏的窗口.由于依赖,这是不安全的AllocateHwnd.现在,AllocateHwnd我理解的不是线程安全是设计的.
是否有一个简单的解决方案,允许我AllocateHwnd从后台线程使用?
我想修补一个例程调用,以便能够通过一些修改自己处理它.我正在写一个资源加载器.我想修补Delphi的LoadResourceModule和InitInheritedComponent例程.我已经在MadExcept.pas单元中检查了PatchAPI调用,但如果我可以将其用于我的项目,则无法弄明白.
我想要类似的东西
我的exe在运行时调用 - > LoadResourceModule - >跳转到 - > MyCustomResourceModule ...
任何关于此的指针都会非常有帮助.
我已经阅读了这些问题和答案
但我不能弄清楚如何修补位于其他单元中的类的私有方法.
检查此示例我想修补Bar程序.
Unit ThidParty;
Interface
Type
TFoo =Class
private
procedure Bar;
end;
Run Code Online (Sandbox Code Playgroud)
我认为关键是找到一种方法来获取私有方法的地址.
那么,我如何修补delphi类的私有方法?
我发现(很难)如果一个文件有一个有效的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的一个问题,我还没有安装?
我们的应用程序中有很多表单,我需要一个全局事件处理程序来检测其中一个表单何时被销毁(然后采取一些操作).
ps:我想避免向每个表单添加代码,这些表单需要在主表单即将销毁时向主表单发送消息.此外,大多数表单都是在运行时动态创建和销毁的.
我在考虑使用全球TApplicationEvents.
对此最好的方法是什么?
我在我的图书馆使用方法挂钩/绕行.
由于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上工作的解决方案(不幸的是我没有,所以我无法测试任何东西).
我正在使用TOpenPictureDialog来浏览图像.在调试模式下,当我在此对话框中浏览图片时,我碰巧在快捷方式(.lnk)上单击(而不是双击),调试器会中断我的程序,因为它捕获异常,说它不是有效文件格式.
怎么克服这个?我知道这只是在调试时间,并且在最终的EXE中没有任何问题,但它变得非常烦人,因为我希望能够通过这些快捷方式.