C# 本机Win32api RichEdit控件及其iriceditole接口存在问题
作为为一个Interwoven工作站点对话框编写自定义命令(COM Visible dll和实现Interwoven命令接口的类)的一部分,我需要从RichEdit文本框中提取信息 现有对话框的唯一连接是其HWND句柄;看似微不足道的任务,但我被卡住了:C# 本机Win32api RichEdit控件及其iriceditole接口存在问题,c#,com,com-interop,ole,C#,Com,Com Interop,Ole,作为为一个Interwoven工作站点对话框编写自定义命令(COM Visible dll和实现Interwoven命令接口的类)的一部分,我需要从RichEdit文本框中提取信息 现有对话框的唯一连接是其HWND句柄;看似微不足道的任务,但我被卡住了: 使用标准win32 api函数(如GetDlgItemText)返回空字符串 在使用Spy++之后,我注意到对话框获得了IRichEditOle接口,似乎将字符串封装到OLE对象中 以下是我试图做的: IRichEditOle richEd
- 使用标准win32 api函数(如GetDlgItemText)返回空字符串李>
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()
方法,通过QueryInterface
获得了IOleObject
接口:
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));
为了否定其他可能性,我尝试将iriceditole
的空间查询到ITextDocument
,但这也返回了空字符串
我试图发送EM\u STREAMOUT
消息并读取回调返回的缓冲区-返回的空缓冲区
在这一点上我被卡住了。谷歌搜索没有多大帮助——找不到任何与我的问题相关的东西——似乎网上绝大多数关于IRichEditOle
和RichEdit的例子都是围绕着将位图插入RichEdit控件展开的
主要问题-我无法找到从IOleObject
接口提取所需信息的方法,也没有找到任何与从对象提取数据相关的示例
现在,由于我只知道COM和OLE的基本知识,我想我错过了一些重要的东西
如果您有任何想法、建议或意见,我将不胜感激。我找到了拼图中缺失的部分。也许我所做的会帮助其他有类似问题的人 调用
iriceditole::GetObject
后,我收到了REOBJECT
结构。通过使用结构的clsid字段,我通过注册表找到了定义所需接口的dll
使用显式转换(这是C#;因此相当于使用QueryInterface)从
IOleObject
到所需的接口,我实现了我所需要的-访问存储在该IOleObject
中的数据为什么不使用RichEditBox类?此控件是否属于其他进程?是。Interwoven Worksite是客户机-服务器应用程序,我正在为一个客户机对话框开发扩展;我与工作站点客户端的唯一连接是通过其COM api获得的HWND句柄。