热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在VC中调用WebService(非托管)

作者:eRay Jiang下载源代码一、使用Visual Studio.NET调用WebService   很多次看到网友讨论VC中调用WebService的问题,其实在V
作者:
eRay Jiang
下载源代码



一、使用Visual Studio.NET调用WebService

  很多次看到网友讨论VC中调用WebService的问题,其实在Visual Studio.Net(下称VS.NET)及其以后的版本中调用WebService已经变得相当简单。你所要做的只是“找到 WebService的发布地址”,然后将其引用添加到VC项目中即可。接下来VS.NET帮你生成的代理类,会帮你搞定一大堆的麻烦事,包括:网络调用、数据传递等等;什么SOAP啊、网络啊,你都可以不管。
 

二、托管还是非托管?

  对于VS.NET生成的C++代理类,很多人都认为必须使用托管代码,其实事实并非这样。VS.NET可以生成托管和非托管两个版本的代理类,至于要不要使用托管,那是你自己的选择。
  具体地说,对于使用托管的程序,VS.NET会生成基于托管类库的代理类;你可以在生成的代码中找到类的行:public System::Web::Services::Protocols::SoapHttpClientProtocol。对于不使用托管的程序,VS.NET会生成基于ATL的代码;你可以在生成的代码中找到类似的行:template >。
我想,如果不是确实需要的话,大部份人会选择非托管的方式,因为这起码可以让我们的程序脱离.Net Framework运行。
 

三、动态设置WebService调用地址

  这也是网上讨论得比较多的一个问题,因为WebSercie的地址不可能一成不变,特别是在开发调试的时候。幸运的是,在两种版本的代理类中,都可以非常方便地在运行时设置WebService的地址。(具体做法参见实例)

四、程序示例(非托管)

  由于已经有文章详细讲述了 VC托管程序中调用 WebService 的过程,因此以下示例只描述非托管VC程中调用WebService的方法。

1、新建一个非托管的MFC应用程序,注意是非托管的,如下图(图1)


图1、建立非托管程序

完成后,查看VC项目属性,可以确认不使用托管


图2、查看是否使用托管

2、添加WebService引用
在VC项目名称上,单击右键,选择“添加Web引用”。如下图(图3):


图3、添加Web引用

在弹出的“添加Web引用”对话框中,填入WebSercie的引用地址, 然后点击“转到按钮”,可以看到WebService的提示页面。


图4、“添加Web引用”对话框

  点击页面上的“Service Description” 链接可以看到具体的WebMethod的声明。我的这个WebService示例中,只定义了一个Web方法。该方法接受一个字符串作为用户名,并返回一个字符串作为对用户的问候语。如下图所示:


图5、查看WebMethod原型

  在上图中填入“Web引用名”,然后点击“添加引用按钮”。(在非托管版的代理类中,这里填的“Web引用名”将没有任保实质性的作用,所以随便填入一个名字即可。但是在托管版的代理类中,“Web引用名”将成为代量类的命名空间) 。接下来,VS.NET将生成一个WebService的代理类,生成完后,会自动打开WebService.h头文件:

WebService.h并不是代理类,这个头文件其实是用于包含所有的代理类的头文件,你可以多添加几个“Web引用”试试。

3、浏览代理类

  我们不妨浏览一下生成的代理类,做到有个基本的了解。切换到“类视图”,可以看到一个“Debug”命名空间,全部展开,可以看到生成的代理类的全部成员:


图6、浏览生成的代码

4、调用示例

首先包含头文件,并打开命名空间

#include "WebService.h"
using namespace Debug; // 这个命名空间是自动生成的,与Web服务的实现有关 以下是调用代码

void CInvokeDemoDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
// 因为生成的代码是基于ATL的,所以要初始化COM
CoInitialize(NULL);
HRESULT hr = S_OK;
CComBSTR hiResult;
CComBSTR username = "vckBase";
CDebug* debug = new CDebug; // 代理对象
// 可以调用SetUrl动态设置Web服务地址
// debug->SetUrl("http://blog.eray.cn/debug.asmx");
hr = debug->Hi(username,&hiResult); //注意,返回值是以指针形式反回的
if(FAILED(hr))
{
MessageBox("调用失败");
}
else
{
CString str(hiResult);
MessageBox(str,"调用结果");
}
delete debug;
CoUninitialize();
}   由于生成的代理类是基于ATL的,所以在调用前要初始化COM调用。在上述的代码中就使用了CComBSTR而没有直接使用BSTR,因为CComBSTR属于智能类型,可以自己管理内存分配,比较方便。 上述代码中有一行被注释的代码调用了SetUrl来设置WebService的调用地址。在实际的项目中,可以将这个地址写在配置文件中。



5、运行结果



来,看一下吧~

五、结束语

  通过以上示例可以看出,其实在VS.NET中实现非托管的C++调用WebService是相当简单的。当然,在实际的使用过程中,为了程序的徤壮,还需要更多的代码逻辑,比如错误处理等等。


推荐阅读
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Windows7 64位系统安装PLSQL Developer的步骤和注意事项
    本文介绍了在Windows7 64位系统上安装PLSQL Developer的步骤和注意事项。首先下载并安装PLSQL Developer,注意不要安装在默认目录下。然后下载Windows 32位的oracle instant client,并解压到指定路径。最后,按照自己的喜好对解压后的文件进行命名和压缩。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
author-avatar
艳红双唇l丶乱了他神
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有