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