我试图让Mac Word faux-plugin工作,我遇到了一些奇怪的问题。对不起 - 文字墙传入!
我知道我在这里触及了几个伏都教主题的交集,所以请耐心等待。
我们有......
...试图假装一个插件。我意识到这一点绝对不受支持。
我的设置:
一天结束时,插件会操纵Word字段代码。它创建并编辑它们。有一个超级简单的用户界面来执行这样的操作,然后在创建/更新/删除功能的各个类中。
理论是:
find
),它与AppleScript-Objective-C桥接到AppleScript 通过XCode单元测试我实际上已经完成了所有工作。通过外部虚拟应用程序托管,一切运作良好。但我真正喜欢做的就是把它嵌入到Word中。
所以我看了两个相似但不同的选项:
他们关闭了,但......不太对劲。
使用此方法,您可以创建公共C接口 进入您的框架并使用它们来创建视图控制器。您在Word中引用框架并可以调用公共C方法。因为您的框架更直接由Word托管,所以您必须将其编译为32位。
Private Declare Sub MyLibOpenCustomUI Lib "/Library/Frameworks/MyFramework.framework/MyFramework" ()
Sub OpenOurCustomUI()
Call MyLibOpenCustomUI
End Sub
这很好用,但对于Word字段代码的严重问题。这种行为非常不一致。
data parameter is nil
。 entry_index,range和其他组件似乎都很好。无论出于何种原因,fieldText似乎无法访问。 NSLog(@"fieldText : %@", [field fieldText]);//data parameter is nil
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交互时的方式有关。哪个很臭,真的。我喜欢这个工作。
使用这种方法,您可以使用vba调用osascript来调用托管UI的AppleScript(我知道......我知道......)。您将框架编译为64位。
在这个版本中,Word字段工作正常 - 字符串看起来很棒,并且可以毫无问题地访问和设置所有字段fieldText属性。
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)
有两个大人物:
奇怪的是,通过Word VBA调试器可以很好地解决这个问题。实际上工作得很好。只是当你通过直接从宏调用sub来运行它时(比如点击按钮)。
非常非常接近这两个选项。只是不够近。我特别被FieldText古怪所困扰。
所以......我想知道。关于如何进行的任何创意?我意识到我在这里所做的事情已经超越了“好主意”的界限,"但我很乐意看到这项工作。
答案 0 :(得分:1)
我仍然无法回答选项1(直接C库引用和损坏的Word字段)的问题,但对于选项2(通过osascript调用AppleScript),我发现窗口实际上是 出现了 - 但是在我所有的其他窗口后面(在所有应用程序中),所以我从未意识到它在那里。
解决方案(选项2):这是告诉窗口到达前台的问题,它已经工作了#34; - 尽管有一点需要注意,它现在是一个全局模态窗口(不需要)。
东西......
//wc is our window controller
NSWindow* theWindow = [wc window];
[theWindow setTitle:windowTitle];
[NSApp activateIgnoringOtherApps:YES];
[theWindow setLevel:NSMainMenuWindowLevel];
[theWindow makeKeyAndOrderFront: self];
[NSApp runModalForWindow: theWindow];
目前已经足够了#34;通过获得。不是任何人想要的,但好的。
我根本不喜欢这个过程(vba - > C popen - > osascript - > AppleScript - > obj-c类方法)。
为什么要通过popen - > osascript - > AppleScript的?对于我的生活,我无法让MacScript成功调用AppleScript文件。还尝试使用嵌入式AppleScript。都没有奏效。刚刚得到了正常的"错误5。"
我的AppleScript使用use framework
来完成这项工作,所以我的猜测是MacScript不支持这个(但这只是猜测)。其他测试AppleScript(文件或嵌入式)没有包含use framework
(" Hello,World!")工作正常。
稍后我可能会回过头来看看我是否可以通过将Word交互移动到某种外部设置来使选项1工作 - 这可能有助于绕过奇怪的数据"数据是nil"问题和定期无法获得活动文件。希望我更多地了解这一点。