2015-12-04 9 views
2

Вот мой код, но он не компилируется и выдает две ошибки:Невозможно установить URL или идентификатор SysLink в C++ Win32

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

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

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

[Код]:

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

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

+0

Вы также можете поместить формат HTML в оконном тексте, то он будет не нужен 'LM_SETITEM' Смотрите также https://msdn.microsoft.com/en-us/library/windows/desktop/hh298379%28v=vs.85%29.aspx –

ответ

5
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); 
+0

Спасибо за ваш ответ, из-за моей нынешней репутации, я не могу проголосовать: ( – BlueFlower

+0

@BlueFlower: Я сделаю это за вас. – ahmd0