Как я могу получить указатель IUnknown * (если есть) для некоторого элемента управления Visual Basic 6? - PullRequest
1 голос
/ 21 апреля 2011

Я хотел бы вызвать некоторые функции C из программы Visual Basic 6, которые принимают IUnknown*.Предполагая, что я знаю, что некоторый элемент управления в моем приложении VB6 является элементом управления ActiveX, могу ли я получить базовый IUnknown* из этого (возможно, путем приведения?), Чтобы передать его функции C?

Ответы [ 2 ]

3 голосов
/ 21 апреля 2011

Все COM-интерфейсы являются производными от IUnknown, вы можете просто использовать методы IUnknown для любого допустимого указателя интерфейса.

Если вам нужна дополнительная ссылка на тот же компонент,но не важно, какой интерфейс тогда использовать метод QueryInterface для IUknown.

0 голосов
/ 02 мая 2011

Одна интересная вещь, которую я обнаружил за это время (просто упомянул об этом на случай, если кто-то найдет этот вопрос): для многих проверенных мною элементов управления значение GWL_USERDATA, возвращаемое GetWindowLong, дает адрес некоторой структуры, которая имеет1003 * значение указателя со смещением 12. Таким образом, для вас может работать следующее:

IUnknown *unk = (IUnknown *)((char*)GetWindowLong( hwnd, GWL_USERDATA ) + 12);

Кажется, что многие элементы управления имеют одинаковую структуру, сохраненную по адресу, заданному GWL_USERDATA.Может быть, это верно для всех элементов управления Visual Basic или около того?

...