gpt4 book ai didi

cocoa - 为Mac Word 2011编写插件-如此接近……AppleScript,Objective-C和Word

转载 作者:行者123 更新时间:2023-12-03 17:09:53 31 4
gpt4 key购买 nike

我正在尝试使Mac Word人造插件正常工作,并且遇到了一些奇怪的问题。抱歉-文字墙传来!

我意识到我在这里触及几个伏都教主题的交集,所以请多多包涵。

我们有...


Microsoft Word 2011 Mac
苹果脚本
AppleScript-Obj-C


...试图伪造插件。我意识到绝对不支持。

我的设置:


操作系统:macOS El Capitan,Xcode 7
Word:2011(最新补丁)


一天结束时,该插件将处理Word域代码。它创建并编辑它们。有一个超级简单的UI可以完成类似的任务,然后在各种类中创建/更新/删除功能。

理论是:


使用sdef导出Word AppleScript标头,然后使用sdp(脚本桥)创建Obj-C接口
在某些情况下(例如find),它可以通过AppleScript-Objective-C桥接到AppleScript
编写Obj-C方法并查看控制器以向用户展示控件


通过XCode单元测试,我实际上已经使一切正常。通过外部虚拟应用程序托管,一切也正常。但是我真正想做的是将其嵌入到Word中。

因此,我查看了两个类似但不同的选项:


部署为框架,通过引用公共C接口(通过VBA)调用Framework
部署为框架,通过AppleScript调用(通过VBA ...)


他们很近,但是...不太正确。

选项1-带C接口的框架

使用这种方法,您可以创建公共C接口
到您的框架中,并使用它们来创建视图控制器。您可以在Word中引用该框架,并且可以调用公共C方法。因为您的框架更直接由Word托管,所以您必须将其编译为32位。

脚步:


在您的框架中创建一个.m文件,并公开用于访问UI的公共方法(例如:“ MyLibOpenCustomUI”)。
在VBA中引用您的框架
VBA宏(OpenOurCustomUI)向您的公共C接口发送消息


Private Declare Sub MyLibOpenCustomUI Lib "/Library/Frameworks/MyFramework.framework/MyFramework" ()


Sub OpenOurCustomUI()
Call MyLibOpenCustomUI
End Sub


问题:

这很好用,但是对于Word域代码来说是一个严重的问题。该行为是非常不一致的。


尝试访问字段的fieldText(Windows中的“数据”)通常会返回 data parameter is nil。 entry_index,范围和其他组件似乎都不错。无论出于何种原因,fieldText似乎都无法访问。


  NSLog(@"fieldText : %@", [field fieldText]);//data parameter is nil



在那些情况下,当您可以访问fieldText时(我仍然不清楚这偶尔/为什么工作),fieldText恰好在256个字符之后被“损坏”。我只能说“已损坏”,因为文本似乎从ascii文本转换为某种形式的unicode字符,并且此后似乎也被截断了。


EX :(然后“名称”后的 :在位置256)

"Name":䜽芟㘱瑵飯ﶿṼﶿ璒澗瑸瑵 ᕻ各

认为通过外部框架运行时,AppleScript-Objective-C位可能是奇怪的行为,我实际上尝试从Objective-C调用AppleScript(嵌入applescript,在Obj-C中编写包装器,然后在运行时加载脚本) 。

像这样...它只是尝试返回给定字段的 field text(通过数字索引)

  on getFieldDataForFieldAtIndex:theIndex
set theIndex to theIndex as integer
tell application "Microsoft Word"
set theField to field theIndex of active document
return field text of theField
end tell
return missing value
end getFieldDataForFieldAtIndex:


这给了我一个更有趣的错误:
Microsoft Word got an error: Can’t get active document. (error -1728)

所以-没有骰子。当它起作用时,我会收到“损坏的”字符串响应。但是,我无法获得fieldText的次数更多。

我完全不知道为什么这会失败,并且在这一点上,我必须相信这与框架以这种方式启动时如何与Word交互有关。真的很臭。我希望这个工作。

选项2-带osascript + AppleScript的框架

