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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值