Android的c++ Builder WSDL客户端



我有一个令人困惑的问题。我试图使一个网络清洁器使用WSDL。我正在使用c++ RAD Studio 10 Seattle,但在RAD Studio XE8(旧版本)中出现了同样的问题。

1。我创建了一个多设备应用程序,添加了一个编辑组件和一个按钮。

2。我通过将WSDL文件的位置更改为:"http://www.w3schools.com/webservices/tempconvert.asmx?WSDL"并保留所有其他设置为默认值来创建WSDL Importer。

3。在按钮的ButtonClick事件上,我写了两行代码:

 _di_TempConvertSoap Converter = GetTempConvertSoap(true,    
 "http://www.w3schools.com/webservices/tempconvert.asmx?WSDL");
 Edit1->Text = Converter->CelsiusToFahrenheit("32");

在这三步之后,我有了一个单元,它是带有表单和按钮事件的主单元。以及WSDL Importer生成的一个文件"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"中的以下代码行。文件:

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上它抛出分割错误(11)?

我希望我能找到一个解决这个问题的方法。我会继续找的。

谢谢你,

Zdravko Donev:)

更新:

我拆解了这行:

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()在我自己的时候,我创建的形式,它的工作

最新更新