小编Aud*_*oGL的帖子

OSX - 如何判断光标是否可见

我知道这个问题已经得到了回答:

检测光标是否隐藏在Mac OS X上

但此时,函数"CGCursorIsVisible"已被弃用.根据帮助文献,没有替代品.

https://developer.apple.com/library/mac/documentation/GraphicsImaging/Reference/Quartz_Services_Ref/DeprecationAppendix/AppendixADeprecatedAPI.html#//apple_ref/c/func/CGCursorIsVisible

使用隐藏和显示功能(CGDisplayHideCursor/CGDisplayShowCursor)时,不会返回对光标可见性的引用.虽然显示/隐藏计数器由quartz维护,但无法访问该值.

那么,我们如何确定光标是否可见?

macos cursor osx-mavericks

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

Delphi - 在OSX上获得完整堆栈跟踪

我有一个可以记录堆栈跟踪的应用程序,以后可以用于调试.

在Windows上,我使用了JEDI项目提供的优秀JCLDebug单元.

现在我的应用程序在OSX上运行,我遇到了一些麻烦 - 我不知道如何在发生异常时获得正确的堆栈跟踪.

我已经掌握了基础知识 -

1)我可以使用'backtrace'获取堆栈跟踪(在libSystem.dylib中找到)

2)使用Delphi链接器提供的.map文件,可以将生成的回溯转换为行号

我留下的问题是 - 我不知道从哪里调用backtrace.我知道Delphi使用Mach异常(在一个单独的线程上),并且我不能使用posix信号,但这就是我设法解决的问题.

我可以在'try ... except'块中获得回溯,但不幸的是,到那时堆栈已经缩小了.

如何安装适当的异常记录器,它将在异常发生后立即运行?

更新:

根据'Honza R的建议,我看了一下'GetExceptionStackInfoProc'程序.

这个函数确实让我"处理"了异常处理过程,但遗憾的是,这让我遇到了一些与之前相同的问题.

首先 - 在桌面平台上,此函数'GetExceptionStackInfoProc'只是一个函数指针,您可以使用自己的异常信息处理程序进行分配.因此开箱即用,Delphi不提供任何堆栈信息提供程序.

如果我将一个函数分配给'GetExceptionStackInfoProc'然后在其中运行'backtrace',我会收到一个堆栈跟踪,但该跟踪是相对于异常处理程序的,而不是导致该异常的线程.

'GetExceptionStackInfoProc'确实包含一个指向'TExceptionRecord'的指针,但是关于这个的文档非常有限.

我可能会超越自己的深度,但是如何从正确的线程获得堆栈跟踪?我可以将自己的'backtrace'函数注入异常处理程序,然后从那里返回标准异常处理程序吗?

更新2

更多细节.要澄清一件事 - 这个问题是由MACH消息处理的异常,而不是完全在RTL中处理的软件异常.

