2014-01-27 86 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") 

...它包括庫b。使用下面的代碼:

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

然後,它利用了兩個庫類。兩者有什麼區別?爲什麼當我嘗試使用方法B包含庫A時,它不起作用(這些類不可訪問)?

在此先感謝!

+0

['#pragma comment lib'](http://msdn.microsoft.com/zh-cn/library/7f0aews7.aspx)和['#import'](http://msdn.microsoft.com /en-us/library/8etzzkb6.aspx)由Microsoft記錄。鞏固這兩者只不過是兩次點擊而已。一個將link-this-lib傳遞給鏈接器步驟,另一個將DLL/TLB作爲COM庫導入,如果配置爲使用comuutil模板庫生成智能指針包裝器。 – WhozCraig

回答

2

他們做不同的事情。您使用#import導入類型庫併爲COM對象生成包裝類。類型庫可以是tlb,或者可以封裝在dll(或ocx這是一個具有不同名稱的同一事物)這一事實是令人困惑的。你錯過的唯一的事情是#import只能用於COM。

「正常」#pragma comment(lib, "blah.lib") - 這是替代定義項目屬性中的附加庫 - 用於鏈接到靜態或動態庫,只用於導入lib本身導出的函數和符號。沒有包裝類生成,它與COM無關。

你可以閱讀更多關於#importat MSDN here和更多關於#pragma選項at MSDN here

+0

好吧,這是有道理的。然而,在我的代碼中,項目A DOES封裝了一個類型庫。那麼爲什麼它包含在方法A中呢? – Raiden616

+0

@ user1014679沒有看到項目A的代碼,我只能猜測它也具有傳統的DLL導出函數,對於'DllRegisterServer'等東西它無論如何。 –

+0

當然,briiliant。謝謝 – Raiden616

相關問題