2016-04-18 16 views
1

Ich versuche zu verstehen, wie lpCmdLine verhält, und es scheint etwas entgegengesetzt intuitiv zu sein.Wie wird lpCmdLine gespeichert?

Ursprünglich dachte ich, es wäre nur ein Zeiger auf die gesamte Befehlsfolge, aber dieser Code zeigt, dass dies nicht der Fall ist, da die Anzeige von lpCmdLine direkt Müll anzeigt.

#include <Windows.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <stdarg.h> 

void alertf(const char *fmt, ...) 
{ 
    char buf[80]; 
    va_list args; 
    va_start(args, fmt); 
    sprintf_s(buf, fmt, args); 
    va_end(args); 

    MessageBox((HWND)0, buf, "Message Box", MB_OK | MB_ICONINFORMATION); 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
{ 
    alertf("lpCmdLine: '%s'.", lpCmdLine); 

    return 0; 
} 

Wie wird lpCmdLine intern gespeichert?

Lösung

Mein alertf sollte vsprintf_s statt sprintf_s verwenden, weil sein Argument ein varargs ist.

Diese eine Änderung bestätigt, dass lpCmdLine tatsächlich ist, wie ich ursprünglich dachte, eine c-Zeichenfolge der gesamten Befehlszeile.

+0

Beachten Sie, dass es nur (und immer) eine ANSI-Form der Befehlszeile ist; Sie können die API-Funktion 'GetCommandLineW()' verwenden, um die Unicode-Befehlszeile abzurufen. –

+0

@Dmitry, auf StackOverflow müssen Sie Ihrem Fragentitel weder "ANGEWIESEN" hinzufügen, noch müssen Sie die Lösung in Ihrer ursprünglichen Frage bereitstellen. – dreamlax

+0

@dreamlax Entschuldigung. – Dmitry

Antwort

5

lpCmdLine ist in der Tat ein einfacher Zeiger auf die Befehlszeichenfolge.

#include <windows.h> 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
{ 
    MessageBox(NULL, lpCmdLine, "DEBUG", MB_OK); 

    return 0; 
} 

Das Problem scheint mit Ihrer alertf Funktion zu sein, wo Ihr sprintf_s Anruf nicht das tut, was Sie denken, es tut. Sie müssen tatsächlich vsprintf_s hier aufgrund der Anwesenheit des va_list verwenden:

void alertf(const char *fmt, ...) 
{ 
    char buf[80]; 
    va_list args; 
    va_start(args, fmt); 
    vsprintf_s(buf, fmt, args); 
    va_end(args); 

    MessageBox((HWND)0, buf, "Message Box", MB_OK | MB_ICONINFORMATION); 
} 

Der Code funktioniert perfekt danach.

+0

Ich drückte mir die Daumen, mein total einzigartiger und unschuldiger Alarm würde nichts anderes tun, als einen Pufferüberlauf zu verursachen ... Ich denke jetzt weiß ich was Vsprintf tut. Vielen Dank! – Dmitry

Verwandte Themen