从 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 函数调用

从 Powershell 调用的 DLL 使用相对于 Powershell 安装目录的路径。如何将其设置为其他内容?

使用非托管 C++ .dll 从 C# .exe 调用函数

从 MinGW 调用 MSVC DLL 函数

从 C++ 调用 C# dll