Модератор: Brickgroup
Это абсолютный must have для оптимизации алгоритмов.arthur2 писал(а):AntonariyА что это? Поиском не ищетсянужно использовать VB Watch2.
Вот как я понял: функции, объявленные через tlb, загружаются ещё до выполнения какого-либо моего кода, а значит ловить ошибку бесполезно. Это-таки подводный камень.
То есть, когда я хочу чего-нибудь от библиотеки, которая неизвестно, есть ли у пользовотеля, нужно её Declare, чтобы в случае чего поймать ошибку.
А если и я продикларировал, и в тлб есть - откуда будет браться функция?
А если и я продикларировал, и в тлб есть - откуда будет браться функция?
Не важно, продекларирвао ты, объявил в тлб или что-то ещё: в VB действует общий принцип для выбора того, какая сущность будет использована.
Это я почему спросил: если я ни разу не использовал функцию из тлб, она ведь в ехе не попадёт?
А вдруг в тлб есть функция, которую я хотел бы использовать, но опасаюсь, что у пользователя может не оказаться библы.
Смогу ли я объявить её как-то через Declare,
чтобы в экзешник она попала в этом варианте, а не из тлб?
К примеру, хочу прозрачных окон, но не хочу, чтобы в вин98 прога дохла.Что значит "может не оказаться библы"?
Растолку мне понятия "попала в экзешник". Тогда смогу ответить.
Функция не попадает в таблицу импорта, если ни разу нигде не используется. Библиотека так же не попадает в таблицу импорта, если ни одна из её экспортируемых функций не импортируется.
Окей, пробую плясать от этого абзаца. Если функция объявлена declare, она в таблицу импорта не попадает? Вроде, да.
Если функция есть в тлб, но ни разу не используется, она в таблицу импорта не попадает? Вроде, да.
Допустим, хочу использовать функцию, которая уже есть в тлб, но не хочу, чтобы она попала в таблицу импорта. Поможет ли её деклорация с каким-нибудь отличным от оригинала Alias?
Оба два.Не понял чего именно ты хочешь. Работать с функций нормально, но так, чтобы её не было в таблице импорта, или же тебе просто надо обойти проблемную ситуацию, поюзать Declare-функцию, но так, чтобы VB не принял её за одноимённую функцию в TLB?
То есть, вместе с именем модуля, на сколько я понял?А указывается это полным именем функции
То есть, вместе с именем модуля, на сколько я понял?
в С++ нет возможности языковыми средствами импортировать функцию
а С++ не поддерживает TLB-шки.
В C++ на уровне языка импортится LoadLibrary с GetProcAddress, после чего производитс легальный там вызов по указателю.
TLB-шки прекрасно цепляются и импортируются из Visual C++. Не стоит утверждать так категорично.
Где?
Как это делается? Нужно в VC++ 2005 объявить объект, интерфейс которого описан в tlb.keks-n писал(а):TLB-шки прекрасно цепляются и импортируются из Visual C++. Не стоит утверждать так категорично.
Соответствующей - какой? Той, которая меня интересует (DocViewProt)? Где это писать? Пример там приведен на основе похоже шестой студии, 2005я не генерит *.tli и *.tlh.После подключения соответствующей библиотеки типов с помощью директивы #import будут созданы два файла, которые генерируются в выходном каталоге проекта. Это файл sampl.tlh, содержащий описание классов, и файл sampl.tli, который содержит реализацию членнов классов. Эти файлы будут включены в проект автоматически.
#import "DocView.tlb" no_namespace //в cpp-модуле, где нужно этот объект объявить
IDocView *dv;
HRESULT r = CoGetObject(L"DocView.Application",NULL,IDocView,(void**)&dv);
error C2275: 'IDocView' : illegal use of this type as an expression
IID iid;
IDocView *dv;
HRESULT r = CLSIDFromString(L"{7ADCD0B1-C50E-4A50-80E0-4397F6E5FE7C}", &iid);
r = CoGetObject(L"DocView.Application",NULL,iid,(void**)&dv);
_ASSERTE(S_OK != r);
dv->Test();
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13