Как часть написания пользовательской команды (COM-Visible dll с классом, который реализует интерфейс команд Interwoven) для одного из диалоговых окон Interwoven Worksite, мне нужно извлечь информацию из текстового поля RichEdit.
Единственное соединение с существующим диалоговым окном - это его дескриптор HWND; казалось бы, тривиальное задание, но я застрял:
- Использование стандартных функций API Win32 (например, 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));
Чтобы отрицать другие возможности, я пытался использовать QueryInteface для IRichEditOle
до ITextDocument
, но это также возвращало пустую строку.
Я пытался отправить EM_STREAMOUT
сообщение и буфер чтения вернулся из обратного вызова - вернулся пустой буфер.
В этот момент я застрял. Поиск в Google не сильно помог - не смог найти ничего, имеющего отношение к моей проблеме - кажется, что подавляющее большинство примеров в сети о IRichEditOle
и RichEdit вращаются вокруг вставки растрового изображения в элемент управления RichEdit.
Основная проблема - я не смог найти способ извлечения необходимой информации из интерфейса IOleObject
и не нашел примеров, относящихся к извлечению данных из объекта.
Теперь, поскольку я знаю только базовые сведения о COM и OLE, я полагаю, что мне здесь не хватает чего-то важного.
Буду признателен за любые мысли, предложения или замечания.