作为为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
更改为ITextDocument
EM_STREAMOUT
,但这也返回了空字符串。
我尝试发送IRichEditOle
消息和从回调返回的读缓冲区 - 返回空缓冲区。
在这一点上我被卡住了。谷歌搜索没有多大帮助 - 找不到任何与我的问题相关的内容 - 似乎网上绝大多数关于IOleObject
和RichEdit的例子都围绕着将位图插入RichEdit控件。
主要问题 - 我找不到从{{1}}界面提取所需信息的方法,也没有找到任何与从对象中提取数据相关的示例。
既然我只知道关于COM和OLE的基本内容,我想我在这里缺少一些重要的东西。
我会很感激任何想法或意见。
答案 0 :(得分:0)
我发现了这个难题的缺失。也许我所做的将帮助其他有类似问题的人。
致电IRichEditOle::GetObject
后,我收到REOBJECT
结构。通过使用我通过注册表找到的结构的 clsid 字段,定义了所需接口的dll。
使用显式强制转换(这是C#;因此它等同于使用QueryInterface)从IOleObject
到我所需要的所需接口 - 访问存储在IOleObject
中的数据。