Проблемы с собственным Win32api RichEdit и его интерфейсом IRichEditOle - PullRequest
0 голосов
/ 10 мая 2010

Как часть написания пользовательской команды (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, я полагаю, что мне здесь не хватает чего-то важного.

Буду признателен за любые мысли, предложения или замечания.

1 Ответ

0 голосов
/ 12 мая 2010

Я нашел недостающий кусочек головоломки. Возможно, то, что я сделал, поможет другим с подобной проблемой.

После звонка IRichEditOle::GetObject я получил REOBJECT структуру. Используя поле clsid структуры, которую я нашел через реестр, dll, где был определен необходимый интерфейс.

Использование явного приведения (это C #; так что это эквивалентно использованию QueryInterface) из IOleObject в требуемый интерфейс. Я достиг того, что мне было нужно - доступ к данным, хранящимся в этом IOleObject.

...