VC6开发Web Services 客户端

本文引用:
1.使用Visual C++开发SOAP客户端应用
2.http://www.cnblogs.com/babyblue/archive/2004/04/02/5030.aspx
3.关于 Unicode 和字符集的最基础的知识
4.ASP.net中的Server.UrlEncode函数和ASP中的Server.URLEncode函数返回的值竟然不一样

不同的WebService需要更改的地方:
1.请求的URL:
Connector->Property["EndPointURL"] = "
http://localhost/Test/Test.asmx"; 
2.请求的SoapAction(访问C#写的
http://localhost/Test/Test.asmx时它会告诉你SoapAction是什么)
Connector->Property["SoapAction"] = "
http://tempuri.org/HelloWorld";
3.所请求的方法名及其所需要的参数
   Serializer->StartElement("HelloWorld","
http://tempuri.org","","");
   Serializer->EndElement();

注意红色的地方一定要写得一模一样,否则该方法的参数传进去时会变成NULL
总结一下必要的关键步骤(使用SOAP ToolKit3.0)
1.导入类型库
2.需要创建一个SoapConnector
3.下一步创建SoapSerializer
4.下一步把消息附加到SoapConnector的输入流
5.下一步读取结果.要读取服务器的回复,客户端应用需要使用SoapReader,
6.SoapReader被连接到SoapConnector输出流
7.用IXMLDOMElement对象可以从SoapReader里读到服务器的回复


英文原文
http://www.codeguru.com/Cpp/COM-Tech/complus/soap/article.php/c3945/

如何发送中文?

发送中文的话还需要进行编码转换,在机器中通常是DBCS双字节字符集,要将它转成Unicode,然后再转成UTF-8才能发送。同理,接收时收到的是UTF-8,要将其还原成Unicode,再变成DBCS。

关于中文字符的编码可以参考:关于 Unicode 和字符集的最基础的知识

简单地说,
DBCS:采用GBK/GB2312编码,有代码页(GB2312是936),英文字符一个字节,代码页中的字符两个字节。
UTF-16(UCS2):用两个字节表示一个中文字或一个英文字,所有的东西都是两个字节的。
UTF-32(UCS4):同上,只不过用4个固定的字节表示一个中文字或英文字。
UTF-8:用1-6个字节表示一个Unicode编码,比较复杂:开始有几个1就表示该Unicode编码由几个字节组成,如:10……表示由1个字节组成;110……由两个字节组成。后续的每个字节都是10xx xxxx。
UTF-7:另一种Unicode编码,我暂时未用过。

        char str[5] = "中文";

        int iLenWideChar = MultiByteToWideChar(0, 0, const_cast<char *>(str), sizeof(str), NULL, 0);

        strWideChar = new unsigned short[iLenWideChar];
        if(NULL == strWideChar)
        {
            goto Exit;
        }

        int iLenRet = MultiByteToWideChar(0, 0, const_cast<char *>(str), sizeof(str), strWideChar, iLenWideChar);


返回时:
        char * iterator = strReturn;
        //convert UTF-8 to WideChar
        for(unsigned int i=0; iterator <= (strReturn+iLenReturn) && i<iLenReturn; ++i)
        {
            sp_UTF8_UCS(iterator,UTF8Return[i]);
        }

        //UTF-8 to UTF16
        int iLenANSIReturn = WideCharToMultiByte(0, 0, UTF8Return, -1, NULL, 0, NULL, NULL);

        strANSIReturn = new char[iLenANSIReturn];
        if(NULL == strANSIReturn)
        {
            goto Exit;
        }

        WideCharToMultiByte(0, 0, UTF8Return, -1, strANSIReturn, iLenANSIReturn, NULL, NULL);

        printf("ANSI:%s\n", strANSIReturn);
        getchar();

最后不要忘了delete

Exit:

    if(NULL != strWideChar)
    {
        delete [] strWideChar;
        strWideChar = NULL;
    }

    if(NULL != strANSIReturn)
    {
        delete [] strANSIReturn;
        strANSIReturn = NULL;
    }

原文地址:https://www.cnblogs.com/huqingyu/p/18131.html