2011-08-16 36 views
-1

我想使用預定義的函數,但不斷得到一個AccessViolationException。我也使用com對象。我調用函數put_ClassName(BSTR obj),但不斷收到異常。AccessViolationException當調用函數put_ClassName

這可能是一個愚蠢的錯誤,但這裏是一個示例:

IUIAutomationProxyFactory* factory; 
IUIAutomationProxyFactoryEntry* entry; 
IUIAutomationProxyFactoryMapping* pMap; 
LPCWSTR className = L"CustomUIAutomationCPP"; 
BSTR name; 

CoInitialize(NULL); 
HRESULT hr = CoCreateInstance(CLSID_CUIAutomation, NULL, CLSCTX_ALL, IID_IUIAutomation, (void**)&pAutomation); 
(*pAutomation).get_ProxyFactoryMapping(&pMap); 
factory = new CustomProxyFactory(); 
(*pAutomation).CreateProxyFactoryEntry(factory, &entry); 

name = SysAllocString(className); 
(*entry).put_ClassName(className); 

我不知道爲什麼我收到這個錯誤。任何幫助深表感謝。

編輯1

看來我不是上述呼籲得到映射到代理表:

(*pAutomation).get_ProxyFactoryMapping(&pMap); 

誰能告訴我,如果有另一種方式來獲得表映射?

回答

0

你還沒有分配任何東西進入,現在它只是一個未初始化的指針。

+0

我編輯了上面的代碼以顯示我如何到達那一點。我相信CreateProxyFactoryEntry(...)實例化變量。 –

+0

您是否在調試器/通過日誌中檢查過它是否真的被分配了?你可以顯示CreateProxyFactoryEntry的代碼嗎? – elevener

+0

我已經檢查過調試器,並且條目似乎被分配給一個com對象(IUnknown)。該函數來自IUIAutomationProxyFactory :: CreateProxyFactoryEntry –

0

正如我想的那樣,我使用的clsid存在一個愚蠢的錯誤,現在我可以在代理表中創建一個條目。

在這一點上,我想知道什麼時候我想實例化我的服務器端提供程序和我的客戶端提供程序。此外,無論它們是否應該在程序的整個生命週期中存在,因爲我想從我的自定義模式中捕獲事件。還有一件事,如何將我的自定義模式添加到自動化元素,以便元素可以從我的自定義模式中拋出我的事件。