上传图片——Word 2007高级应用(十)
2008-09-28 20:18:33 来源:WEB开发网其中,blogaccount是使用该图片上传帐号的博客ID,它是一个有Word 2007在设置博客时自动生成的GUID;serviceurl是urltemplate和username组合之后的url,这也是博客园的组合规则。由于这里涉及到敏感信息,你应该对它们进行加密处理。
这两个文件将会和Blogs.xml放在同一目录里。当Picture Account对话框显示时,将会加载PictureProviders.xml里面的数据并显示在Providers下拉列表里:
当用户点击OK时,我们需要对数据进行验证,并把数据存到PictureAccounts.xml里面。目前,我们只是简单验证两个编辑框是否为空,而错误信息将通过ErrorProvider显示。
Picture Account对话框是在CreatePictureAccount() 方法里调用的:
现在轮到PublishPicture() 方法了,它的工作就是从PictureAccounts.xml文件里面读取所需数据,然后调用博客园的MetaWeblog API上传图片。然而,当我正要着手实现该方法时,出现了一个让我一筹莫展的问题:Image参数究竟是什么?如果无法得知它的具体类型,恐怕这条路是走不下去了。它会不会是某种COM的图片类型呢?突然,我脑海里闪出Andrew的一篇关于图片转换的文章,里面提到基于COM的IPictureDisp和System.Drawing.Image之间的转换,于是尝试把Image转换成IPictureDisp,异常!用Reflector查看该接口,发现它打上了 [MarshalAs(UnmanagedType.IUnknown)]。再想想,这是一个关于COM和.NET之间传递数据的问题,有没有可能在Marshaling的相关主题中找到线索呢?从MSDN到Google找了很久,未果,于是向众多MS的人发邮件请教,并在MSDN论坛发帖子,未有音信。每个COM接口都会有一个GUID,有没有可能从这个入手进一步了解PublishPicture() 呢?通过元数据获得IBlogPictureExtensibility接口的GUID,然后搜索注册表,发现该接口的Key和另一个GUID,搜索那个GUID,发现"PSOAInterface"字眼,于是Google一下,发现Dinesh Ahuja的一篇关于Marshaling的文章,其中就提及到Type Library Marshaling。再次Google,发现此内容在《Applying COM+》一书的第五章有述,从中了解到COM的Late Binding。既然Image是作为IUnknown封送的,那么它必定实现了这个接口,也必定支持这个接口的QueryInterface() 方法,顿时,一个奇怪的主意在我脑海中萌生了:通过Marshal.QueryInterface() 方法试探它到底实现了什么接口。以下是实验代码:
更多精彩
赞助商链接