介面標頭檔案的格式在嚮導中沒有看到明確的說明性的內容,但通過看開發包中示例程式中標頭檔案定義和通過wsdl生成的標頭檔案的內容,可以發現,標頭檔案中都會出現以下幾行資訊
//gsoap ns service name: calc ****** calculator service
//gsoap ns service style: rpc
//gsoap ns service encoding: encoded
//gsoap ns service namespace:
//gsoap ns service location:
//gsoap ns service method-style: add rpc
//gsoap ns service method-encoding: add
//gsoap ns service method-action: add 「」
這些都是標頭檔案中的說明性資訊,編譯時會用到這裡的資訊,這些資訊有命名空間的和服務名稱的名字,有些資訊為預設引數資訊,如service location 如果在客戶端呼叫介面方法時,沒有輸入服務端位址,方法執行時將自動呼叫此處的位址做為伺服器位址。後三行是對add方法的說明,在寫標頭檔案時可以修改一下這些說明資訊如下:
//gsoap ns service name: calc ****** calculator service
//gsoap ns service style: rpc
//gsoap ns service namespace: urn:calc
//gsoap ns service location:
這些資訊是很重要的,如果是已定義好的介面,一定要注意命名空間名字統一。
下面開始主要工作:介面定義
gsoap對「_」和「__」(下劃線、雙下劃線)有特殊用法,介面定義時函式名前要加上命名空間名和雙下劃線
舉例:加法運算
int add(int num1, int num2, int &num3);
在介面標頭檔案定義時要寫成如下格式
int ns__add(int num1, int nmu2, int &num3);
其中 「ns」是命名空間名稱,此名稱可以自定義成其它名字 但其後」urn:calc」不可隨意更改,這個是要與服務端統一的
「__」是編譯時識別符號,如果沒有的話xml檔案是編譯不出來的
」_」(單下劃線)定義名稱中要慎用,自己定義的變數或函式名稱中使用下劃線的地方要在下劃線後加上」uscore」;
例 定義 ns__add_sum(int num_1, int num2, int &num_3);
要寫成如下形式
ns__add_uscoresum(int num_uscore1, int num2, int &num_uscore3);
」add」是介面函式名 這個是客戶端與伺服器統一的介面名字
函式內引數變數型別和變數名 為客戶端與伺服器統一的介面
函式中只有最後乙個引數是輸出引數,前面的都是輸入引數
若有多個輸出資訊,可定義結構體。
若沒有輸入引數 可將輸入引數型別定義為void *(將忽略void *型別的引數)
函式返回型別必須為 int,可以通過返回值判斷介面函式執**況
至此介面定義要注意的地方完畢,開始寫介面定義檔案。
本例中使用自定義的標頭檔案,編寫客戶端程式,但伺服器仍與上篇中伺服器相同,以便說明兩種方式的結果,介面可以從上篇中由wsdl生成的標頭檔案中獲得。
原始碼如下:
///gsoap ns service name: mycalc
//gsoap ns service style: rpc
//gsoap ns service namespace: urn:calc
//gsoap ns service location:
int ns__add(double a, double b, double &result);
int ns__sub(double a, double b, double &result);
int ns__mul(double a, double b, double &result);
int ns__div(double a, double b, double &result);
int ns__pow(double a, double b, double &result);
/上面檔案中一定要注意 //gsoap ns service namespace: urn:calc 由於伺服器中介面命名空間為calc 故此處必須是calc!
開始編譯此標頭檔案
執行 soapcpp2.exe mycalc.h
編譯成功,寫客戶端程式
新建工程mycalcclient, 新增生成的檔案,新建原始檔mycalcclient.cpp
原始碼如下
const char server = 「「;
int main(int argc, char **argv)
soap_init(&soap);
a = strtod(argv[2], null);
b = strtod(argv[3], null);
switch (*argv[1])
if (soap.error)
else
printf(「result = %g\n」, result);
soap_destroy(&soap);
soap_end(&soap);
soap_done(&soap);
return 0;
}測試一下吧^_^
對比兩種生成介面標頭檔案的方法,選擇那一種還要視情況而定
如果是已有寫好的wsdl文件,當然是選擇用wsdl2h工具來生成標頭檔案了,畢竟這個方便的多,但在編譯時,一定要檢查警告資訊,有些情況下生成的介面頭件存在編譯異常,例如複雜資料結構時就有可能出現結構體命名不符合gsoap命名規則(實際應用中遇至過,此時要手動修改這些命名)
簡單說一下soap結構體初始化及清理
soap_init(&soap);//初始化
…………
soap_destroy(&soap);//結束清理操作
soap_end(&soap);
soap_done(&soap);
嚮導中這方面講的比較細^_^
gSoap使用入門(2) 自定義介面標頭檔案
介面標頭檔案的格式在嚮導中沒有看到明確的說明性的內容,但通過看開發包中示例程式中標頭檔案定義和通過wsdl生成的標頭檔案的內容,可以發現,標頭檔案中都會出現以下幾行資訊 gsoap ns service name calc calculator service gsoap ns service st...
自定義介面
好久沒寫介面了 好像以前也沒怎麼寫過.已經忘記怎麼寫了 就自己動手寫乙個熟悉一下 demo很簡單 就三個類 名字就隨便起了 public inte ce mylistener2 public class a catch interruptedexception e listener.setliste...
介面 顯示自定義視窗
製作自定義視窗類 存在的問題 製作的視窗不能移動 如果要改進,可以參見 無標題視窗的移動 this m pmainwnd new wnd this m pmainwnd showwindow this m ncmdshow this m pmainwnd updatewindow 注意一定要 ret...