Embarcadero已经提出了一些评论以及这些功能 -

    System.Internal.MachExceptions.pas -> catch_exception_raise_state_identity

    {
     Now we set up the thread state for the faulting thread so that when we
     return, control will be passed to the exception dispatcher on that thread,
     and this POSIX thread will continue watching for Mach exception messages.
     See the …
Run Code Online (Sandbox Code Playgroud)

delphi macos posix exception mach

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

在OSX上可靠地部署Delphi生成的Dylib

我想在OSX上部署一个.dylib,它是用Delphi创建的.此.dylib应该可以由第三方应用程序加载.

这似乎是一个重复的问题,但经过大量的搜索,我找不到答案.问题与此相同:https://forums.embarcadero.com/thread.jspa?messageID = 592417

问题是.dylib需要libcgunwind.1.0.dylib,但是从第三方应用程序运行时它找不到它.作为测试,我试图复制libcgunwind.1.0.dylib到usr/lib,而且工作.当OSX无法找到.dylib时,它将始终搜索usr/lib.不幸的是,我不想将此作为最终解决方案,因为它需要提升权限,而且似乎是一种处理简单问题的繁琐方式.


仔细检查一下,我曾经otool检查过我的.dylib,它给了我以下路径:@rpath/libcgunwind.1.0.dylib.

问题是,@rpath当您的.dylib由第三方应用程序运行时,无法说明将列出哪些路径.为此,应用程序始终必须提供绝对路径libcgunwind.1.0.dylib.

显而易见的解决方案是使用install_name_tool来代替@rpath用@loader_path.如果我的逻辑是正确的,这应该导致我的.dylib总是找到libcgunwind.1.0.dylib,只要它们在同一个文件夹中.这是有道理的,因为.dylib应该负责找到自己的依赖项.

所以,我尝试了以下命令行:

install_name_tool -change @rpath/libcgunwind.1.0.dylib @loader_path/libcgunwind.1.0.dylib libTest.dylib

并收到此消息:

install_name_tool: file not in an order that can be processed (local relocation entries out of place): libTest.dylib

我做了一些搜索此错误消息,我一直无法找到任何信息.我必须假设install_name_tool期望在gcc或llvm中构建.dylib中找到一些特定约定,并且Delphi的编译器不提供这些约定.

我在Delphi的编译器中dccosx进行了一些挖掘,并检查了Delphi发送给它的命令行参数,但是我找不到任何有用的选项.这种使用方式libcgunwind.1.0.dylib似乎是编译器隐含的,而不是我可以调整的东西.

我并不是说这是解决问题的正确方法,这些只是我尝试过的最新事情.如果您能想出一个解决问题的不同方法,请分享您的想法!

delphi deployment macos rpath dylib

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

Delphi - 维护对象的自引用

我已经看过很多问题和资源,它们处理对象中的"Self"变量,但每个人都说不同的东西.

例如,在这个问题中:Delphi Self-Pointer用法

该问题得分最高的答案似乎是错误的.指针(Self)不指向包含它的对象,也不能用于从对象内部传递引用.

我试过这样做:

Type
  myobject = class
    PSelf: Pointer;
  End;

Var
  Obj: myobject;

Procedure RunProgram;
Begin
  Obj := myobject.create;
  Obj.PSelf := @Obj;

  //Run the rest of the program
  .
  .
  .
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,这工作得很好.

我的问题是:这是一个很好的编码实践吗?可以期望"PSelf"变量在程序执行期间指向对象吗?

我最近遇到了一个错误,"PSelf"已经停止指向它包含对象,我想知道对象是否在堆中被拖曳,或者内存是否已损坏.

编辑:

在某些情况下,使用"Self"变量对我来说不起作用,现在我无法复制它.因此,整个问题毫无意义,我使用'PSelf'变量的技术也是如此.对于那个很抱歉.

正如Ken所指出的,上面的链接有正确的答案:)

delphi pointers self

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

Delphi DLL组织 - 静态和动态加载

我想这是一个常见问题,但谷歌搜索并没有提出解决方案.我只是在加载库时遇到了一些麻烦.

我对该库的来源是使用静态加载,这很好.我正在使用的其余库是动态加载的.

问题是我的程序现在被一个不同的应用程序(主机)加载为一个库(它是一个插件).这意味着HOST可执行文件的目录不是我的应用程序的程序目录.

静态加载的库(只是一个简单的字体渲染库)位于我的程序目录中,当我将软件作为插件加载时,找不到它.当我将我的软件加载为"独立"程序(没有主机)时,没有问题.

我能够通过将"缺失"库放入主机应用程序的文件夹来解决问题,但这是一个糟糕的解决方案.

我也能够通过提供库名称的直接路径来解决它,但这也是一个糟糕的解决方案.我不知道最终用户将在哪里安装我的软件.

有没有办法绕过这个问题而不必重写代码来使用动态加载?

要继续使用静态加载,是否必须注册库?我认为注册这个库是太具侵略性,因为其他程序可能正在使用它的不同版本.

const
  ft_lib = 'freetype6.dll';  //here is our problem. I could put a direct path
                             //here, to fix it, but I will not know this path
                             //on an end-user's machine

type
  FT_Library = Pointer;

function  FT_Init_FreeType(out alibrary : FT_Library ) : FT_Error;
  cdecl; external ft_lib name 'FT_Init_FreeType';
Run Code Online (Sandbox Code Playgroud)

delphi dll static dynamic libraries

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