通过这种方法,您可以使用vba调用osascript来调出承载UI的applescript(我知道...我知道...)。您将框架编译为64位。

在此版本中,Word字段可以正常工作-字符串看起来不错,并且可以访问和设置所有字段fieldText属性而不会出现问题。

脚步:


VBA中的参考Popen
VBA宏(OpenMyUI)
调用osascript
该调用AppleScript(OpenMyUI.scpt)以在框架中调用公共方法“向我显示接口”


Private Declare Function popen Lib "libc.dylib" (ByVal command As String, ByVal mode As String) As Long


Sub OpenMyUI()
'this works from the VBA debugger
'I _cannot_ get it to work from the VBA when launched from a button in a document...
'window closes immediately w/o input
Dim scriptToRun As String
Dim output As String
Dim command As String
command = "osascript ~/Library/Application\ Scripts/com.microsoft.Word/OpenMyUI.scpt"
output = popen(command, "r")
'If you want this to stick around, you have to do something like...
'MsgBox "stick around, window"
End Sub


--reference our framework
use framework "/Library/Frameworks/MyFramework.framework"
property theWindowLauncher : class "MyWindowLauncher"

on openMyUI(arg)
set theReturn to theWindowLauncher's openUpdateOutput
return theReturn
end openSettings

return openMyUI(1)


问题:

有两个大问题:


通过单击按钮等调用子程序时,UI消失或从不显示。除非您随后在VBA中调用类似“ MsgBox'something'”的名称。然后出现。但是这种行为很奇怪-如果您在关闭对话框之前不关注自定义UI窗口,则自定义UI会消失。
更大的是,窗口(至少在我的机器上)成为全局模式。我从未见过。那绝对不好。


奇怪的是,这可以通过Word VBA调试器很好地运行。实际上,效果很好。只是当您通过直接从宏调用子程序(例如单击按钮)来运行它时,不是这样。

两种选择都非常非常接近。只是不够接近。我对fieldText的怪异感特别困惑。

所以...我想知道。有关如何进行的任何创意?我意识到我在这里所做的事情已经超出了“好主意”的范围,但是我很乐意看到这项工作。

最佳答案

我仍然无法使用选项1(直接的C库引用和损坏的Word字段)回答问题,但是对于选项2(通过osascript调用AppleScript),我发现该窗口确实出现了-但在其他所有窗口的后面我(在所有应用程序中)都忙了起来,所以我从未意识到它在那里。

解决方案(选项2):然后要告诉窗口到前台,然后它“工作”了-尽管需要注意的是,它现在是全局模式窗口(不需要)。

东西...

//wc is our window controller
NSWindow* theWindow = [wc window];
[theWindow setTitle:windowTitle];
[NSApp activateIgnoringOtherApps:YES];
[theWindow setLevel:NSMainMenuWindowLevel];
[theWindow makeKeyAndOrderFront: self];

[NSApp runModalForWindow: theWindow];


就目前而言,这已经足够了。不是任何人想要的,但是可以。

我一点都不喜欢这个过程(vba-> C popen-> osascript-> AppleScript-> obj-c类方法)。


真丑。而且我知道它会在某个时候破裂。
全局模态窗口=超级超级坏。
Word 2016 ...我还没有测试过,但是我怀疑它会有问题。


为什么要通过popen-> osascript-> AppleScript?为了我的一生,我无法让MacScript成功调用AppleScript文件。还尝试使用嵌入式AppleScript。两者都不起作用。刚收到通常的“错误5”。

我的AppleScript利用 use framework来完成这项工作,所以我猜测MacScript不支持此功能(但这只是一个猜测)。其他未包含 use framework的测试AppleScript(文件或嵌入式)(“ Hello,World!”)工作正常。

稍后,我可能会回头看看是否可以通过将Word交互功能移至某种外部设置来使选项1正常工作-可能可以绕过奇怪的“数据为零”问题以及周期性的无法获取活动文档。希望我对这件事有更多了解。

关于cocoa - 为Mac Word 2011编写插件-如此接近……AppleScript,Objective-C和Word,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38839098/

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