2016-05-26 10 views
-2

Ich habe eine Routine, in der ich swprintf aufrufen. Aus der ganzen Dokumentation, die ich gefunden habe, soll es wie sprintf funktionieren, nur mit Unicode-Strings. Der CodeVisual C++ - Betrieb von swprintf

swprintf(buffer, wcslen(buffer), L"COM %d", i); 

entfernt die Anzahl der Buchstaben, die von i bestimmt werden. Wenn i = 0 Puffer = "COM0"; wenn i = 1, Puffer = "COM"; Wenn i = 2, Puffer = "CO" - usw.

Hat jemand eine Erklärung ??? Der vollständige Code ist unten gezeigt

void SelectComPort() //added function to find the present serial 
{ 
wchar_t lpTargetPath[5000]; // buffer to store the path of the COMPORTS 
wchar_t buffer[20]; 
DWORD test; 
bool gotPort=0; // in case the port is not found 
size_t size = 0; 

for(int i=0; i<255; i++) // checking ports from COM0 to COM255 
{ 
    swprintf(buffer, wcslen(buffer), L"COM %d", i); 
    test = QueryDosDevice(buffer, &lpTargetPath[size], 5000); 

     // Test the return value and error if any 
    if(test != 0) //QueryDosDevice returns zero if it didn't find an object 
    { 
     size = wcslen(lpTargetPath); 
     gotPort=1; // found port 
    } 

    if(::GetLastError()==ERROR_INSUFFICIENT_BUFFER) 
    { 
     lpTargetPath[10000]; // in case the buffer got filled, increase size of the buffer. 
     continue; 
    } 

} 

return; 

}

+2

'wcslen' gibt die Länge der * Zeichenkette * zurück, nicht die Länge des * Puffers *. Versuchen Sie 'swprintf (Puffer, 20, ...)' –

Antwort

1

swprintf nimmt die Länge des Puffers als Argument, nicht die Länge der Zeichenfolge . wsclen wird zurückgegeben, sobald ein Nullzeichen im Puffer gefunden wird. Das Aufrufen von wcslen in einem nicht initialisierten Puffer ist eindeutig undefiniert, da die Wahrscheinlichkeit sehr hoch ist, dass der Zeiger bei der Suche nach dem abschließenden Nullwert von den Array-Grenzen inkrementiert wird.

Statt wcslen aufzurufen, verwenden Sie die Länge des Arrays selbst, das heißt 20

auch: die COM# Ports haben keinen Raum zwischen COM und der Zahl.

+1

Das Problem war der wsclen - put in der richtigen Pufferlänge und es hat gut funktioniert. Vielen Dank für den Fang. Tut mir leid, aber ich bin frustriert über Visual C++, dass ich dumme Fehler mache – joaltman