2008/02/08

WTL with Visual Studio 2008 Express

最近在寫WAnts 的更新,使用 ie 透過 ActiveX,用wxWidgets 實在是不方便,有許多的錯誤,例如在IE7下抓取iFrame不知道為什麼一直錯誤,所以就想來裝裝看另一款有名的「WTL」。

在WTL安裝之前,請先安裝 PlamtForm SDK。我安裝的版本是「Microsoft Platform SDK for Windows Server 2003 SP1」

  • WTL目前的版本是 8.0,在下載安裝之後,並沒有內附 2008Express 的安裝,於是修改 "\WTL80\AppWiz\setup80x.js"的檔案,編輯內容把8的字串都改為9,再另存為 "setup90x.js" ,點擊執行就可以安裝到 2008 Express 上了。
  • 接下來修改 PlamFormSDK的檔案,在路徑"Microsoft Platform SDK\Include\atl\atlbase.h",在288行的位置,修改如下

#pragma pack(pop)

/*
PVOID __stdcall __AllocStdCallThunk(VOID);
VOID  __stdcall __FreeStdCallThunk(PVOID);

#define AllocStdCallThunk() __AllocStdCallThunk()
#define FreeStdCallThunk(p) __FreeStdCallThunk(p)

#pragma comment(lib, "atlthunk.lib")
*/
#define AllocStdCallThunk() HeapAlloc(GetProcessHeap(),0,sizeof(_stdcallthunk))
#define FreeStdCallThunk(p) HeapFree(GetProcessHeap(), 0, p)

#elif defined (_M_AMD64)
#pragma pack(push,2)

以上,也可以增加專案中的stdafx.h 修改如下:(由TabBrowser中 支援 2005 Express 參考)

//#ifdef _VC80X
  // Support for VS2005 Express & SDK ATL
  #define _CRT_SECURE_NO_DEPRECATE
  #pragma conform(forScope, off)
  #pragma comment(linker, "/NODEFAULTLIB:atlthunk.lib")
  #pragma warning(disable: 4565) // redefinition; the symbol was previously declared with __declspec(noalias)
  #pragma warning(disable: 4068) // unknown pragma
//#endif // _VC80X

#include <atlbase.h>

//#ifdef _VC80X
  // Support for VS2005 Express & SDK ATL
  namespace ATL
  {
    inline void * __stdcall __AllocStdCallThunk()
    {
        return ::HeapAlloc(::GetProcessHeap(), 0, sizeof(_stdcallthunk));
    }

    inline void __stdcall __FreeStdCallThunk(void *p)
    {
        ::HeapFree(::GetProcessHeap(), 0, p);
    }
  };
//#endif // _VC80X

  • "Microsoft Platform SDK\Include\atl\atlwin.h",在1753行的位置

for(int i = 0; i < m_aChainEntry.GetSize(); i++)

  • "WTL80\AppWiz\Files\Templates\1033\root.rc",在507的位置

[!if WTL_COM_SERVER]
1 TYPELIB "[!output PROJECT_NAME].tlb"
[!endif]
[!if WTL_USE_MANIFEST]
//CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "res\\[!output PROJECT_NAME].exe.manifest"
[!endif]

  • 如果在編譯Sample時出現以下錯誤

CVTRES : fatal error CVT1100: duplicate resource. type:MANIFEST, name:1, language:0x0409

LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt.

就尋找專案中的 ".rc" 檔案,並注解掉
//CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST

 

以上,就是編譯WTL Sample 中遇到的問題,解決的方式。

 

沒有留言: