簡體   English   中英

適用於 Android 的 C++ Builder WSDL 客戶端

[英]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);

以下是我發現的有關該功能的一些信息:

  1. u_strFromUTF8 - 將 UTF-8 字符串轉換為 UTF-16 的函數。
  2. UCHAR 是一個 Byte(在 Delphi 中),所以 PUCHAR 是一個指向 Byte 的指針。

我不知道這個函數可能會出什么問題,它顯然只轉換一個字符串。

所以我的問題是為什么該項目可以在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM