winapi — Невозможно установить URL или ID для SysLink в C ++ Win32

Вот мой код, но он не компилируется и выдает две ошибки:

error C2440: '=' : cannot convert from 'WCHAR' to 'WCHAR [2084]'
IntelliSense: expression must be a modifiable lvalue

Я прочитал ссылку ниже, но она мне не помогла:

ошибка C2106: ‘=’: левый операнд должен иметь значение l

[Код]:

#define ID_SysLink 500
HWND hWnd;

LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
switch (Msg)
{
case WM_CREATE:
{
HWND syslink_handle=0;
syslink_handle=CreateWindowEx(0, WC_LINK, L"test syslink",  WS_VISIBLE | WS_CHILD , 10, 10, 100, 30, hWnd, HMENU(ID_SysLink), 0, 0);

LITEM *pitem = 0;
pitem->iLink = 0;
pitem->mask = LIF_ITEMINDEX | LIF_ITEMID | LIF_URL | LIF_STATE;
pitem->state = LIS_ENABLED | LIS_FOCUSED | LIS_HOTTRACK;
pitem->stateMask = LIS_ENABLED | LIS_FOCUSED | LIS_HOTTRACK;
WCHAR url_wchar = WCHAR(L"http://www.google.com");
pitem->szUrl = url_wchar;
SendMessage(syslink_handle, LM_SETITEM, 0, LPARAM(&pitem));
}
break;
case WM_CLOSE:
DestroyWindow(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, Msg, wParam, lParam);
break;
}

return 0;
}

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPreviewInstance,LPSTR lpcmdline,int ncmdshow)
{
WNDCLASSEX wndexcls;
wndexcls.lpszClassName = wndclssname;
wndexcls.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndexcls.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
wndexcls.hCursor = LoadCursor(NULL, IDC_ARROW);
wndexcls.hbrBackground = (HBRUSH)(COLOR_3DDKSHADOW + 1);
wndexcls.lpszMenuName = NULL;
wndexcls.style = NULL;
wndexcls.hInstance = hInstance;
wndexcls.cbSize = sizeof(WNDCLASSEX);
wndexcls.cbClsExtra = 0;
wndexcls.cbWndExtra = 0;
wndexcls.lpfnWndProc = WndProc;
RegisterClassEx(&wndexcls);

hWnd = CreateWindowEx(WS_EX_CLIENTEDGE, L"winclass", L"TestApp", WS_OVERLAPPEDWINDOW, 100, 100, 640, 380, 0, 0,hInstance, 0);
ShowWindow(hWnd, ncmdshow);
UpdateWindow(hWnd);

MSG wnd_msg;
while (GetMessage(&wnd_msg,NULL,0,0)>0)
{
TranslateMessage(&wnd_msg);
DispatchMessage(&wnd_msg);
}
return (int)wnd_msg.wParam;
}

Спасибо за любую помощь.

2

Решение

   WCHAR url_wchar = WCHAR(L"http://www.google.com");
pitem->szUrl = url_wchar;

Вы, вероятно, хотели сделать url_wchar указатель:

    WCHAR* url_wchar = L"http://www.google.com";

К сожалению, хотя, szUrl это не указатель, это массив символов. Таким образом, чтобы назначить его вам нужно копия строка в нее (а не просто назначить ее в качестве указателя), используя функцию копирования строки. Например,

    wcscpy_s(pitem->szUrl, L_MAX_URL_LENGTH, L"http://www.google.com");

Если вам когда-нибудь удастся скомпилировать этот файл, вы обнаружите, что он более или менее быстро падает, из-за этого:

    LITEM *pitem = 0;
pitem->iLink = 0;

Вы пишете на нулевой указатель там. Вам нужно либо выделить место для LITEM структура, или (предпочтительно) просто объявить его в стеке:

    LITEM item{};
item.mask = LIF_ITEMINDEX | LIF_ITEMID | LIF_URL | LIF_STATE;
item.state = LIS_ENABLED | LIS_FOCUSED | LIS_HOTTRACK;
item.stateMask = LIS_ENABLED | LIS_FOCUSED | LIS_HOTTRACK;
wcscpy_s(item.szUrl, L_MAX_URL_LENGTH, L"http://www.google.com");
SendMessage(syslink_handle, LM_SETITEM, 0, (LPARAM)&item);
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]