Search code examples
c++winapicommon-controls

Can not Set URL or ID to SysLink in C++ Win32


Here is my code , but it does not compile and gives out two errors :

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

I have Read link below but it did not help me :

error C2106: '=' : left operand must be l-value

[Code] :

#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;
 }

Thanks for any help.


Solution

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

    You probably meant to make url_wchar a pointer:

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

    Unfortunately though, szUrl isn't a pointer, it's a character array. So to assign it you need to copy the string into it (rather than just assign it as a pointer), using a string copy function. For example,

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

    If you ever do get this to compile, you'll find it crashes more or less immediately, because of this:

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

    You're writing to a null pointer there. You need to either allocate space for the LITEM structure, or (preferably) just declare it on the stack:

        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);