从 dll 调用 CreateDispatch 将 m_lpDispatch 设为 NULL
Posted
技术标签:
【中文标题】从 dll 调用 CreateDispatch 将 m_lpDispatch 设为 NULL【英文标题】:Call CreateDispatch from a dll gives m_lpDispatch as NULL 【发布时间】:2012-08-16 07:54:17 【问题描述】:我有一个程序,我从 COleDispatchDriver 调用 exe。这将 m_lpDispatch 指针设为 NULL。我从主 exe 的 dll 中调用它。我在代码的开头和结尾添加了 CoInitialize(NULL)/CoUninitialize()。但是exe仍然没有出现。
CoInitialize(NULL);
matProp = IMatProp();
matProp.CreateDispatch(_T("MatProp.Document"));
matProp.Initialize();
matProp.ShowApplication( SW_SHOW );
CoUninitialize();
IMatProp 是机器生成的 IDispatch 包装类,它是 ColeDispatchDriver 类的子类。 下面是该类的方法。
long IMatProp::Initialize()
long result;
InvokeHelper(0x1, DISPATCH_METHOD, VT_I4, (void*)&result, NULL);
return result;
long IMatProp::ShowApplication(long show)
long result;
static BYTE parms[] =
VTS_I4;
InvokeHelper(0x2, DISPATCH_METHOD, VT_I4, (void*)&result, parms,
show);
return result;
从 exe 调用时这工作正常,但从 dll 调用时出现此问题。 请帮我。 非常感谢。
【问题讨论】:
另外,你为什么不写一个很好的问题而不是发布你的问题 - 我看到this is the beginning。 嗨 Roman,我已经编辑了问题以显示代码。很抱歉一次没有提出整个问题。 所有引用的方法都返回执行状态,你检查了吗?如果是这样,错误代码是什么。如果CreateDispatch
失败,请使用调试器进入并查看它在内部的确切位置以及HRESULT
代码是什么。
CreateDispatch 失败,因为 m_lpDispatch 指针为空。我必须使用带有 MatProp.exe /RegServer 的命令提示符手动注册 exe。我在 Windows 7 中工作。你能解释一下有什么问题吗?
你不知道为什么这段代码会失败,因为你根本没有做任何错误检查。你需要先解决这个问题。
【参考方案1】:
您可能需要初始化 OLE 而不仅仅是 COM。尝试改用OleInitialize()
和OleUninitialize()
。
MFC 应用可以通过在CMFCApp::InitInstance()
期间调用AfxOleInit()
来控制这一点,但如果您使用多个线程,则需要自己处理。
【讨论】:
感谢 snowdude,但它给出了一个调试断言 ASSERT(!pState->m_bNeedTerm); // 调用它两次?在 oleinit.cpp 中。 您是否在运行 COM 代码的同一线程上调用 AfxOleInit? 是的,如果我错了,请纠正我,我对这个 COM 对象很陌生。非常感谢。 在您的 CreateDispatch 中传递一个指向 COleException 对象的指针以捕获实际的错误代码。当你这样做时,COleException::m_sc 的价值是什么?以上是关于从 dll 调用 CreateDispatch 将 m_lpDispatch 设为 NULL的主要内容,如果未能解决你的问题,请参考以下文章
将一个 dll 作为嵌入式资源嵌入到另一个 dll 中,然后从我的代码中调用它
将 C++ 结构指针从 Perl 传递给任意 dll 函数调用