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

问题描述 投票:0回答:1

作为为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的QueryInteface添加到ITextDocument,但这也返回了空字符串。

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

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

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

既然我只知道关于COM和OLE的基本内容,我想我错过了一些重要的东西。

我很感激任何想法的建议或评论。

c# com com-interop ole
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.