跳到主要內容

c++(/clr)非託管類型和託管類型互轉

c++(/clr)非託管類型和託管類型互轉


轉載於: http://www.cnblogs.com/kekec/archive/2011/03/25.html

以下代碼必須有「Common Language Runtime Support(/clr)」 和「MFC」支持

1. 字符竄之間的轉換
1 // 託管類型到非託管類型
2 inline CString ManageToUnManageStr(System::String^ cmStr)
3 {
4 using namespace System::Runtime::InteropServices;
5 CString cStr = (char*)(Marshal::StringToHGlobalAnsi(cmStr)).ToPointer();
6 return cStr;
7 }
8
9 // 非託管類型到託管類型
10 inline System::String^ UnManageToManageStr(const CString& cStr)
11 {
12 const char* cc = (LPCTSTR)cStr;
13 System::String^ cmStr = gcnew System::String(cc);
14 return cmStr;
15 }
2. 對象之間的轉換
1 // _variant_t到Object對象
2 inline System::Object^ VarToObject(_variant_t var)
3 {
4 using namespace System::Runtime::InteropServices;
5 System::IntPtr^ pvar = gcnew System::IntPtr(&var);
6 System::Object^ obj = Marshal::GetObjectForNativeVariant(*pvar);
7 return obj;
8 }
9
10 // Object對象到_variant_t
11 inline _variant_t* ObjectToVar(System::Object^ obj)
12 {
13 using namespace System::Runtime::InteropServices;
14 _variant_t* vt = new _variant_t();
15 System::IntPtr^ pvar = (gcnew System::IntPtr((void*)vt));
16 Marshal::GetNativeVariantForObject(obj,*pvar);
17 return vt;
18 }
更多:請參考.net庫 System.Runtime.InteropServices 命名空間下的類,特別是 Marshal 類。

留言

這個網誌中的熱門文章

C 和 C++ 的 Callback

C Callback Function with C++ Class 轉載於: http://lak4cyut.blogspot.tw/2008/08/c-callback-function-with-class.html 由於 C/C++ 語言的特性,許多 API 是必需要利用 Callback function 才能完成作用 在 C 的時代這是很合理也很直覺化的設計,但若將場景拉到 C++ 呢.... --此篇除了介紹 How 之外,也將對 Why 進行簡單的介紹,希望能夠令不知其所以然的人有所幫助。-- Effective C++m 一書將 C++ 視為一種語言聯邦,而其中最簡單及常被討論到的,我想大概是屬於 OOP 的部份。 在 C++ 中利用 Class 來實現 OO 的許多精神,許多的程式設計都會採用 OO 的封裝特性,也因此當你需要使用某些 API 時,會面臨到 callback function 設計不易的問題。包括如何取用物件內的屬性、如何將物件傳入等問題,假設利用 non-member function 來設計 callback function,為了能令 callback function 順利的存取相關的物件內的資料,可能會在某種程度上破壞掉物件的封裝性。 因此,若以封裝性的角度來看,我們當然會希望能夠直覺的以 class member function 來做為 callback function,如此一來,便可以在不破壞封裝性的情況下,依然順利的使用物件內的屬性。 在這個前提下,便會很直覺的寫出以下的程式段: class CMyClass { public: void Mainfunc() ; void CBfunc(void *) ; private: int iData ; int iInc ; } int CMyClass::CBfunc(void *iIncLoc) { int _i = (int)iIncLoc ; return iData+_i ; } void CMyClass::Mainfunc() { // APIfunc( *pCallback, *pParam) <-- br=""> APIfunc(CBfunc, i

難捨

每次星期天要和你道別的時候,心中總是有很多不捨。 只能告訴自己,很快的又能見面了。 在擁擠的火車上,思念還是停留在妳的身上。 那時深深的覺得,有一個能夠去呵護而值得愛的人,是一種幸福。

.NET操作EXCEL時出現的錯誤

  在免部署 Office PIAs (Primary Interop Assemblies) 的情況下存取 Office 物件模型 (以下轉載) Microsoft::Office::Interop::Excel::ApplicationClass ^app  = gcnew Microsoft::Office::Interop::Excel::ApplicationClass(); Microsoft::Office::Interop::Excel::WorkbookClass ^wrk = app->Workbooks->Add() ASP.NET操作EXCEL時出現的錯誤 Retrieving the COM class factory for component with CLSID(轉) 解決方案: 運行dcomcnfg打開組件服務 依次展開"組件服務"->"計算機"->"我的電腦"->"DCOM配置" 找到"Microsoft Excel應用程序" 右鍵打開屬性對話框,點擊"標識"選項卡 點"下列用戶",把管理員的用戶密碼正確填寫進去... 點擊"安全"選項卡, 依次把"啟動和激活權限","訪問權限","配置權限",都選擇為自定義, 然後依次點擊它們的編輯,把everyone添加進去,並加入所有的權限... OK,解決此問題! MMC是以x64來執行的,它會排除掉x32的DCOM伺服器,如下,看不到Microsoft Excel Application 解決方式也很容易,就是要以x32方式執行MMC已開啟元件服務,我們知道元件服務是"comexp.msc"這個描述檔後, 只要在開始工具列-->執行 如下命令: mmc comexp.msc /32