Symbian中gSOAP 學習總結

來源:互聯網
上載者:User
gSOAP的官方網站是:http://gsoap2.sourceforge.net/ 下面只對在symbian環境下使用略說幾點。我下載的是最新版的v2.7.10,下載的壓縮包裡就有一個symbian目錄,裡面是在symbian的例子,可以參考。試著做了一個HelloWorld,訪問web service,按照它的例子步驟如下:1.解開軟體壓縮包。 2.根據wsdl產生程式碼端等H/CPP檔案。在命令列進入gsoap/bin/win32 目錄,先後執行以下指令:wsdl2h -s -o pservice.h  http://192.168.0.201/uim/pservice.asmx?WSDL   //  http地址根據你的介面而定,http://yourwebservice?wsdl---產生wsdl在目前的目錄得到一個pservice.h檔案。  soapcpp2 -CLwx pservice.h在目前的目錄得到多個源檔案,每個檔案的具體作用含義大家可以看官方資料。 3.在Carbide C++中建立一個工程,我就叫它HelloWsTwo,直接用了那個HelloWorld模板架構。然後將步驟2產生的幾個檔案弄過去,首先將soapH.h/soapStub.h/soapPServiceSoapProxy.h拷到工程的inc目錄下,將soapC.cpp/soapClient.cpp拷到工程的src目錄下。4.還有兩個檔案在gsoap目錄下,stdsoap2.h和stdsoap2.cpp,也拷入相應目錄,這裡其實按例子中的readme說明是不拷的,而是在mmp中修改一下指過來,不過,因為我們需要修改這個cpp所以方便起見,還是拷過去吧,省得跟其它工程弄混了。 5.先修改HelloWsTwoUi這個類,在標頭檔中增加如下代碼:#include "soapPServiceSoapProxy.h"   //根據你的介面而命名
     
class CHelloWSTwoAppView;  
class PServiceSoap;   
    
private:  
 
CHelloWSTwoAppView* iAppView;  
 
PServiceSoap * iService;   
   #include "soapPServiceSoapProxy.h"// FORWARD DECLARATIONSclass CHelloWSTwoAppView;
class PServiceSoap; private:CHelloWSTwoAppView* iAppView;PServiceSoap * iService;  然後加一個PServiceSoap類型的成員變數iService。接著修改cpp檔案,在構造時new它,在析構時delete它即可。   // .h. cpp 檔案中的根據你實際的調用而編寫,每個人的介面定義不同,實際情況不同。  如果把自己的部分寫出來卻不符合你工程的實際情況,那就是誤人之弟了。畢竟我也吃過這樣的虧,照搬網路上,白白浪費了2天時間。  6.現在還要修改mmp檔案,carbide是會自動幫你加上幾個源檔案的,接受即可。此外,mmp中更需要增加一個包含目錄include/libc,以及幾個連結庫,如下:SYSTEMINCLUDE /Epoc32/include/libc LIBRARY eexe.lib estlib.lib ecrt0.lib CAPABILITY ReadUserData NetworkServices nostrictdef    // 能力 7.就這麼容易,但是編譯時間,不行,出錯了!報undefined _soap_outLONG64之類的錯誤!!這時開始就折騰了我差不多一天。其實修改也挺簡單的,開啟那個stdsoap2.cpp,我們發現其實這個函數是有的,只是被一個宏WITH_LEAN給關掉了,所以開啟即可。但是開啟宏,錯誤更多了,沒辦法,只能將這個函數定義前的宏注釋掉看看,兩個錯變成三個錯了,硬著頭皮繼續,在stdsoap2.cpp中注掉多個#ifndef WITH_LEAN的條件,終於不再報錯了。 一切運行也就正常了。這個錯誤實在是夠變態的了吧。 總結一下: 1.建議將stdsoap2.*弄到工程裡去,因為改了原始碼應該會與PC平台的應用相衝突,當然假如你並不打算將gSOAP用於symbian以外的場合,可以仍放在gsoap目錄下。 2.用gsoap最大的好處是不用自己去解析那個soap響應,也不用自己去封裝soap請求了。  //該文章是從網路上轉帖而來的,就是根據自己的操作經驗,添加了部分註解,以方便理解少走彎路! 記憶體泄露寫了個GSoap2.7.10的伺服器小程式,代碼很簡單:    RecSoapBindingService svr;
    int m = svr.bind(0, 80, 100);
    if(m<0)
    {
        soap_print_fault(&svr, stderr);
        return 0;
    }
   
    fprintf(stderr, "Socket connection successful: master socket = %d/n", m);
   
    for(;;)
    {
        m = svr.accept();
        if (m < 0)
        {
            soap_print_fault(&svr, stderr);
            exit(-1);
        }
        fprintf(stderr, "Socket connection successful: slave socket = %d/n", m);
        svr.serve();
        //break;
    }    測試發現有記憶體流失問題:壓力測試下看見記憶體一直在漲,但正常退出(通過在迴圈中加break使程式正常結束)時記憶體能夠釋放完全(VC環境中沒有檢測到記憶體流失);Debug與Release版本都是這樣。
    GSoap官方網站上(http://www.cs.fsu.edu/~engelen/soap.html)有一段說明,不知道針對哪個版本:The gSOAP engine uses a memory management method to allocate and deallocate memory. The deallocation is performed with soap_destroy() followed by soap_end(). However, when you compile with -DDEBUG or -DSOAP_MEM_DEBUG then no memory is released until soap_done() is invoked. This ensures that the gSOAP engine can track all malloced data to verify leaks and double frees in debug mode. Use -DSOAP_DEBUG to use the normal debugging facilities without memory debugging. Note that some compilers have DEBUG enabled in the debug configuration, so this behavior should be expected unless you compile in release config.        於是在 svr.serve();後加入代碼:
        soap_destroy(&svr);
        soap_end(&svr);        問題解決——與說明不符的是,沒發現Debug版與Release版的區別。        也可以直接調用svr.run()避免這一堆處理。記憶體泄露出處:http://blog.csdn.net/netnote/archive/2008/11/25/3367741.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.