专栏首页盟主来了18.6.13日报,提示CoInitialize未调用的解决方法

18.6.13日报,提示CoInitialize未调用的解决方法

1,完善electron的拖拽。里面细节较多,和wke模式不同的是需要处理多线程逻辑。

另外::DoDragDrop一直提示CoInitialize未调用。实际上我调用了。

用ida看了下DoDragDrop的实现

主要是IsOleInitialized这个出错了。

BOOL __stdcall IsOleInitialized() {   tagSOleTlsData *v0; // eax@1   v0 = (tagSOleTlsData *)NtCurrentTeb()->ReservedForOle;   return v0 && v0->cOleInits;

}

原来是cOleInits没初始化。但CoInitialize和CoInitializeEx里并没初始化这个变量。

最后找到是OleInitializeEx初始化的。

HRESULT __stdcall OleInitializeEx(void *pMalloc, unsigned int ulFlags) {   void *v2; // esi@2   unsigned int v4; // [sp+4h] [bp-4h]@2   HRESULT hr; // [sp+14h] [bp+Ch]@1   hr = CoInitializeEx(pMalloc, ulFlags);   if ( hr >= 0 )   {     v2 = NtCurrentTeb()->ReservedForOle;     ++*((_DWORD *)v2 + 7);     v4 = *((_DWORD *)v2 + 7);     if ( v4 <= 1 )     {       COleStaticMutexSem::Request(&g_mxsSingleThreadOle, "Unknown File", 0, "Unknown Lock");       ++g_cOleProcessInits;       if ( g_cOleProcessInits != 1 || (hr = CheckInitDde(0), hr < 0) )       {         COleStaticMutexSem::Release(&g_mxsSingleThreadOle);       }       else       {         if ( !g_aDropTarget )         {           g_cfObjectLink = RegisterClipboardFormatW(L"ObjectLink");           g_cfOwnerLink = g_cfObjectLink + 1;           g_cfNative = g_cfObjectLink + 2;           g_cfBinary = g_cfObjectLink + 3;           g_cfFileName = g_cfObjectLink + 4;           g_cfFileNameW = g_cfObjectLink + 5;           g_cfNetworkName = g_cfObjectLink + 6;           g_cfDataObject = g_cfObjectLink + 7;           g_cfEmbeddedObject = g_cfObjectLink + 8;           g_cfEmbedSource = g_cfObjectLink + 9;           g_cfCustomLinkSource = g_cfObjectLink + 10;           g_cfLinkSource = g_cfObjectLink + 11;           g_cfObjectDescriptor = g_cfObjectLink + 12;           g_cfLinkSrcDescriptor = g_cfObjectLink + 13;           g_cfOleDraw = g_cfObjectLink + 14;           g_cfPBrush = g_cfObjectLink + 15;           g_cfMSDraw = g_cfObjectLink + 16;           g_cfOlePrivateData = g_cfObjectLink + 17;           g_cfScreenPicture = g_cfObjectLink + 18;           g_cfOleClipboardPersistOnFlush = g_cfObjectLink + 19;           g_cfMoreOlePrivateData = g_cfObjectLink + 20;           g_aDropTarget = GlobalAddAtomW(L"OleDropTargetInterface");           g_aDropTargetMarshalHwnd = GlobalAddAtomW(L"OleDropTargetMarshalHwnd");         }         uOmPostWmCommand = RegisterWindowMessageW(L"OM_POST_WM_COMMAND");         uOleMessage = RegisterWindowMessageW(L"OLE_MESSAHE");         COleStaticMutexSem::Release(&g_mxsSingleThreadOle);       }     }     if ( hr < 0 )     {       CheckUninitDde(0);       --*((_DWORD *)v2 + 7);       CoUninitialize();     }     else     {       if ( !pMalloc )         hr = v4 != 1;       CoVrfNotifyOleInit();     }   }   return hr; }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 记录下改滚动条样式的css

    @media (min-width: 768px) {     ::-webkit-scrollbar {       ...

    龙泉寺扫地僧
  • webkit和blink在blob机制上不同的地方

    WebKit.dll!WebCore::BlobURL::createBlobURL(const WTF::String & originString...

    龙泉寺扫地僧
  • 19.126日报,curl的cookie机制分析

        CURL* curl = curl_easy_init();     CURLSH* curlsh = m_curlShareHandle;    ...

    龙泉寺扫地僧
  • BP神经网络

    BP(Back Propagation)神经网络是1986年由以Rumelhart和McCelland为首的科学家小组提出的,是一种按误差逆传播算法训练的多层前...

    企鹅号小编
  • BP神经网络

    BP(Back Propagation)神经网络是1986年由以Rumelhart和McCelland为首的科学家小组提出的,是一种按误差逆传播算法训练的多层前...

    anytao
  • 智能配送系统的运筹优化实战

    美团配送业务场景复杂,单量规模大。下图这组数字是2019年5月美团配送品牌发布时的数据。

    美团技术团队
  • 《七天数据可视化之旅》第七天:可视化设计实战-数据大屏

    Destiny,某物流公司数据产品经理,目前从事数据平台搭建和可视化相关的工作。持续学习中,期望与大家多多交流数据相关的技术和实际应用,共同成长。

    木东居士
  • 【干货】21个数据可视化利器

    大数据文摘
  • 一张脑图讲透商品数据化运营:提高流量和营业额的工具和模型

    沉默的白面书生
  • 9大行为导致Java程序员薪资过低, 你有几个?

    Java程序员薪水有高有低,有的人一个月可能拿30K、50K,有的人可能只有2K、3K。同样有五年工作经验的Java程序员,可能一个人每月拿20K,一个拿5K。...

    java架构师

扫码关注云+社区

领取腾讯云代金券