无法读取CoTaskMemAlloc分配的结构的内存

时间:2014-09-22 10:33:12

标签: c++ com ole

我有以下问题。

我正在实现一个IDataObject,它负责将文件传递给剪贴板。当我在GetData上调用IDataObject时,它似乎返回一个内存不可读的空STGMEDIUM结构,尽管我可以通过断点确认结构中填充了正确的值。这是我的代码:

调用GetData:

FORMATETC dsl_form={//some FORMATETC};
STGMEDIUM *dsl_med = {0};

HRESULT hr;
hr=dsp_in->GetData(&dsl_form, dsl_med);

GetData-Function:

HRESULT STDMETHODCALLTYPE GetData(FORMATETC *dsp_fmt,STGMEDIUM *dsp_med) {
    int iml_idx=m_lookup_format(dsp_fmt);//Search the FORMATETC-Array for a Format that equals the given Format
    //If no suitable FormatEtc was found, report an error
    if(iml_idx<0){
        return DV_E_FORMATETC;
    }
    //Allocate and fill a new STGMEDIUM structure
    dsp_med=(STGMEDIUM*) CoTaskMemAlloc(sizeof STGMEDIUM);
    dsp_med->tymed=dsc_filedesc[iml_idx].tymed;
    dsp_med->pUnkForRelease=0;
    switch(dsc_filedesc[iml_idx].tymed) {
    case TYMED_HGLOBAL:     dsp_med->hGlobal=m_dup_global_mem(dsc_filecontents[iml_idx].hGlobal);
                            break;
    default:                return DV_E_FORMATETC;
    }

    return S_OK;

1 个答案:

答案 0 :(得分:0)

STGMEDIUM *dsl_med = {0};

HRESULT hr;
hr=dsp_in->GetData(&dsl_form, dsl_med);

将null dsl_med复制到函数参数中,调用的函数会更改传递给它的副本,但原始的null值保持不变,因此调用者端的指针保持为空。

一种选择是更改函数签名,使其接受STGMEDIUM**并相应地更改其余代码。但是在这种情况下 - 实施IDataObject::GetData()时 - 您无法更改签名。如果你阅读MSDN描述,它解释了该函数应该只分配它分配给结构成员的东西,并且调用者必须分配结构并可选择释放其成员。

所以你必须传递结构的地址

STGMEDIUM dsl_med = {0};
object->GetData(&dsl_from, &dsl_med);

并在函数内部设置结构成员。