在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
一、引用WebService地址 BCB6.0环境下,File-New-Other-WebService-WSDL Importer。然后手动写完整地址。如:“http://192.168.1.3:1234/UpdateService.asmx?WSDL”。一路“下一步”之后,可以发现自动增加了UpdateService.cpp和UpdateService.h两个文件,保存。 UpdateService.h中webservice接口及参数设置如下: __interface INTERFACE_UUID("{650CB923-0260-F472-915C-507FBAE06BF6}") UpdateServiceSoap : public IInvokable { public: virtual AnsiString GetURLAddres() = 0; virtual AnsiString GetTheLastUpdateTime(const AnsiString sDownLoadFiles) = 0; virtual AnsiString GetUpdateFiles(const AnsiString sDownLoadFiles) = 0; }; 二、在程序主窗体中添加THTTPRIO控件 这个控件的作用是 THTTPRIO uses HTTP messages to call remote interfaced objects using SOAP. Use THTTPRIO to generate statically-linked calls to invokable interfaces on a remote Web Service application. 里面有几个属性设置下 从下面一个属性开始 1,WSDLLocation,下拉菜单选中 http://192.168.1.3:1234/UpdateService.asmx?WSDL 2,Service,下拉菜单选中 UpdateService 3,Port,下拉菜单选中,这里有2个选项,一个是WebServiceSoap和WebServiceSoap12,我们选中第一个。(因为BCB6.0还不能很好支持WebServiceSoap12) 三、添加引用 1,添加头文件 在窗体Form1.h文件里 添加UpdateService1.h的头文件。 2,声明 public: // User declarations String sUrl,sPreFileNames; AnsiString sTmpDwnFilesDir; __fastcall TForm1(TComponent* Owner); _di_UpdateServiceSoap FUpdateService; _di_UpdateServiceSoap GetUpdateServiceSoap(); __property _di_UpdateServiceSoap UpdateService1={ read =GetUpdateServiceSoap};
3,在主程序的cpp中添加引用 _di_UpdateServiceSoap TForm1::GetUpdateServiceSoap() { if(!FUpdateService) { HTTPRIO1->QueryInterface(FUpdateService); } return FUpdateService; } 调用webservice方法: sUpdateTime = UpdateService1->GetTheLastUpdateTime(sTmpDwnFilesDir) ;
sPreFileNames = UpdateService1->GetUpdateFiles(sTmpDwnFilesDir);
运行程序后返回的值始终不对,但用c#做的客户端就返回正确,确定是bcb这的问题,经上网搜索,是字符集的问题。包括我们可能会发现只能传数字,不能传中英文的参数,原因很简单,字符集不一致,导致服务器收到了乱码参数,而不是收不到参数。 那么我们需要做3部分工作来完成对字符集的调整。 1,UpdateService1.cpp里, THTTPRIO* rio = new THTTPRIO(0);的后面,加上以下两句话:
// rio->HTTPWebNode->UseUTF8InHeader = true; rio->Converter->Options<<soUTF8InHeader; //
2,还是在UpdateService1.cpp里,
static void RegTypes(){这个函数的最后,我们需要加上下面一段话} InvRegistry()->RegisterInvokeOptions(__interfaceTypeinfo(UpdateServiceSoap), ioDocument); 3,调整THTTPRIO控件的字符集调整 这个控件的属性有两处关于utf8的bool值,请都改成true就可以了。(那2处都很好找,属性名就有utf8字眼) 如上修改后参数能被正确传递,并能正确返回结果值。
|
请发表评论