WM_COPYDATA注意点

typedef struct tagCOPYDATASTRUCT {
  ULONG_PTR dwData;
  DWORD     cbData;
  PVOID     lpData;
} COPYDATASTRUCT, *PCOPYDATASTRUCT;

/********
注释:
1、dwData.为自定义数据;
2、cbData.即lpData指向的数据的长度,要是这个变量的值设置错误,就会导致WM_COPYDATA传输/*数据失败;
3、lpData.传输的数据.最好使用基础数据类型;
********/

使用WM_COPYDATA时要用SendMessage而不能使用PostMessage,因为SendMessage是阻塞的,会等待消息响应窗体处理消息完毕后再返回;而PostMessage是异步的,这样就可能会导致当消息响应窗体接收到WM_COPYDATA的时候,COPYDATASTRUCT对象已经被析构了,导致访问数据发生异常;

由于使用SendMessage,所以不应该在WM_COPYDATA中处理数据,可以在消息响应窗体的WM_COPYDATA中先把COPYDATASTRUCT对象中的数据复制出来,通过自定义消息发送到消息响应窗体,然后立即返回,来减少父进程的阻塞时间。这样就把处理数据的代

 case WM_COPYDATA:
    {
      COPYDATASTRUCT* data = (COPYDATASTRUCT*)lParam;
      // TODO: 处理pCopyData->lpData指向的数据
    }
    break;

ShellExecute无法打开浏览器网页问题

先获取浏览器路径在打开

wstring GetBrowserPath(LPCTSTR Value)
{
    TCHAR Path[MAX_PATH] = _T("http\\shell\\open\\command");
    wstring path(Path);

    HKEY hKey;

    if (RegOpenKeyEx(HKEY_CLASSES_ROOT,path.c_str(),NULL,KEY_READ|KEY_WOW64_64KEY ,&hKey) != ERROR_SUCCESS)
    {
        return _T("");
    }

    TCHAR szValue[MAX_PATH];    
    DWORD dwType,dwLen = MAX_PATH;  

    if(RegQueryValueEx(hKey,Value,NULL,&dwType,(BYTE*)szValue,&dwLen)!=ERROR_SUCCESS)
        return _T("");    
    RegCloseKey(hKey);
    return szValue;
}

void OpenUrlWithBrowser(string &url)
{
    string browserPath = "";
    string path = unicodeToChar(GetBrowserPath(_T("")).c_str());

    if (!path.empty())
    {
        path = path.substr(path.find_first_of('\"') + 1);
        path = path.substr(0, path.find_first_of('\"'));
        browserPath = path;
    }
    ShellExecuteA(NULL,"open",url.c_str(),NULL,NULL,SW_SHOW); 
    int err = GetLastError();

    if (err != 0 && !browserPath.empty())
    {
        ShellExecuteA(NULL,"open",browserPath.c_str(),url.c_str(),NULL,SW_SHOW); 

    }
}

curl_slist_append添加HTTP头踩坑问题

User-Agent:agent_test
ContentType:application/json
Cookie:testCookie:abcdef

类似这种需要注意添加的时候注意需要逐条添加 ,否则ContentType的值会修改成application/form格式,导致请求时服务端处理异常。(目前原因还不清楚,如果有大佬知道可以留言)

duilib 嵌入cef显示网页 xp/win7下滑动滚动条崩溃问题

经过排查发现是是duilib消息循环在处理WM_MOUSEWHEEL消息时可能存在问题。
解决方案:

  • 设置 multi_threaded_message_loop = true;
  • 不再使用duilib的消息循环【CPaintManagerUI::MessageLoop()】,采用cef的消息循环【CefRunMessageLoop()】

通过这些操作崩溃问题解决,具体原因还未弄清楚,有知道的大佬欢迎留言


Simple
10 声望4 粉丝