2016-05-04 25 views
0

Ich möchte das Sonderzeichen für EscapeXML auf Visual Studio C++ konvertieren.EscapeXML C++ Visual Studio

#include "stdafx.h" 
#include "atlenc.h"; 
#include <string> 
#include <iostream> 
using namespace std; 


int main() 
{ 
    std::string test = "& & &"; 

    inline int EscapeXML(const wchar_t * test)throw(); 

    cout << test; 
    return 0; 
} 

Ich möchte eine Ausgabe haben.

Visual Studio hat EscapeXML-Funktion, aber es konvertiert nicht. https://msdn.microsoft.com/en-us/library/y0y57exc(v=vs.71).aspx

Antwort

1

Es gibt einige Dinge, die mit Ihrem Code nicht stimmen. Zu Beginn sollten Sie eine # include-Direktive nicht mit einem Semikolon beenden.

Das heißt, das Hauptproblem ist, dass Ihr Code EscapeXML nicht aufruft, es definiert es tatsächlich neu. Was Sie wollen, ist so etwas wie dieses:

#include "stdafx.h" 
#include "atlenc.h" 
#include <string> 
#include <iostream> 

int main() 
{ 
    std::wstring test = L"& & &"; 

    int output_size = EscapeXML(test.c_str(), test.length(), 0, 0, ATL_ESC_FLAG_ATTR); 

    std::wstring testout; 
    testout.resize(output_size); 
    EscapeXML(test.c_str(), test.length(), &testout[0], output_size, ATL_ESC_FLAG_ATTR); 

    std::wcout << testout; 
    return 0; 
} 

Beachten Sie, dass EscapeXML einen Zeiger auf eine breite Zeichenfolge (wchar_t *) erwartet, so dass Sie std :: wstring (und std: wcout) verwenden müssen. Sie müssen sowohl die Eingabezeichenfolge als auch einen Puffer übergeben, in den die "masked" -Version geschrieben werden kann. Da wir nicht im Voraus wissen, wie groß der Puffer sein muss, rufen wir EscapeXML mit einem Null-Zeiger auf - die meisten Windows-API-Funktionen, die Strings zurückgeben, ermöglichen dies, und sie geben die erforderliche Puffergröße zurück. Wir instanziieren dann ein anderes wstring, passen es auf die erforderliche Größe an und rufen EscapeXML erneut auf. Diesmal übergeben wir den Zeiger tatsächlich an den Puffer. Da c_str() tatsächlich einen const-Zeiger zurückgibt (den wir nicht an eine Funktion übergeben können, die einen nichtkonstanten Zeiger erwartet, außer wir verwenden const_cast), übergeben wir stattdessen einen Zeiger an testout [0], der der Anfang von ist der interne String-Puffer des Wstrings.