簡體   English   中英

對於具有基於ATL的庫的Windows應用商店,認證失敗

[英]Certification fails for Windows Store App with ATL-based library

我有一個用C ++開發的Windows庫,它使用ATL集合,ATL CString和與CComPtr的COM接口。 我從庫中刪除了所有非winrt允許的API調用,並且構建正常,所以我將庫包裝在C ++ / CX ref-class中,我試圖從Windows應用商店應用程序中使用它。 應用程序運行正常,但Win-Store App認證失敗,並出現以下錯誤:

發現錯誤:支持的API測試檢測到以下錯誤:此應用程序類型不支持kernel32.dll中的API GetModuleHandleW。 MyLibrary.dll調用此API。 此應用程序類型不支持kernel32.dll中的API InitializeCriticalSectionAndSpinCount。 MyLibrary.dll調用此API。

我的庫的VS項目是為Windows應用商店配置的,具有以下設置:

在此輸入圖像描述

這些設置按預期激活/停用SDK中所需的宏(例如,WINAPI_FAMILY為WINAPI_FAMILY_APP)。

我100%確定我沒有直接在我的庫中調用GetModuleHandleW或InitializeCriticalSectionAndSpinCount,所以我認為這個問題必須來自某個ATL類的方法,該方法未在Windows 8 SDK中正確過濾。

潛入ATL頭文件並不是很有用,因為所有東西看起來都在那里正確過濾,例如從ATL :: CComCriticalSection :: Init看到這個片段

#if !defined(_ATL_USE_WINAPI_FAMILY_DESKTOP_APP) || defined(_ATL_STATIC_LIB_IMPL)
        if (!_AtlInitializeCriticalSectionEx(&m_sec, 0, 0))
#else
        if (!InitializeCriticalSectionAndSpinCount(&m_sec, 0))
#endif

為了證明我的理論,我使用了一個十六進制編輯器並從我的Kernel32.lib文件中編輯了GetModuleHandleW,這給了我以下鏈接錯誤:

atls.lib(atlwinverapi.obj):錯誤LNK2001:未解析的外部符號__imp__GetModuleHandleW @ 4

所以看來我的理論沒有錯。 請注意,我正在使用發布版本執行所有這些操作,因為調試版本未通過認證。

現在的問題是:

除了查看頭文件之外,有什么辦法可以讓我確切地知道ATL中哪個類正在破壞我的庫?

MSDN論壇中的相同問題

在微軟連接上添加了一個錯誤報告,其中包含一個重現此問題的小示例代碼。

這是我猜的。 查看文件atlwinverapi.h。 在那里,宏_ATL_NTDDI_MIN有條件地為x86 / x64定義了一種方式,而另一種方式定義為ARM。

我認為在最近添加XP支持的VSUpdate期間可能會發生這種變化。 現在在文件atlwinverapi.cpp(我想進入atls.lib),在_AtlInitializeCriticalSectionEx方法中,如果_ATL_NTDDI_MIN <NTDDI_VISTA,你會注意到它正在調用InitializeCriticalSectionAndSpinCount。

我假設您正在構建x86或x64,這就是您遇到此問題的原因。 如果為ARM構建,則不會看到此問題。

當然,您將無法在ARM上運行WACK,但您可以在二進制文件上運行dumpbin / imports,看看它是否仍然使用這些不兼容的API。

希望這個鏈接可以幫到你。 它來自MSDN。 http://ecn.channel9.msdn.com/events/Win8CppEvent/PortingToMetro.pptx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM