2013-01-08 86 views
1

在WindowsRT/Metro中,如何將ref ^指針轉換爲原始指針?如何將ref ^指針轉換爲原始指針?

比如,我想通過傳遞指針的控制,以一個老C風格的回調,其預計參數是void*

// this = type derived from Windows::UI::Xaml::Controls::Page
SetCallback(this);

但是,我得到一個錯誤:

cannot convert parameter 1 from 'MyProject::MainPage ^const ' to 'void *'

如何將MainPage轉換爲原始指針(無C風格/ reinterpret_casts)?

回答

4

A T^可以使用reinterpret_cast(*)轉換成其相應的指針類型T*。最簡單的,正確的代碼將轉換T^Object^然後轉換爲IInspectable*

IInspectable* AsInspectable(Platform::Object^ o) 
{ 
    return reinterpret_cast<IInspectable*>(o); 
} 

IInspectable*可轉換爲void*,雖然你需要牢記的COM一生規則(我不知道你打算用這個void*做什麼,所以我不能在這裏提出任何具體的建議)。

我在我的文章"Types That Wear Hats."中詳細討論了該帽子您可能會發現其中一些信息很有用。


(*)你問的方式做到這一點不reinterpret_cast,但這個限制是沒有意義的:reinterpret_cast是執行此轉換的支持方式。

+0

'reinterpret_cast'的評論是因爲我的印象是'reinterpret_cast'只用於不相關的類型,如果它們不相關,在使用它之前應該考慮三次。我第一次嘗試'static_cast'但顯然不起作用。謝謝。 –

+0

好的,這是有道理的。 :-)在這種情況下,'reinterpret_cast'是正確的答案。 –

+0

請注意,這僅僅支持'T ^'到'T *',如果你將'Canvas ^'重新編譯爲'ICanvas *',你可能會遇到麻煩,你必須先安裝safe_cast/static_cast'Canvas ^'到'ICanvas ^',那麼你可以把'ICanvas ^'重新解釋爲'ICanvas *'。 –