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; }
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有