为了从日志记录脚本中收集输出,我想使用onepy将信息添加到OneNote 2013笔记本中。不幸的是,由onepy提供的方法update_page_content()
不适用于我。为了让问题更深入的了解,我切换到C#,其中用于OneNote的API网上很多例子表明,有些trouble后,我设法得到以下简约的C#示例工作:如何在Python中调试win32com调用
using System;
using OneNote = Microsoft.Office.Interop.OneNote;
class Program
{
static void Main(string[] args)
{
OneNote.Application onenoteApp = new OneNote.Application();
string xml = "<one:Page xmlns:one=\"http://schemas.microsoft.com/office/onenote/2013/onenote\" ...> ... </one:Page>";
onenoteApp.UpdatePageContent(xml, DateTime.MinValue);
}
}
字符串xml
是通过修改XML文档获得的,该文档是使用GetPageContent
方法从OneNote中检索的,详见我链接的上一个问题。 xml
的确切内容对于这个问题无关紧要,唯一重要的是上述程序一次又一次没有问题地运行,并且对现有OneNote页面的更改始终成功执行。
现在转到Python,我试图翻译我的简约程序而没有做出实质性的改变。我的结果如下所示:
import win32com
import pytz
import datetime
onenote_app = win32com.client.Dispatch('OneNote.Application.15')
xml = "<one:Page xmlns:one=\"http://schemas.microsoft.com/office/onenote/2013/onenote\" ...> ... </one:Page>"
date = pytz.utc.localize(datetime.datetime.fromordinal(1))
onenote_app.UpdatePageContent(xml, date)
我试图非常小心地使用两个变量的相同值。当然这两个字符串xml
的内容是相同的(复制&粘贴)。另外,根据VS2015调试器,DateTime.MinValue
和date
指的是同一日期。然而,当我执行python程序时,我收到了这个非常无益的错误。
135 def UpdatePageContent(self, bstrPageChangesXmlIn=defaultNamedNotOptArg, dateExpectedLastModified=(1899, 12, 30, 0, 0, 0, 5, 364, 0), xsSchema=2, force=False):
136 return self._oleobj_.InvokeTypes(1610743816, LCID, 1, (24, 0), ((8, 1), (7, 49), (3, 49), (11, 49)),bstrPageChangesXmlIn
--> 137 , dateExpectedLastModified, xsSchema, force)
138
139 _prop_map_get_ = {
com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2147213296), None)
据我了解,在C#和Python的实际使用相同的库来执行他们的电话(包括所谓的Microsoft OneNote 15.0 Object Library
)。所以原则上这两个程序都应该正常工作。如果我在这一点上没有弄错的话,那么我会假定Python在的调用中不同于。我怎样才能进一步追溯这里的实际问题?有没有办法使用Visual Studio 2015的内置Python支持来更好地理解C#和Python代码之间的区别?
你说得对,怀疑日期过了就是问题所在。与此同时,我得到了python程序的运行,并且一旦找到时间,我会尽快添加我的解决方案。但是,你不回答我的更一般的问题:你怎么知道-2147213296意味着0x80042010?这两个数字似乎与我无关。至少将-2147213296转换为十六进制给了我0x7ffbdff0,这看起来完全不相关。 – ranguwud
其实它给你-0x7ffbdff0(负数)。您需要将其转换为正面。你可以通过向结果添加0x100000000来完成。 – jayongg
这是真的,但对我来说显得任意。例如,我也可以添加0xffffffff并获得不同的结果。添加0x100000000这是一个常规规则,它总是** true?另外,为什么没有增加正面的返回值? – ranguwud