前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >18.6.13日报,提示CoInitialize未调用的解决方法

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

作者头像
龙泉寺扫地僧
发布2019-02-20 09:51:54
1.4K0
发布2019-02-20 09:51:54
举报
文章被收录于专栏:盟主来了盟主来了

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年06月13日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档