3 Stimmen

Warum benötigen meine Win32-API-Aufrufe das Suffix 'A' und sollte ich das korrigieren?

Um einen Befehl aus der Win-Shell auszuführen, benötigte ich

ShellExecuteA(NULL, "open", "http://stackoverflow.com", NULL, NULL, SW_SHOWNORMAL);

und jetzt arbeite ich durch das Forgers Win32 Tutorial und finde den A-Suffix notwendig, um zu verhindern, dass Müll auf dem Bildschirm angezeigt wird. Ich weiß, dass das etwas mit dem Zeichenformat zu tun hat, das mein Betriebssystem standardmäßig verwendet. Wenn ich mein Betriebssystem 'normalisieren' könnte, wäre das vielleicht die beste Lösung, denn ich erhalte NULL zurück von RegisterClassExA, egal wie viele *A-Funktionen ich im zweiten Beispiel (nachfolgend mit vielen von mir hinzugefügten *A-Suffixen) verwende

#include 
const wchar_t g_szClassName[] = L"myWindowClass";
// Schritt 4: Das Fensterverfahren
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{/*...*/
    return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSEX wc;
    HWND hwnd;
    MSG Msg;
    //Schritt 1: Registrierung der Fensterklasse
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = g_szClassName;
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);
    if(!RegisterClassEx(&wc))
    {
        MessageBox(NULL, L"Fensterregistrierung fehlgeschlagen!", L"Fehler!",
        MB_ICONEXCLAMATION | MB_OK);
    return 0;
    }
    // Schritt 2: Das Fenster erstellen...
    return Msg.wParam;
}

Ich habe den obigen Code überarbeitet, um ihn wie bei Forger (entfernte *A's) zu gestalten und stattdessen L""-Zeichenfolgeninitialisierer verwendet, aber jetzt erhalte ich einen Fehler beim Zuweisen von const char g_szClassName[] = L"myWindowClass";

Fehler C2053: 'g_szClassName' : Breite Zeichenfolgenunstimmigkeit

Das Ersetzen von char durch wchar erzeugt Compilerfehlermeldungen, die darauf hinweisen, dass wchar kein erkannter Typ ist.

_BEARBEITEN_

Ich nehme an, dass der L""-Zeichenfolgenspezifizierer die bevorzugte Lösung ist, der ich folgen möchte. Entschuldigen Sie, wenn meine Frage um den heißen Brei herumgeht, ich bin für Vorschläge offen.

Habe gerade diesen Code auf das aktualisiert, was ich jetzt benutze, und den unnötigen Kram entfernt.

_BEARBEITEN_

Der Fehlercode ist 87, ungültiger Parameter, also ich nehme an, dass das Zuweisen des wchar_t-Parameters ( wc.lpszClassName = g_szClassName;) doch falsch ist… :@(

_BEARBEITEN_

Habe falsch geraten?! const LPCTSTR g_szClassName = L"myWindowClass"; hat nichts verbessert (oder verschlechtert).

8voto

Mario Punkte 34445

Die meisten WinAPI-Aufrufe sind in zwei Varianten verfügbar: SomeFunctionA ist die Einzelzeichen-Version (d.h. Verwendung von char[] für Zeichenfolgen), SomeFunctionW ist die breite Zeichen-Version (d.h. Verwendung von wchar_t[] für Zeichenfolgen). Normalerweise gibt es ein Makro ohne diesen Suffix (in diesem Fall SomeFunction), das entweder SomeFunctionA oder SomeFunctionW je nach Einstellung des Unicode-Projekts enthält. Auf ähnliche Weise gibt es ein Makro _T, das Ihre konstanten Zeichenfolgenliterale akzeptiert und ein vorangestelltes L hinzufügt, falls Unicode verwendet wird.

Um Ihr anfängliches Beispiel aufzugreifen, sollte dieser Code mit allen Einstellungen funktionieren (nicht getestet):

ShellExecute(NULL, _T("open"), _T("http://stackoverflow.com"), NULL, NULL, SW_SHOWNORMAL);

1voto

cpx Punkte 16132

Wenn Sie einen Unicode-String benötigen, ist das Stichwort wchar_t

const wchar_t g_szClassName[] = L"myWindowClass";

Bearbeiten:

Vergewissern Sie sich auch, dass Sie den Rest der Elemente der Struktur WNDCLASSEX null initialisieren, die Sie nicht festgelegt haben, d. h.

WNDCLASSEX wc = {};

ODER

ZeroMemory(&wc, sizeof(wc));

0voto

SChepurin Punkte 1744

Fügen Sie diese Zeile hinzu:

wc.style = CS_HREDRAW | CS_VREDRAW;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X