3

要从我需要的 Win shell 执行命令

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

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

#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's)并改用L""字符串初始化器,但现在我得到一个错误分配const char g_szClassName[] = L"myWindowClass";

错误 C2053:“g_szClassName”:宽字符串不匹配

替换charwchar生成编译器错误消息,指示wchar不是可识别的类型。

_编辑_

我认为L""字符串说明符是首选解决方案,也是我想要追求的解决方案,抱歉,如果我的问题似乎绕圈子,我愿意接受建议。

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

_编辑_

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

_编辑_

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

4

3 回答 3

7

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

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

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 回答