无法在 C++ Win32 中将 URL 或 ID 设置为 SysLink

Posted

技术标签:

【中文标题】无法在 C++ Win32 中将 URL 或 ID 设置为 SysLink【英文标题】:Can not Set URL or ID to SysLink in C++ Win32 【发布时间】:2015-12-04 18:42:57 【问题描述】:

这是我的代码,但它没有编译并给出两个错误:

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;
 

感谢您的帮助。

【问题讨论】:

你也可以把html格式放到window-text中,这样就不需要LM_SETITEM另见msdn.microsoft.com/en-us/library/windows/desktop/… 【参考方案1】:
   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);

【讨论】:

感谢您的回答,由于我目前的声誉,我无法投票:( @BlueFlower:我会为你做的。

以上是关于无法在 C++ Win32 中将 URL 或 ID 设置为 SysLink的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual C++ 2008 中将 MFC 应用程序项目添加到 Win32 应用程序项目

如何在c ++ win32 API中将图标添加到菜单项[重复]

在编译的 exe 中编辑字符串变量? C++ win32

c++ win32输出一个文本

无法理解普通 c++ 与 vc++、win32 编程、mfc、win32 api、CLI 之间的关系 [关闭]

(Visual Studio 2015) 无法创建 Win32 C++ 应用程序