[英]C++ Builder WSDL client for Android
我有一個令人困惑的問題。 我正在嘗試制作一個使用WSDL
的 Web 客戶端。 我正在使用 C++ RAD Studio 10 Seattle,但在 RAD Studio XE8(舊版本)中也出現了同樣的問題。
1.我創建了一個多設備應用程序,添加了一個編輯組件和一個按鈕。
2.我通過將 WSDL 文件的位置更改為:“ http://www.w3schools.com/webservices/tempconvert.asmx?WSDL ”來創建一個WSDL
導入器,並將所有其他設置保留為默認值。
3.在按鈕的ButtonClick事件上我寫了兩行代碼:
_di_TempConvertSoap Converter = GetTempConvertSoap(true,
"http://www.w3schools.com/webservices/tempconvert.asmx?WSDL");
Edit1->Text = Converter->CelsiusToFahrenheit("32");
所以在這三個步驟之后,我有了一個單元,它是帶有 Form 和按鈕事件的主單元。 以及 WSDL 導入程序生成的一個文件“tempconvert.cpp” 。 它實際上只是將 WSDL 代碼轉換為 C++ 代碼並定義與服務器通信的方法。 就我而言,我有兩種方法: FahrenheitToCelsius()
和CelsiusToFahrenheit()
,在示例中我使用CelsiusToFahrenheit()
。
我將它編譯到 32 位 Windows 平台,運行它,當我單擊按鈕時,結果“89.6”出現在 Edit 組件的文本中。 所以這是按預期工作的。
但是當我將目標平台更改為“Android”並使用帶有Android 4.1.2的手機“Samsung GT-I8262”並運行該項目時,它只是停止並退出。 我調試了這個問題,它在RegTypes()
方法的"tempconvert.cpp"
中的第一個命令處停止。
// ************************************************************************
//
// This routine registers the interfaces and types exposed by the WebService.
// ************************************************************************ //
static void RegTypes()
{
/* TempConvertSoap */
InvRegistry()->RegisterInterface(__delphirtti(TempConvertSoap), L"http://www.w3schools.com/webservices/", L"utf-8");
InvRegistry()->RegisterDefaultSOAPAction(__delphirtti(TempConvertSoap), L"http://www.w3schools.com/webservices/%operationName%");
InvRegistry()->RegisterInvokeOptions(__delphirtti(TempConvertSoap), ioDocument);
/* TempConvertSoap.FahrenheitToCelsius */
InvRegistry()->RegisterMethodInfo(__delphirtti(TempConvertSoap), "FahrenheitToCelsius", "",
"[ReturnName='FahrenheitToCelsiusResult']", IS_OPTN);
/* TempConvertSoap.CelsiusToFahrenheit */
InvRegistry()->RegisterMethodInfo(__delphirtti(TempConvertSoap), "CelsiusToFahrenheit", "",
"[ReturnName='CelsiusToFahrenheitResult']", IS_OPTN);
/* TempConvertHttpPost */
InvRegistry()->RegisterInterface(__delphirtti(TempConvertHttpPost), L"http://www.w3schools.com/webservices/", L"utf-8");
InvRegistry()->RegisterDefaultSOAPAction(__delphirtti(TempConvertHttpPost), L"");
}
#pragma startup RegTypes 32
有人知道為什么會發生這種情況嗎? 我嘗試了另外兩部三星手機,但沒有奏效。 關閉程序的錯誤是“Segmentation fault(11)”,更准確地說,它停在“System.pas”文件中的以下代碼行:
u_strFromUTF8(PUChar(Dest), MaxDestChars, DestLen, MarshaledAString(Source), SourceBytes, ErrorConv);
以下是我發現的有關該功能的一些信息:
我不知道這個函數可能會出什么問題,它顯然只轉換一個字符串。
所以我的問題是為什么該項目可以在 Windows 32 位版本上運行,但在 Android 上它會引發 Segmentation fault(11)?
我希望我能找到解決這個問題的方法。 我會繼續尋找。
謝謝,
茲德拉夫科·多涅夫 :)
更新:
我拆解了這條線:
InvRegistry()->RegisterInterface(__delphirtti(TempConvertSoap), L"http://www.w3schools.com/webservices/", L"utf-16");
要得到 :
TInvokableClassRegistry *Class = InvRegistry();
TTypeInfo *Info = __delphirtti(TempConvertSoap);
UnicodeString Namespace = "http://www.w3schools.com/webservices/";
UnicodeString WSDLEncoding = "utf-8";
Class->RegisterInterface(Info, Namespace, WSDLEncoding);
而且我看到調用InvRegistry()
函數時出現了問題,但由於我無法訪問該函數的源代碼,我仍然沒有發現問題。
我找到了解決方案。
我刪除了該行
#pragma startup RegTypes 32
並在我創建表單時自己調用方法RegTypes()
並且它起作用了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.