专栏首页盟主来了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 条评论
登录 后参与评论

相关文章

  • SharePoint 2010 在WebPart页面上调用扩展方法报方法未定义的解决方案

    SharePoint 2010是基于.NET 3.5的,但是微软一直是神坑,页面前台居然不支持扩展方法,也就是你可以在后台代码里面使用扩展方法,但是不能在前台页...

    雪雁-心莱科技
  • tensorflow运行提示未编译使用SSE4.1,SSE4.2等问题的解决方法

    每次运行TensorFlow 程序时,总是会提示未编译使用SSE4.1,SSE4.2等warnings 警告。

    公众号-不为谁写的歌
  • Linux 使用Unzip提示write error (disk full?)的解决方法

    error: file_write: write: No space left on device.

    叉叉敌
  • Android 解决WebView调用loadData()方法显示乱码的问题

    如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

    砸漏
  • Ubuntu 18.04 安装MySQL时未提示输入密码的问题及解决方法

    如果已经启动,执行完上述命令可看到相应的信息,如果没有启动,则可执行下面命令启动mysql:

    砸漏
  • Antd Vue的MonthPicker组件不能用,提示注册的解决方法

    项目中需要用到 Ant Design 的 MonthPicker 月份组件,但是不能用,引入后组件不能正常显示,控制台报错: vue.esm.js?efeb:6...

    德顺
  • 用IE打开Reporting Service时提示权限不足的解决方法

    在IE中打开http://localhost/ReportServer时,经常提示“为用户“*”授予的权限不足,无法执行此操作。 (rsAccessDenied...

    williamwong
  • ATL模板库中的OLEDB与ADO

    上次将OLEDB的所有内容基本上都说完了,从之前的示例上来看OLEDB中有许多变量的定义,什么结果集对象、session对象、命令对象,还有各种缓冲等等,总体上...

    Masimaro
  • TCP网络调试助手上提示错误:“1035 未知错误”的有效解决方法,本人实测确实可行

    转:https://blog.csdn.net/jacket_/article/details/97415651

    墨文

扫码关注云+社区

领取腾讯云代金券