Углубим чуток (отметив правильность уже сказанного)
Интерфейс - это число

Размером ровно 4 байта. Указатель это. Самый обыкновенный.
Указывает он на одномерный массивчик. Каждый элемент массивчика - это тоже указатель!

Но уже на конкретный метод интефейса.
Когда мы осуществляем "вызов метода интерфейса", на деле происходит следующее. Комп дереференсит интерфейс, прибавляя при этом к нему ((номер вызываемого метода - 1)*4). Туда управление и передаётся. Как комп узнаёт, какой номер у вызываемого метода? Из описания, в type library, к примеру. Всё это называется ранним связыванием.
При позднем связывании всё несколько интереснее. Сначала происходит обращение к IUnknown объекта (IUnknown всегда идёт первым, так что QueryInterface всегда имеет нулевой оффсет в табличке, и комп знает это). Через QueryInterface делается запрос на интерфейс IDispatch. Через IDispatch (который тоже стандартен, и потому VB с ним тоже умеет работать) происходит вызов метода Invoke. CallByName - как раз обёртка для этого процесса
Если интерфейс разрешает как раннее, так и позднее связывание, он имеет статус dual.
На всём этом зиждется технология COM.
Использовать это можно и нужно. Но напрямую из VB нельзя юзать интерфейсы, не поддерживающие IDispatch (хотя при наличии tlb, по идее, можно). Не напрямую - можно

Относительно корявый метод я описал в маленькой статейке

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас