作为为Interwoven Worksite对话框之一编写自定义命令(带有实现Interwoven命令接口的类的COM-Visible dll)的一部分,我需要从RichEdit文本框中提取信息。
与现有对话框的唯一连接是其HWND句柄;看似微不足道的任务,但我卡住了:
使用Spy ++后,我注意到对话框获取了IRichEditOle
接口,似乎将字符串封装到OLE对象中。
这是我试图做的:
IRichEditOle richEditOleObj = null;
IntPtr ppv = IntPtr.Zero;
Guid guid = new Guid("00020D00-0000-0000-c000-000000000046");
Marshal.QueryInterface(pRichEdit, ref guid, out ppv);
richEditOleObj = (IRichEditOle)Marshal.GetTypedObjectForIUnknown(ppv,typeof(IRichEditOle));
根据接口的GetObjectCount()
方法判断,文本框中只有一个对象 - 很可能是我需要提取的字符串。我使用GetObject()
方法并通过IOleObject
得到QueryInterface
接口:
if (richEditOleObj.GetObject(0, reObject, GetObjectOptions.REO_GETOBJ_ALL_INTERFACES) == 0) //S_OK
{
IntPtr oleObjPpv = IntPtr.Zero;
try
{
IOleObject oleObject = null;
Guid objGuid = new Guid("00000112-0000-0000-C000-000000000046");
Marshal.QueryInterface(reObject.poleobj, ref objGuid, out oleObjPpv);
oleObject = (IOleObject)Marshal.GetTypedObjectForIUnknown(oleObjPpv, typeof(IOleObject));
为了否定其他可能性,我尝试将IRichEditOle
的QueryInteface添加到ITextDocument
,但这也返回了空字符串。
我试图发送EM_STREAMOUT
消息和从回调返回的读缓冲区 - 返回空缓冲区。
在这一点上,我卡住了。谷歌搜索没有多大帮助 - 找不到任何与我的问题相关的东西 - 似乎网上关于IRichEditOle
和RichEdit的绝大多数例子都围绕着将位图插入RichEdit控件。
主要问题 - 我找不到从IOleObject
界面提取所需信息的方法,也没有找到任何与从对象中提取数据相关的示例。
既然我只知道关于COM和OLE的基本内容,我想我错过了一些重要的东西。
我很感激任何想法的建议或评论。
我发现了这个难题的缺失。也许我所做的将帮助其他有类似问题的人。
在致电IRichEditOle::GetObject
之后,我收到了REOBJECT
结构。通过使用结构的clsid字段,我通过注册表找到了所需的接口定义的DLL。
使用显式强制转换(这是C#;因此它等同于使用QueryInterface)从IOleObject
到我所需要的所需接口 - 访问存储在该IOleObject
中的数据。