gpt4 book ai didi

CoCreateInstance 在控制台应用程序中挂起

转载 作者:太空宇宙 更新时间:2023-11-04 04:35:03 26 4
gpt4 key购买 nike

以下是简短的重现样本:

DWORD WINAPI _threadTest (LPVOID)
{
Sleep (2000);
CoInitialize(0);
CoCreateInstance(...); // <---- hangs here
return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize (0);

CreateThread (0, 0, _threadTest, 0, 0, 0);

uint32_t size = 0;
fread (&size, 4, 1, stdin);

return 0;
}

所以。首先,这个问题只发生在 Windows XP 下。

其次,这个控制台应用程序实际上是 Firefox 浏览器扩展的一部分。扩展使用标准输入/标准输出管道与其通信。

现在是最有趣的事情。如果使用 cmd.exe(例如)启动此 EXE,则不会重现该问题。它仅在 Firefox 浏览器启动的情况下重现。如果我评论 fread call 并使用 Sleep (10000) 代替它,即使 Firefox 启动了 EXE,问题也不会重现。

objective-c OM 组件在一个单独的进程中。

因此,要“挂起”CoCreateInstance,我们需要:1. window XP2. Firefox启动的进程3. 进程的主线程被 fread 调用锁定。

这里会发生什么,可以做什么?

来 self 的真实应用程序的堆栈跟踪:

Worker Thread   Win32 Thread    sxs.dll!__ioinit    Normal
ntdll.dll!_KiFastSystemCallRet@0()
ntdll.dll!_NtQueryVolumeInformationFile@20()
kernel32.dll!_GetFileType@4()
sxs.dll!__ioinit()
sxs.dll!__CRT_INIT@12()
sxs.dll!DllStartup_CrtInit(struct HINSTANCE__ *,unsigned long,void *)
sxs.dll!__SxsDllMain@12()
ntdll.dll!_LdrpCallInitRoutine@16()
ntdll.dll!_LdrpRunInitializeRoutines@4()
ntdll.dll!_LdrpLoadDll@24()
ntdll.dll!_LdrLoadDll@16()
kernel32.dll!_LoadLibraryExW@12()
kernel32.dll!_LoadLibraryW@4()
oleaut32.dll!OaLoadLibraryAW(char const *,unsigned short const *)
oleaut32.dll!GetRedirectionProcAddress(char const *,void * *)
oleaut32.dll!MapIIDToFusionCLSID(struct _GUID const &,struct _GUID *)
oleaut32.dll!ProxyStubCLSIDOfInterface(struct _GUID const &,struct _GUID *)
oleaut32.dll!CPSFactory::CreateProxy(struct IUnknown *,struct _GUID const &,struct IRpcProxyBuffer * *,void * *)
ole32.dll!CStdMarshal::CreateProxy(struct _GUID const &,struct IRpcProxyBuffer * *,void * *,int *)
ole32.dll!CStdMarshal::MakeCliIPIDEntry(struct _GUID const &,struct tagSTDOBJREF *,class OXIDEntry *,struct tagIPIDEntry * *)
ole32.dll!CStdMarshal::UnmarshalIPID(struct _GUID const &,struct tagSTDOBJREF *,class OXIDEntry *,void * *)
ole32.dll!CStdMarshal::Finish_RemQIAndUnmarshal1(struct tagSQIResult *,struct tagQICONTEXT *)
ole32.dll!CStdMarshal::Finish_QueryRemoteInterfaces(struct tagSQIResult *,struct tagQICONTEXT *)
ole32.dll!CStdMarshal::QueryRemoteInterfaces(unsigned short,struct _GUID *,struct tagSQIResult *)
ole32.dll!CStdIdentity::CInternalUnk::QueryMultipleInterfaces(unsigned long,struct tagMULTI_QI *)
ole32.dll!CStdIdentity::CInternalUnk::QueryInterface(struct _GUID const &,void * *)
FmBrowserHelper.exe!_com_ptr_t<_com_IIID<IWGUrlReceiver,&_GUID_454a4044_16ec_4d64_9069_c5b8832b7b55> >::CreateInstance(const _GUID & rclsid, IUnknown * pOuter, unsigned long dwClsContext) Line 592

Microsoft Visual C++ 的 fread 实现在零句柄 (stdin) 上调用 _lock_fh,然后在 _read_nolock 调用中锁定线程(尝试从 stdin 读取)。我想问题出在某个地方......当主线程从 fread 退出时 - CoCreateInstance 返回。

最佳答案

很棒的工作,我认为你需要做的是:

CoInitializeEx(null, COINIT_APARTMENTTHREADED);

就像这里所做的那样:https://developer.mozilla.org/en-US/docs/Mozilla/js-ctypes/Examples/Using_COM_from_js-ctypes

关于CoCreateInstance 在控制台应用程序中挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31583913/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com