跳到主要內容

發表文章

目前顯示的是 2013的文章

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

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

boost安裝: vs2008[轉載]

boost安裝: vs2008 [轉載] boost是C++的准標準庫,不學是要吃虧的!在這裡記錄下boost在VS2008上的編譯及配置方法,以前編譯過很多次了,到現在還是需要查資料,在這裡記錄下。。。 下載boost後解壓,然後進入boost文件夾下的tools\build\v2,根本不需要做什麼什麼修改,直接雙擊運行bootstrap.bat就可以獲得bjam.exe,然後將bjam.exe拷貝到上兩級文件夾中,即boost根目錄下,然後啟動windows的cmd進入boost的根目錄,運行如下指令 bjam.exe --toolset=msvc-9.0 --link=static --runtime-link=shared --threading=multi --without-python stage debug release 這樣就可以編譯出靜態庫的boost,既然boost是准標準庫,就跟stl一樣對待吧! 將boost/stage/libs下的所有lib文件都拷貝到vs2008的VC目錄下的libs中,然後將boost根目錄下的boost的文件夾拷貝到VC下的inlcude中,這樣就可以跟STL一樣使用boost了,並且不需要在運行時手動的指定鏈接庫。 這裡舉個例子,創建windows控制台應用程序工程,然後添加如下代碼 #include #include void func() {  std::cout << "Boost Thread Test!" << std::endl; } int main(int argc,char ** argv) {  boost::thread thread(&func);  thread.join(); } 如果編譯上述代碼沒有錯誤,那麼說明boost已經配置成功了。