Есть код, который по существу ничего не делает, только получает интерфейс сразу его освобождает и завершается. НО, перерыв все статьи ненашел ответа на вопрос. После вызова CoCreateInstance из моего контекста создается 3 потока, когда происходит деинициализация, потоки остаютя висеть кагбы из под моего процеса, естественно по завершению главного потока процес просто повисает в памяти. Как собтвенно избавится от этих трех потоков, на других примерах потоки не создаются проблема именно с этим интерфейсом IWebBrowser2. Код (Text): include 'win32ax.inc' section '.data' data readable writeable OleUninitialize dd 0 OleInitialize dd 0 CoCreateInstance dd 0 CoUninitialize dd 0 hOle dd 0 CLSCTX_LOCAL_SERVER = 0x4 Browser dd 0 struc GUID def { match d1-d2-d3-d4-d5, def \{ .Data1 dd 0x\#d1 .Data2 dw 0x\#d2 .Data3 dw 0x\#d3 .Data4 db 0x\#d4 shr 8,0x\#d4 and 0FFh .Data5 db 0x\#d5 shr 40,0x\#d5 shr 32 and 0FFh,0x\#d5 shr 24 and 0FFh,0x\#d5 shr 16 and 0FFh,0x\#d5 shr 8 and 0FFh,0x\#d5 and 0FFh \} } rclsid GUID 0002DF01-0000-0000-C000-000000000046;IWebBrowser2 riid GUID D30C1661-CDAF-11D0-8A3E-00C04FC9E26E;IWebBrowserApp- IWebBrowser2 section '.code' code readable writable executable start: invoke LoadLibrary,"OLE32.DLL" mov [hOle],eax invoke GetProcAddress,[hOle],"OleInitialize" mov [OleInitialize],eax invoke GetProcAddress,[hOle],"OleUninitialize" mov [OleUninitialize],eax invoke GetProcAddress,[hOle],"CoCreateInstance" mov [CoCreateInstance],eax ;===========начало инициализации push 0 ;Инициализируем библиотеку Component Object Model (COM) call [OleInitialize] test eax,eax ;ошибка, если MSB = 1 ; (MSB = бит знака) js ex_f ; js = переход, если установлен бит знака lea ecx, [Browser];: [out] указатель на интерфейс, который запрашивается. Если интерфейс не поддерживается, значение переменной будет приравнено 0. push ecx ; push riid ; riid push CLSCTX_LOCAL_SERVER; dwClsContext push 0 ; pUnkOuter push rclsid ; rclsid call [CoCreateInstance]; clsid:{0002DF01-0000-0000-C000-000000000046} mov eax, [Browser] push eax mov edx, [eax] call dword [edx+80h];IWebBrowser2_Quit ;cominvk Browser,IWebBrowser2_Release mov eax, [Browser] push eax mov edx, [eax] call dword [edx+8];IWebBrowser2_Release ex_f: call [OleUninitialize] ret .end start
PaCHER Вообще-то твой rclsid - это CLSID_InternetExplorer, riid - это IID_IWebBrowser2, поэтому прежде чем делать IWebBrowser2_Release, надо сделать IWebBrowser2_Quit Код (Text): mov eax, [Browser] push eax mov edx, [eax] call dword [edx+80h];IWebBrowser2_Quit
Поправил код, просто копировал именно проблемный кусок не захватил IWebBrowser2_Quit. Но проблема никуда не делась, потоки так и остались.
гы, к этому решению я склонялся, но оно меня не устраивает. Мне нужно именно избавится от этих 3ех лишних потоков.
Может у кого есть рабочая версия на Ц++ или на худой конец на Дэлфи, которая используя этот интерфейс при его освобождении убирает лишние потоки, или просто работает как нужно?
мне нужен легальный способ тоесть тот который используется остальными приложениями которые юзают этот интерфейс в отдельных потоках.
censored Клево, выложи скомпиленый ЕХЕ, который делает то что я описывал, я посмотрю в чем там отличие, что у меня остаются потоки, а у тебя нет. Может, если ничего сложного там нет, подскажеш где ошибка в моем коде? А то неособо информативное ообщение получилось.
Краткое продолжение проблемы. После винального ret когда завершается главный поток, остаетяс 3 потока созданых (как говорит процес эксплорер) из kernel32.dll после того как процес повисел в памяти пару часов там остался уже один поток, но он походу и не думае завершатся. censored Ты куда пропал?