近期接手一部分C++研發工作,同時與.NET開發小組進行軟件功能協作,於是需要調用.NET WebService服務,已完成數據的網絡通訊業務功能;結束之余,將手頭碰到的問題總結羅列如下:
- C++如何調用.NET WebService服務。
- 如何進一步靈活設定WS服務的地址。
- ATLSOAP: CSoapRootHandler::InitializeSOAP -- failed to get SAXXMLReader調用錯誤問題。
1、C++如何調用.NET WebService服務
在.NET中使用WS服務時,引用該服務,然后實例化服務對象、直接調用對象成員方法,操作使用還是較方便的;而在C++中則需要費點周折,需要結合使用ATL Server及發布的WS服務地址。
(1)、在Visual Studio 2008以及以后版本中,微軟停止了非托管C++的直接WebService引用。不過ATL Server代碼已經托管到開源網站上,我們可以找到ATL Server的源代碼(http://atlserver.codeplex.com/),下載該源碼包,之后用回到包中的include目錄的所有文件。
(2)、獲取發布后的WS服務地址,然后在VS2005中,隨意建立一個WIN32應用程序項目,點擊項目右鍵,選擇Add Web Reference,輸入WS服務地址完成添加;之后VS會在項目中生成針對該WS服務的頭文件WebReference.h(頭文件中包含了一個CWebService類)。
(3)、最后,在C++項目代碼中,添加ATL Server所有頭文件與引用atlsoap.h、及編譯引用的WebReference.h頭文件,使用其中CWebService類,實例化對象及調用其成員方法。
2、如何進一步靈活設定WS服務地址
WS服務的地址,可能每次的發布,其地址是不同的,而我們剛編譯引用的WebReference.h頭文件,其類的構造方法中已經固定了地址,如
CWebServiceT(ISAXXMLReader *pReader = NULL) : TClient(_T("http://192.168.1.181:8033/asmx/WebService.asmx"))
那么,這就需要定義和改變其入口參數CWebServiceT(ISAXXMLReader *pReader = NULL) : TClient(strWebService)。
3、ATLSOAP: CSoapRootHandler::InitializeSOAP -- failed to get SAXXMLReader錯誤問題
在調用時,HRESULT hr = pService->UpdateData(),可能會返回失敗,調試會發現該錯誤;那么可以嘗試在調用前后加入以下方法代碼的調用:
::CoInitialize(NULL);
pService->SetProxy();
// Do your stuff
pService->Uninitialize();
::CoUninitialize();
