gpt4 book ai didi

c++ - 多个 DLL 的问题

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

我有一个引用 2 个 COM DLL 的应用程序。应用程序在启动时调用的 2 个 DLL 中有一个 Init 函数。

这两个 DLL 几乎相似 - 除了它们具有不同的 uid 和不同的接口(interface)名称。除此之外,逻辑是相同的....并且使用的变量也是相同的。

这就是这个系统的工作原理 -1.启动应用程序()2. Init DLL1(appVar1,appVar2)..此处应用程序将此 DLL 中定义的变量 x,y 设置为从应用程序传递的值。假设 x = appVar1 和 y = appVar2。 x 和 y 是全局变量。3. Init DLL2(appVar1a,appVar2a)...应用程序将 DLL2 中定义的变量 x 设置为从应用程序传递的值。 x = appVar1a; y = 应用程序变量 2。

现在,当我尝试在 DLL1 上运行某些东西时,x 和 y 的值神秘地变成了其他东西。

x 现在变为 appVar2,y 为空。

这里的x, y以及app在InitDLL函数中传递的所有变量如appVar1等都是BSTR。

我逐步检查代码...x、y 在 InitDLL1 中正确设置为 appVar1、appVar2。但是一旦这个函数返回并且我们正在初始化第二个 DLL (InitDLL2),这就会改变。

有趣的是,我在 DLL2 中没有看到任何此类问题......尽管代码/逻辑非常相似......除了它调用的接口(interface)。

在 DLL1 和 DLL2 中,在 InitDLL 函数中,我们创建了一个新线程,我们在各种函数中使用了 x 和 y。由于上述问题,DLL1 总是失败。但是 DLL2 没有问题。

有什么可能出错的线索吗?

最佳答案

您不能只分配一个 BSTR,您需要复制它。问题是:

// caller - by COM memory management rules, for [in] parameters
// caller needs to allocate and free the memory
BSTR str = SysAllocString("..."); // string is allocated
comObjectPtr->Init(str); // in the function, pointer is copied to global
SysFreeString(str); // string released, pointer points to garbage

// callee
ComObject::Init(BSTR str)
{
// wrong code!!! you have no idea about lifetime of str,
// so you can't just assign it. When the caller function
// exits, string memory is released and your global is thrashed
// I suspect you use some BSTR wrapper (bstr_t or CComBSTR) so
// you don't see the deallocation part and that's why the values
// are invalidated on function exit: the destructor of BSTR wrapper
// does its job
global_str = str;

// correct code:
// global_str = SysAllocString(str);
}

关于c++ - 多个 DLL 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13696721/

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