wwwqqq11 2020-10-26 13:37 采纳率: 0%
浏览 46

ATL IDL 声明指向自己的结构体,调用后出现栈溢出的问题?

我在 IDL文件 声明 结构体如下:
typedef
[
uuid(C21871A0-33EB-11D4-A13A-BE2573A1120F),
version(1.0),

helpstring("A Demo UDT variable for VB projects")

]
struct abc {

[helpstring("Name of the variable")]    int     a;
[helpstring("Value of the variable")]   int     b;
abc     *next;

} abc;

[id(2)] HRESULT testStruct([in,out] abc testv, [out,retval] LONG sum);

编译成功。

但在客户端程序

CoInitialize( NULL );

COSERVERINFO si;
MULTI_QI     qi;

ZeroMemory( &si, sizeof( si ) );
ZeroMemory( &qi, sizeof( qi ) );

si.pwszName = L"127.0.0.1";//自己机器的IP
si.pAuthInfo = NULL;

qi.pIID = &IID_ISimpleObject;
qi.pItf = NULL;

long hr = CoCreateInstanceEx(CLSID_SimpleObject, NULL, CLSCTX_REMOTE_SERVER, &si, 1, &qi);
if( FAILED( hr ) || FAILED(qi.hr) )
{
    return -1;  //连接服务器失败
}

//只要执行到

CoCreateInstanceEx(CLSID_SimpleObject, NULL, CLSCTX_REMOTE_SERVER, &si, 1, &qi);,就会弹出栈溢出。

请问高手指点一下。不胜感激

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-24 23:20
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在你的 C++ 代码中,当你尝试通过 CoCreateInstanceEx 创建一个对象时,它会将当前线程挂起并进入等待状态。这可能导致内存泄漏或其他错误,并且可能会导致堆栈溢出。

    解决方法是避免直接从 CoCreateInstanceEx 函数返回。你应该在 CoCreateInstanceEx 函数的返回值之前处理任何可能的异常或错误,并确保正确释放资源。例如,在你的代码中,你可以添加以下代码来检查和释放资源:

    HRESULT hr = CoCreateInstanceEx(CLSID_SimpleObject, NULL, CLSCTX_REMOTE_SERVER, &si, 1, &qi);
    if (FAILED(hr))
    {
        // 处理创建实例失败的情况
        std::cerr << "Failed to create instance: " << hr << std::endl;
    }
    else
    {
        // 确保释放资源
        si.Dispose();
        qi.Dispose();
    }
    

    这样,即使发生意外情况,也不会导致整个进程崩溃。

    评论

报告相同问题?