【发布时间】:2011-12-22 05:19:57
【问题描述】:
我正在开发针对 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 不支持这种功能?
【问题讨论】:
-
相关问题假设您使用的是 Cocoa+ObjectiveC,可以调整,使用 DelphiXE2/Firemonkey 调用可可/objectiveC 基于消息的 API 的能力:stackoverflow.com/questions/9420361/… - 我很想写整个制作服务位使用 Cocoa/ObjectiveC 并找到一种方法,然后从您的 delphi 应用程序中简单地调用本机 ObjectiveC 共享库。
-
我认为如果可行的话,您会在免费的 pascal 文档或论坛中找到它,因为 XE2 使用 OSX 的免费 pascal。而且由于免费的 pascal 在 OSX 上已经存在很长时间了,我相信它会比 Delphi 论坛拥有更多。
标签: macos delphi delphi-xe2 finder