Got*_*hAr 31 delphi macos finder delphi-xe2
我正在研究面向Mac OS和Windows的Delphi XE2应用程序.我希望集成到上下文菜单中.对于Windows,这是一项简单的任务.但对于Mac OS,我不知道该怎么做.
我已阅读提供服务文档并在Delphi中尝试了类似的代码,但没有运气.
查看Finder集成试验的简单代码.
App.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.
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)
为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>
Run Code Online (Sandbox Code Playgroud)
在Mac OS应用程序上运行时,挂起并且有时会因"总线错误"异常而崩溃.
任何人都可以帮助解决这个问题吗?
或许Delphi XE2不支持这种功能?
我看到两个潜在的问题
您正在分配自己的NSApplication对象。我怀疑这是正确的 - Delphi 是否也在内部创建了一个?即使没有,您也可能需要在某个时候输入NSApplication'srun方法,以使其真正能够处理消息。
服务提供者必须在委托方法中注册applicationDidFinishLaunching:。您尝试在创建实例后立即注册它NSApplication。
NSRegisterServicesProvider(id provider, NSString *portName)我认为如果您使用注册服务提供而不是使用NSApplication's ,则可以避免这两个问题setServicesProvider:。