gpt4 book ai didi

macos - 如何在 Delphi XE2 中向 Mac OS Finder 添加菜单项

转载 作者:行者123 更新时间:2023-12-03 14:33:32 24 4
gpt4 key购买 nike

我正在开发针对 Mac OS 和 Windows 的 Delphi XE2 应用程序。我想集成到上下文菜单中。对于 Windows,这是一个简单的任务。但对于 Mac OS,我不知道如何做到这一点。

我已阅读 Providing a Service文档并在 Delphi 中尝试了类似的代码,但没有成功。

查看 Finder 集成试验的简单代码。

应用程序.dpr

program App;
uses
SysUtils,
{$IFDEF MACOS}
AppKit, CocoaTypes, CoreFoundation,
CoreServices, Foundation, Mach, ObjCRuntime,
ObjectiveC, OCMarshal, OpenGL, QuartzCore, Security,
SystemConfiguration,
{$ENDIF}
MessageProvider;
{$IFDEF MACOS}
var
app: NSApplication;
provider: TMessageProvider;
{$ENDIF}

begin
Application.Initialize;

{$IFDEF MACOS}
provider := TMessageProvider.Create();

app := TNSApplication.Alloc();
app.setServicesProvider(provider);
{$ENDIF}

Application.CreateForm(TFormOSVersion, FormOSVersion);
Application.Run;
end.

MessageProvider.pas

unit MessageProvider;

interface

uses
FMX.Dialogs
{$IFDEF MACOS}
, AppKit, CocoaTypes, CoreFoundation,
CoreServices, Foundation, Mach, ObjCRuntime,
ObjectiveC, OCMarshal, OpenGL, QuartzCore, Security,
SystemConfiguration
{$ENDIF}
;

type
TMessageProvider = class
public
procedure simpleMessage(var userData: string; var error: string);
end;

implementation

procedure TMessageProvider.simpleMessage(var userData: string; var error: string);
begin
ShowMessage('Simple message from service.');
error := '';
end;

end.

向 info.plist 添加了配置

<key>NSServices</key>
<array>
<dict>
<key>NSKeyEquivalent</key>
<dict>
<key>default</key>
<string>e</string>
</dict>
<key>NSMenuItem</key>
<dict>
<key>default</key>
<string>App/Message</string>
</dict>
<key>NSMessage</key>
<string>simpleMesage</string>
<key>NSPortName</key>
<string>App</string>
</dict>
</array>

在 Mac OS 上运行此应用程序时,应用程序会挂起,有时会因“总线错误”异常而崩溃。

谁能帮忙解决这个问题吗?

或者Delphi XE2可能不支持这种功能?

最佳答案

最后,我回到了这个项目,成功注册了服务提供者并处理了服务请求。

首先我尝试使用 NSRegisterServicesProvider 方法,但是 Macapi 源中没有这样的方法,所以我搜索了 applicationDidFinishLaunching 委托(delegate)。我使用它注册了我的服务提供商:

procedure TApplicationDelegate.applicationDidFinishLaunching(Notification: Pointer);
var
autoReleasePool: NSAutoreleasePool;
app: NSApplication;
provider: TMessageProvider;
begin
autoReleasePool := TNSAutoreleasePool.Create;
try
autoReleasePool.init();

app := TNSApplication.Wrap(TNSApplication.OCClass.sharedApplication);

provider := TMessageProvider.Create();
app.setServicesProvider(provider.ObjId);
finally
autoReleasePool.release();
end;
end;

我还为服务提供商创建了接口(interface)(我认为这是 ObjectiveC-Delphi 桥接工作所必需的):

IMessageProvider = interface(IObjectiveC)['{1EA9319A-8F99-4445-B435-48D5E73876FA}']
procedure simpleMessage(pBoard: Pointer; userData: Pointer; error: PPointer); cdecl;
end;

并从此接口(interface)和TOCLocal类继承了TMessageProvider。

此后,我的应用程序可以对上下文菜单中的服务请求使用react。

我已经分享了我的项目的来源。 Here他们是。

关于macos - 如何在 Delphi XE2 中向 Mac OS Finder 添加菜单项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8013096/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com