3

Winシェルからコマンドを実行するには、必要でした

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

そして今、私はForgers Win32チュートリアルを進めていますが、画面にゴミが印刷されないようにするために必要なAサフィックスを見つけています。これは、OSのデフォルトの文字形式と関係があることを私は知っています。2番目の例で使用する*A関数の数に関係なくNULLが返されるため、OSを「正規化」できれば、これが最善の解決策になる可能性がありますRegisterClassExA(* Aサフィックスのllloottttssssを追加して以下に再現)

#include <windows.h>
const wchar_t g_szClassName[] = L"myWindowClass";
// Step 4: the Window Procedure
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;
    //Step 1: Registering the Window Class
    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"Window Registration Failed!", L"Error!",
        MB_ICONEXCLAMATION | MB_OK);
    return 0;
    }
    // Step 2: Creating the Window...
    return Msg.wParam;
}

上記のコードを再検討してForgers(* Aを削除)のようL""にし、代わりに文字列初期化子を使用しましたが、割り当て中にエラーが発生しますconst char g_szClassName[] = L"myWindowClass";

エラーC2053:'g_szClassName':ワイド文字列の不一致

に置き換えるcharと、認識されたタイプではないwcharことを示すコンパイラエラーメッセージが生成されます。wchar

_編集_

L""私は文字列指定子が好ましい解決策であり、私が追求したいものであることを収集します。私の質問が茂みの周りを打ち負かしているようであれば申し訳ありませんが、私は提案を受け入れています。

そのコードを現在使用しているものに更新し、到達できないものを切り取りました。

_編集_

wchar_tエラーコードは87、無効なパラメータなので、パラメータ( )の割り当ては結局間違っていると思い wc.lpszClassName = g_szClassName;ます...:@(

_編集_

間違っていると思いますか?!const LPCTSTR g_szClassName = L"myWindowClass";物事を修正(または破壊)しませんでした。

4

3 に答える 3

7

ほとんどのWinAPI呼び出しは、2つのバリエーションで利用できます。1SomeFunctionA文字バージョン(つまりchar[]、文字列に使用)、またはSomeFunctionWワイド文字バージョン(つまりwchar_t[]、文字列に使用)です。通常、その接尾辞なしで定義されたマクロ(この場合SomeFunction)があり、プロジェクトのユニコード設定のいずれかSomeFunctionAまたはそれSomeFunctionWに応じて含まれます。同様の方法で_T、定数文字列リテラルを受け入れ、LUnicodeが使用されている場合に先頭を追加するマクロがあります。

最初の例を取り上げるには、このコードはすべての設定で機能する必要があります(ただし、テストされていません)。

ShellExecute(NULL, _T("open"), _T("http://stackoverflow.com"), NULL, NULL, SW_SHOWNORMAL); 
于 2011-08-29T09:32:11.607 に答える
1

Unicode文字列が必要な場合、キーワードは次のとおりです。wchar_t

const wchar_t g_szClassName[] = L"myWindowClass";

編集:

WNDCLASSEXまた、設定していない構造体の残りのメンバーをゼロで初期化するようにしてください。

WNDCLASSEX wc = {};

また

ZeroMemory(&wc, sizeof(wc));
于 2011-08-29T09:33:14.867 に答える
0

次の行を追加します。

wc.style = CS_HREDRAW | CS_VREDRAW;
于 2011-08-29T10:24:54.417 に答える