How to force raw pointer marshaling when doing automatic COM marshaling
Иногда требуется запретить выполнять стандартный маршалинг указателя на интерфейс средствами OLE32. Например, я хочу использовать некий интерфейс IFoo
из .NET-а, реализация которого попала в CLR из неуправляемого кода, при этом информации в реестре по этому интерфейсу нет (proxy/stub и tlb не зарегистрированы). Как было неоднократно показано в предыдущих заметках о взаимодействии управляемого и неуправляемого кода, при попытке использовать IFoo
из другого потока получим исключение.
Избежать автоматического маршалинга указателя на интерфейс можно, самостоятельно реализовав IMarshal
. Но тут кроется еще одна засада - метод GetUnmarshalClass
обязан возвратить CLSID класса, который будет выполнять роль proxy. И этот класс должен быть зарегистрирован, что нам явно не подходит.
На помощь приходит функция CoCreateFreeThreadedMarshaler
, которая выполняет всю грязную работу по получению необходимой функциональности. Результирующий объект нужно подключить, как tear-off реализацию IMarshal
к требуемому классу.
1 коммент.:
Howdy! This is my first visit to your blog! We are a collection
of volunteers and starting a new project
in a community in the same niche. Your blog provided us valuable information to work on.
You have done a extraordinary job!
Feel free to surf my site : GFI Norte
Отправить комментарий