2014-01-27 2 views
0

Я по-прежнему новичок в C++ и пытаюсь разобраться в статических библиотеках и библиотеках DLL. Я только что унаследовал какой-то код и задался вопросом, может ли кто-нибудь дать мне разъяснение.#pragma comment (lib) v #import?

Унаследованный код содержит два библиотечных проекта, назовите их a и b. Существует также основной проект, в котором используются классы из обеих библиотек.

Бит, в котором я смущен, заключается в следующем: и проект a, и проект b при построении выводят .dll в ".. \. \ Executables" и .lib в ".. \ Shared \ Lib" , Stdafx.h основного проекта включает в себя библиотеку в со следующим кодом:

#include ..\projectA\a_class.h 
#pragma comment(lib, "..\\Shared\\Lib\\projectA.lib") 

... и она включает в себя библиотеку, б, используя следующий код:

#import "..\..\Executables\projectB.dll" 

Затем он использует классы из обеих библиотек , Какая разница между двумя? Почему, когда я пытаюсь включить библиотеку A, используя метод B, она не работает (классы недоступны)?

Заранее благодарен!

+0

Оба ['#pragma comment lib'] (http://msdn.microsoft.com/en-us/library/7f0aews7.aspx) и [' # import'] (http://msdn.microsoft.com). /en-us/library/8etzzkb6.aspx) документированы Microsoft. Консолидация этих двух объектов происходит за два клика. Один пропускает ссылку-это-lib на шаг компоновщика, другой импортирует DLL/TLB в виде библиотеки COM, создавая оболочку smart-pointer-wrapper, используя библиотеку шаблонов comuutil, если она настроена для этого. – WhozCraig

ответ

2

Они делают разные вещи. Вы используете #import для импорта библиотеки типов и для создания классов-оболочек для COM-объектов. Тот факт, что библиотека типов может быть tlb или может быть инкапсулирована в dll (или как ocx, который является тем же самым с другим именем), запутан. Единственное, что вы пропустили, это то, что #import имеет отношение только к COM.

«Обычный» #pragma comment(lib, "blah.lib") - это альтернатива определению дополнительных библиотек в свойствах проекта - предназначен для связывания со статической или динамической библиотекой и используется только для импорта функций и символов, экспортируемых самой lib. Никакие классы-оболочки не генерируются, и это не имеет никакого отношения к COM.

Вы можете узнать больше о #importat MSDN here и больше о опции #pragmaat MSDN here.

+0

Хорошо, что имеет смысл. Однако в моем коде проект A DOES инкапсулирует библиотеку типов. Итак, почему он включен в метод A? – Raiden616

+0

@ user1014679 Не видя кода Project A, я могу только догадываться, что он также имеет обычные DLL-экспортированные функции, которые в любом случае будут использоваться для таких вещей, как 'DllRegisterServer' и т. Д. –

+0

Конечно, briiliant. спасибо – Raiden616

Смежные вопросы