К сожалению, никто не отктил, но решение я нашел такое :
class SafeIterfaceReleaser
{
IUnknown* m_ptr;
public :
IUnknown** operator&()
{
return &m_ptr;
}
SafeIterfaceReleaser()
: m_ptr(NULL)
{
}
bool operator !()
{
return (m_ptr == NULL);
}
SafeIterfaceReleaser(IUnknown* ptr)
: m_ptr(ptr)
{
}
void Attach(IUnknown* ptr)
{
m_ptr = ptr;
}
IUnknown* GetPtr()
{
return m_ptr;
}
~SafeIterfaceReleaser()
{
DWORD tid;
HANDLE hndl = ::CreateThread(0, 0, thread_proc, m_ptr, 0, &tid);
CloseHandle(hndl);
}
private:
static DWORD WINAPI thread_proc(LPVOID lpParameter)
{
if (!lpParameter)
return 0;
IUnknown* ptr
= reinterpret_cast<IUnknown*>(lpParameter);
ATLASSERT(ptr);
ptr->Release();
return 0;
}
};
освобождаем интерфейс в 3-м потоке и все работает