为什么我的Win32 API调用需要'A'后缀,我应该纠正吗?

时间:2011-08-29 09:28:04

标签: c++ winapi tchar wchar

要从Win shell执行命令我需要

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

现在我正在通过Forgers Win32教程我正在找到防止在屏幕上打印垃圾所需的A后缀。我知道这与我的操作系统默认的字符格式有关。如果我可以“规范化”我的操作系统,这可能是最好的解决方案,因为我从RegisterClassExA获得NULL,无论我在第二个例子中使用了多少* A函数(在下面再现了llloottttssss * A后缀添加了我)

#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""字符串说明符是首选的解决方案,也是我想要追求的解决方案,对不起,如果我的问题似乎绕过了丛林,我愿意接受建议。

刚刚将该代码更新为我现在使用的内容,并删除了我无法访问的内容。

_ 修改 _

错误代码是87,参数无效,所以我猜测wchar_t参数( wc.lpszClassName = g_szClassName;)毕竟不正确...:@(

_ 修改 _

猜错了?! const LPCTSTR g_szClassName = L"myWindowClass";没有修复(或破坏)一件事。

3 个答案:

答案 0 :(得分:3)

大多数WinAPI调用有两种变体:SomeFunctionA是单字符版本(即对字符串使用char[]),SomeFunctionW是宽字符版本(即使用{{1}对于字符串)。通常会定义一个没有后缀的宏(在这种情况下为wchar_t[]),它将包含SomeFunctionSomeFunctionA,具体取决于项目的unicode设置。以类似的方式,有一个宏SomeFunctionW将接受你的常量字符串文字,并在使用unicode的情况下添加一个前导_T

要获取您的初始示例,此代码应适用于所有设置(尽管未经测试):

L

答案 1 :(得分:1)

如果您需要unicode字符串,则关键字为wchar_t

const wchar_t g_szClassName[] = L"myWindowClass";

修改

另外,请确保对未设置的结构WNDCLASSEX的其余成员进行零初始化,即

WNDCLASSEX wc = {};

OR

ZeroMemory(&wc, sizeof(wc));

答案 2 :(得分:0)

添加以下行:

wc.style = CS_HREDRAW | CS_VREDRAW;