我有一个令人困惑的问题。我试图使一个网络清洁器使用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);
下面是我找到的关于这个函数的一些信息:
- u_strFromUTF8 -将UTF-8字符串转换为UTF-16的函数。
- 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()
在我自己的时候,我创建的形式,它的工作