使用 StringCbPrintf 格式化缓冲区

Formatting a buffer with StringCbPrintf

本文关键字:缓冲区 格式化 StringCbPrintf 使用      更新时间:2023-10-16

>我在如何使用StringCbPrintf格式化缓冲区方面遇到困难,这里应该是一个HTTP请求:

char getExternalIpRequest[1200]; 
     ZeroMemory(getExternalIpRequest, 1200);
     StringCbPrintf(getExternalIpRequest, 1200,
                                        "<?xml version="1.0"?>"
                                        "<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">"
                                        "<SOAP-ENV:Body>"
                                        "<m:AddPortMapping xmlns:m="urn:schemas-upnp-org:service:WANIPConnection:1">"
                                        "<NewRemoteHost xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="string">"
                                        ""
                                        "</NewRemoteHost>"
                                        "<NewExternalPort xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="ui2">"
                                        "%s"
                                        "</NewExternalPort>"
                                        "<NewProtocol xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="string">"
                                        "%s"
                                        "</NewProtocol>"
                                        "<NewInternalPort xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="ui2">"
                                        "%s"
                                        "</NewInternalPort>"
                                        "<NewInternalClient xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="string">"
                                        "%s"
                                        "</NewInternalClient>"
                                        "<NewEnabled xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="boolean">"
                                        "1"
                                        "</NewEnabled>"
                                        "<NewPortMappingDescription xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="string">"
                                        "%s"
                                        "</NewPortMappingDescription>"
                                        "<NewLeaseDuration xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="ui4">"
                                        "0"
                                        "</NewLeaseDuration>"
                                        "</m:AddPortMapping>"
                                        "</SOAP-ENV:Body>"
                                        "</SOAP-ENV:Envelope>rnrn", externalPort, protocol, internalPort, internalp, entryDescription);
// externalPort, protocol, internalPort, internalp, entryDescription are **char*** type.
char getExternalIpRequestHeader[1500]; 
     ZeroMemory(getExternalIpRequestHeader, 1500);
     StringCbPrintf(getExternalIpRequestHeader, 1500,
                                                  "POST /UD/?3 HTTP/1.1rn"
                                                  "Content-Type: text/xml; charset="utf-8"rn" 
                                                  "SOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress"rn"
                                                  "User-Agent: Mozilla/4.0 (compatible; UPnP/1.0; Windows 9x)rn"
                                                  "Host: %srn"
                                                  "Content-Length: %srn"
                                                  "Connection: Keep-Alivern"
                                                  "Cache-Control: no-cachern"
                                                  "Pragma: no-cachernrn", upnpDeviceIp, strlen(getExternalIpRequest));

但是当我在控制台中回显它时,我收到访问冲突消息。

更新我注意到如果我评论StringCbPrintf(getExternalIpRequest)或StringCbPrintf(getExternalIpRequestHeader)之一,就不会崩溃。

格式化getExternalIpRequestHeader时,Content-Length 标头使用 %s ,它需要一个char*值,但你为它提供的返回值是 strlen() ,这是一个int,所以你需要改用%d