[C/C++]DLL相關知識
請參考以下連結: http://tw.myblog.yahoo.com/blue-comic/article?mid=-2&prev=556&l=a&fid=17 http://www.wretch.cc/blog/fredxxx123/9249665 http://home.educities.edu.tw/wanker742126/win32asm/w32asm_ch20.html
一些程式設計上的感想、遭遇的問題及解決方式
請參考以下連結: http://tw.myblog.yahoo.com/blue-comic/article?mid=-2&prev=556&l=a&fid=17 http://www.wretch.cc/blog/fredxxx123/9249665 http://home.educities.edu.tw/wanker742126/win32asm/w32asm_ch20.html
記錄一下比較關鍵的問題 這樣以後裝的時候才不用一直去google~ apache: 在安裝過後如果一直無法成功將啟動的話, 到console模式apache安裝資料夾的bin底下,執行: httpd.exe -w -n “Apache2.2” -k start 這樣就會詳細列出錯誤,會比較好debug 當然,”Apache2.2″要看你安裝的版本而改變 這個階段會打不開的原因,大致上都是因為port衝到, 例如skype預設是用80 port,所以要先將他關掉 在正式測試之前,記得到防火牆把80port打開 PHP: 比較大的問題是在安裝之後,在重啟apache的時候會無法打開,用上面的方法來找原因則會出現apache2_2.dll無法載入的訊息。這時候請開啟apache的httpd.conf,找出php相關設定將其改成以下內容: #BEGIN PHP INSTALLER EDITS – REMOVE ONLY ON UNINSTALL PHPIniDir “C:\workspace\PHP” LoadModule php5_module “C:\workspace\PHP\php5apache2_2.dll” #END PHP INSTALLER EDITS – REMOVE ONLY … Continued
我們知道SQL在字串insert的時候需要 ‘ ‘ 在指定在其中是字串型態 可是如果在要insert的字串之中出現該字元,將會導致原本的insert失敗 此時我們可以用以下的function去將該字串脫逸掉 std::string escapeString(const char *pStr) { char *tStr = new char[strlen(pStr)*2+1]; mysql_real_escape_string(conn, tStr, pStr, strlen(pStr)); string retStr(tStr); delete [] tStr; return retStr; } 呼叫時: string es = escapeString(“It’s a te’st~’測’試”); string SQL = “insert into … Continued
有時候在一個function之中如果想要宣告一個以上的暫存變數該怎麼辦? 一個一個命名成不同的變數名稱時又不是非常的直觀, 因為我們只是想暫時使用那個變數而已一堆不同的變數名稱, 反而讓看的人痛苦而且自己也難以管理 此時我們就可以用{ }來指定哪邊到哪邊是該function的local,如下面的code: function foo(){ { int i = 0; cout < < i
MySQL的亂碼問題果然兇惡…(苦笑) 我試著插入下面的文字的結果居然都是亂碼: string SQL = “insert test(t) values(‘測試中文’)”; 在網路上找教學,幾乎每篇都是說在connect之後insert之前輸入以下指令就行了: mysql_query(conn, “SET NAMES ‘utf8′”); 可是我不管怎麼試都還是失敗 後來試著去找原因,發現語系是有分client跟server二種 雖然我的mysql DB(server)全都是用utf8建好的,可是c++中的string在IDE內的文字,只會認識local作業系統的語系(我用繁體中文,所以是big5) 因此必需要對應好我們文件的語系: mysql_query(conn, “SET NAMES ‘big5′”); 可是以上方法只能解決中文問題 但如果我們需要插入的語句中夾雜著中文及日文及多國字時該怎麼辦呢?用上面的方法只會讓中文正確,但日文還是錯的… 如下面的文字: string SQL = “insert test(t) values(‘測試中文與日本語testかなかな’)”; 我想那是我們的編譯器無法判別哪個字元該拿什麼語系來轉才好,所以才會出現日文字都變成???? 這部份我找了好久還是找不到解決方案 先轉wstring之後再用WideCharToMultiByte也轉成特定語系(利用code page) 也是會發生不知道哪個字元是哪國字的情況… 悲哀的是,MySQL的c api不支援wide string,所以這問題看似是無解了!? 如果有路過的人知道該怎麼解決的話,請告訴我一下吧~我會非常感激的 … Continued
會產生這個錯誤的原因,是由於function名稱跟別的library裡宣告的名稱衝到了 例如我想加入boost的file system進來使用: #include "boost/filesystem.hpp" #define BOOST_FILESYSTEM_VERSION 3 結果呼叫system時馬上就產生了這個錯誤。(因為boost的filesystem裡面已經有system這個宣告了 那麼解決方法是什麼? 很簡單,在前面加上一個name space指定就行了,如: std::system("pause"); (因為system的name space是std) ok,這樣錯誤就自動解除了 參考:http://www.boost.org/doc/libs/1_46_0/libs/filesystem/v3/doc/reference.html
#include #define BOOST_FILESYSTEM_VERSION 3 #include “vector” vector getAllFile(string path, string fileType){ vector files; namespace BFS = boost::filesystem; BFS::path p1(path); std::cout < < "Files in "
有時候當程式碼一大,在編譯時就要等很久 這時候如果裡面有錯誤的話更是令人抓狂… Visual Studio又沒有手動停止編譯的功能,這時候該怎麼辦? 其實我們可以插入一個macro來實現這個功能 做法如下: 進到visual studio->Tools->Macros->Macro IDE,然後插入下面的程式碼 Private Sub OutputWindowEvents_OnPaneUpdated(ByVal pPane As OutputWindowPane) Handles OutputWindowEvents.PaneUpdated If Not (pPane.Name = “Build”) Then Exit Sub pPane.TextDocument.Selection.SelectAll() Dim Context As String = pPane.TextDocument.Selection.Text pPane.TextDocument.Selection.EndOfDocument() Dim found As Integer = Context.IndexOf(“: error … Continued
用下面的方法,可以把一個字串多餘的部份拿掉並將其轉成浮點數:(沒去掉後面的1的話會產生run time錯誤) string data = ” abc: 3.40 1 ” boost::trim(data);//把前面跟後面的空白去掉 boost::trim_if(data, boost::is_any_of(“abc: “));//拿掉abc: boost::algorithm::trim_right_if(data, is_any_of(” 1″));//拿掉後面的1 float value = boost::lexical_cast(data); 執行結果:3.4
一直match不成功,原來是我忘了在C++裡面需要二個\\阿…(因為\在C++裡面是脫逸字元,有特殊的意義) 以下記錄一下match日期成功的方式: regex expression(“\\d{4}-\\d{2}-\\d{2}.\\d{2}:\\d{2}:\\d{2}.*”); string tmpStr = “2011-02-24 13:31:37”; cmatch what; if(regex_match(tmpStr.c_str(), what, expression)){ cout < < “match” << endl; std::string msg(what[1].first, what[1].second); std::cout<< msg.c_str() << std::endl; }