Convert mshtml::IHTMLDocument2^ To CComPtr<IHTMLDocument2>
От: jyuyjiyuijyu  
Дата: 05.02.13 12:05
Оценка:
Всем привет

вот у меня в C++/CLI программе есть такой код

mshtml::IHTMLDocument2^ document = (mshtml::IHTMLDocument2^)webBrowser1->Document->DomDocument;
mshtml::IHTMLTxtRange^ range = (mshtml::IHTMLTxtRange^)
            document->selection->createRange();
        
use range->text ...


почему то ... через раз ... доступ к range->text очень медленный ...

используется для этого дела Microsoft.mshtml.dll

вопрос как мне из mshtml::IHTMLDocument2^ получить COM интерфейс CComPtr<IHTMLDocument2>
и передать его в нативный код ... чтобы там попробовать сделать тоже самое только без
прослойки в виде Microsoft.mshtml.dll ?

спасибо
Re: Convert mshtml::IHTMLDocument2^ To CComPtr<IHTMLDocument2>
От: samius Япония http://sams-tricks.blogspot.com
Дата: 05.02.13 12:19
Оценка: 6 (1)
Здравствуйте, jyuyjiyuijyu, Вы писали:

J>вопрос как мне из mshtml::IHTMLDocument2^ получить COM интерфейс CComPtr<IHTMLDocument2>

J>и передать его в нативный код ... чтобы там попробовать сделать тоже самое только без
J>прослойки в виде Microsoft.mshtml.dll ?

Marshal.GetIUnknownForObject вернет IntPtr на IUnknown. Его в нативный код можно совать. В нативном QueryInterface на IHTMLDocument2 не забыть сделать.
Re[2]: Convert mshtml::IHTMLDocument2^ To CComPtr<IHTMLDocument2>
От: samius Япония http://sams-tricks.blogspot.com
Дата: 05.02.13 12:21
Оценка:
Здравствуйте, samius, Вы писали:

S>Marshal.GetIUnknownForObject вернет IntPtr на IUnknown. Его в нативный код можно совать. В нативном QueryInterface на IHTMLDocument2 не забыть сделать.


И конечно же, ручками Marshal.Release(IntPtr)
Re[3]: Convert mshtml::IHTMLDocument2^ To CComPtr<IHTMLDocument2>
От: jyuyjiyuijyu  
Дата: 05.02.13 13:07
Оценка:
странно у меня mshtml.dll что ли корявая ... потому что тупить начинает внутри её ...
и что самое странное тупняк происходит точно через раз ... раз быстро получает выделенный текст ...
следующий раз очень медленно ... потом снова быстро ...

вот каллстек в момент когда процессор загружен на 100 % ... Microsoft.mshtml.dll оказалась
ни при чем ... может mshtml.dll заменить ?

ntoskrnl.exe!KiUnlockDispatcherDatabase+0x77
ntoskrnl.exe!KeSetEvent+0x74
ntoskrnl.exe!PspGetSetContextSpecialApc+0x4e
ntoskrnl.exe!KiDeliverApc+0xb3
hal.dll!HalpApcInterrupt+0xc5
mshtml.dll!CTreePos::InternalCompare+0x63
mshtml.dll!CLineBreakCompat::QueryBreaks+0x6b
mshtml.dll!CTreeSaver::LineBreakChar+0x8a
mshtml.dll!CTreeSaver::Save+0x401
mshtml.dll!CRangeSaver::Save+0x145
mshtml.dll!CAutoRange::SaveHTMLToStream+0xa8
mshtml.dll!CAutoRange::GetBstrHelper+0x63
mshtml.dll!CAutoRange::get_text+0x5f
my_app.exe!test_wi+0xf7
System.Windows.Forms.ni.dll+0x212d18
System.Windows.Forms.ni.dll+0x8ba346
System.Windows.Forms.ni.dll+0x77655e
System.Windows.Forms.ni.dll+0x776bc0
System.Windows.Forms.ni.dll+0x7760b9
System.Windows.Forms.ni.dll+0xa649fb
System.Windows.Forms.ni.dll+0x770a36
System.Windows.Forms.ni.dll+0x77a61d
System.Windows.Forms.ni.dll+0x7275d3
System.Windows.Forms.ni.dll+0xa59b66
System.Windows.Forms.ni.dll+0x201d6a
System.Windows.Forms.ni.dll+0x221fd1
System.Windows.Forms.ni.dll+0x1dff66
System.Windows.Forms.ni.dll+0x1f8640
System.Windows.Forms.ni.dll+0x1f85c1
System.Windows.Forms.ni.dll+0x1f849a
USER32.dll!InternalCallWinProc+0x28
USER32.dll!UserCallWinProcCheckWow+0x150
USER32.dll!DispatchMessageWorker+0x306
USER32.dll!DispatchMessageW+0xf
System.Windows.Forms.ni.dll+0x208cce
System.Windows.Forms.ni.dll+0x208937
System.Windows.Forms.ni.dll+0x208781
System.Windows.Forms.ni.dll+0x1c5911
mscorwks.dll+0x1b4c
mscorwks.dll!DllUnregisterServerInternal+0x6195
mscorwks.dll!CoUninitializeEE+0x2e95
mscorwks.dll!CoUninitializeEE+0x2ec8
mscorwks.dll!CoUninitializeEE+0x2ee6
mscorwks.dll!NGenCreateNGenWorker+0x1f53
mscorwks.dll!GetPrivateContextsPerfCounters+0xf466
mscorwks.dll!GetPrivateContextsPerfCounters+0xf9b6
mscorwks.dll!CorExeMain+0x168
mscorwks.dll!CorExeMain+0x98
mscoree.dll!CorExeMain+0x34
KERNEL32.dll!BaseProcessStart+0x23
Re[4]: Convert mshtml::IHTMLDocument2^ To CComPtr<IHTMLDocument2>
От: jyuyjiyuijyu  
Дата: 05.02.13 13:30
Оценка:
написал такой тест

boost::timer tt;
pTxtRange->get_text (&bsText);
printf("get_text %f\n", tt.elapsed());


вывод

get_text 0.078000
get_text 9.406000
get_text 0.047000
get_text 9.328000
get_text 0.063000
get_text 9.359000


тоесть через раз он в ~200 раз дольше выполняет эту команду ...

если через браузер открыть этот же документ то он быстро копирует всегда ...

версии mshtml.dll совпадают проверил ...

ничего не понимаю ...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.