2011-12-21 64 views
7

我們有一個已經存在了很長時間(也許早於Visual Studio 6)的DLL項目,它已經針對VS的每個新版本進行了更新。該項目包含使用ATL實現的多個COM類。如何在舊的ATL DLL項目中添加一個「ATL簡單對象」升級到VS 2010?

升級到VS 2010後,該項目仍然沒有問題。但是,如果我嘗試用鼠標右鍵單擊該項目並選擇添加 - >類... - >ATL簡單對象,我得到一個錯誤框,這樣說:

ATL類可以只能添加到MFC EXE和MFC常規DLL項目或具有完整ATL支持的項目。

這在VS 2008年工作

當我看到項目屬性,使用MFC均設爲使用標準Windows庫使用ATL均設爲不使用ATL。我將它們更改爲分別在共享DLL中使用MFC動態鏈接到ATL,但仍然得到相同的錯誤。

我知道如何在不使用嚮導的情況下添加新的ATL對象,並且我可以嘗試使用VS 2010重新創建該項目以使其更加開心。但是有沒有人知道有什麼簡單的方法讓VS能夠讓我使用一個項目,它不承認它是一個「完全支持ATL」項目的嚮導?

回答

9

檢查this thread out

看來,添加此片段信息您的ATL C++代碼使它工作。您無需實際構建項目,只需在完成嚮導後將其移除即可(假設該解決方案適用於您)。

// Added fake code begins here 

class CAppModule : 
    public CComModule 
{ 
}; 

// Added fake code ends here, below is regular ATL project stuff 

CAppModule _Module; 

這是一切的來源,在$(VisualStudio)\VC\VCWizards\1033\common.js

/****************************************************************************** 
Description: Returns a boolean indicating whether project is ATL-based. 
oProj: Project object 
******************************************************************************/ 
function IsATLProject(oProj) 
{ 
    try 
    { 
     var oCM = oProj.CodeModel; 
     oCM.Synchronize(); 
     // look for global variable derived from CAtlModuleT 
     var oVariables = oCM.Variables; 
     for (var nCntr = 1; nCntr <= oVariables.Count; nCntr++) 
     { 
      var oVariable = oVariables(nCntr); 
      var strTypeString = oVariable.TypeString; 
      if (strTypeString == "ATL::CComModule" || strTypeString == "ATL::CAutoThreadModule") 
      { 
       return true; 
      } 
+0

確實,添加該代碼使一切正常。謝謝! –

+0

我後來想到編輯'功能IsATLProject(oProj){return true; }'更加可靠,但需要一個人去搜索那個嚮導腳本......第一個技巧就是使用項目源代碼。 –

+0

FWIW,我能夠將所需的代碼削減到一行:「class CDummyModule:public CComModule {} DummyModule;」這也可以防止由於現有_Module定義而導致的任何錯誤。並且確保在構建項目之前將其刪除或註釋掉,以防止由於擁有多個CComModule派生對象而導致的問題。 –

3

同樣的問題在這裏,但項目源已有的CComModule _Module; 修復它,基於IsATLProject腳本shown above,通過將其更改爲 **ATL::**CComModule _Module;