本机Win32api RichEdit控件及其IRichEditOle接口的问题

时间:2010-05-10 11:52:14

标签: c# com com-interop ole

作为为Interwoven Worksite对话框之一编写自定义命令(带有实现Interwoven命令界面的类的COM-Visible dll)的一部分,我需要从RichEdit文本框中提取信息。

与现有对话框的唯一连接是其HWND句柄;看似微不足道的任务,但我卡住了:

  • 使用标准的win32 api函数(如GetDlgItemText)返回空字符串。

使用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更改为ITextDocument EM_STREAMOUT,但这也返回了空字符串。

我尝试发送IRichEditOle消息和从回调返回的读缓冲区 - 返回空缓冲区。

在这一点上我被卡住了。谷歌搜索没有多大帮助 - 找不到任何与我的问题相关的内容 - 似乎网上绝大多数关于IOleObject和RichEdit的例子都围绕着将位图插入RichEdit控件。

主要问题 - 我找不到从{{1}}界面提取所需信息的方法,也没有找到任何与从对象中提取数据相关的示例。

既然我只知道关于COM和OLE的基本内容,我想我在这里缺少一些重要的东西。

我会很感激任何想法或意见。

1 个答案:

答案 0 :(得分:0)

我发现了这个难题的缺失。也许我所做的将帮助其他有类似问题的人。

致电IRichEditOle::GetObject后,我收到REOBJECT结构。通过使用我通过注册表找到的结构的 clsid 字段,定义了所需接口的dll。

使用显式强制转换(这是C#;因此它等同于使用QueryInterface)从IOleObject到我所需要的所需接口 - 访问存储在IOleObject中的数据。